0

2つのシーケンシャルモデルを作成しようとしています。次に、出力の平均値を取って、softmaxレイヤーを追加して、2つのシーケンシャルモデルに基づいて1つの分類結果を出力したいと考えています。私のコードは以下ですが、 'Sequential'オブジェクトには属性 'get_shape'がないという属性エラーが発生します。AttributeError:モデルをマージする際に 'Sequential'属性 'get_shape'がありません

完全なエラーコードは次のとおりです。

Traceback (most recent call last): 
    File "Mergedmodels.pyu", line 135, in <module> 
    merged = average ([modelo, modelN1]) 
    File "G:\Anaconda\lib\site-packages\keras\layers\merge.py", line 481, in average 
    return Average(**kwargs)(inputs) 
    File "G:\Anaconda\lib\site-packages\keras\engine\topology.py", line 542, in _ call_input_shapes.append(K.int_sshape(x_elem)) 
    File "G:\Anaconda\lib\site-packages\keras\backend\tensorflow_backend.py", line 411, in int_shape 
    shape = x.get_shape() 
    AttributeError: 'Sequential' object has no attribute 'get_shape' 

それを修正する方法上の任意のアイデア?

import numpy as np 
from keras.models import Sequential 
from keras.layers import Dense, Dropout, Activation, Flatten 
from keras.layers import merge 
from keras.layers import average 
from keras.layers import Convolution2D, MaxPooling2D 
from keras.utils import np_utils 
from keras.preprocessing.image import ImageDataGenerator 
from keras.datasets import mnist 
import pandas as pd 
from numpy import array 
from PIL import Image 
import matplotlib.pyplot as plt 
from keras import backend as K 
import glob 
import os 

K.set_image_dim_ordering('th') 


np.random.seed(123) #set for reproducibility 

size = 48, 48 

#IMPORTING TRAINING IMAGES FOR FIRST MODEL (ORIGINAL) 
folder = 'images' 

read = lambda imname: np.asarray(Image.open(imname).convert("RGB")) 

ims = [read(os.path.join(folder, filename)) for filename in os.listdir(folder)] 
X_train = np.array([read(os.path.join(folder, filename)) for filename in os.listdir(folder)], dtype='uint8') 
#CHECK print (X_train.shape) 

X_train = X_train.reshape(X_train.shape[0],3,48,48) 
#X_test = X_test.reshape(X_test.shape[0],1,28,28) 
X_train = X_train.astype ('float32') 
#X_test = X_test.astype ('float32') 
X_train /= 255 
#X_test /= 255 

#IMPORTING TRAINING IMAGES FOR SECOND MODEL (NORMALIZED) 
folder = 'images2' 

read = lambda imname: np.asarray(Image.open(imname).convert("RGB")) 

ims = [read(os.path.join(folder, filename)) for filename in os.listdir(folder)] 
X_training = np.array([read(os.path.join(folder, filename)) for filename in os.listdir(folder)], dtype='uint8') 
#CHECK print (X_train.shape) 

X_training = X_training.reshape(X_train.shape[0],3,48,48) 
#X_test = X_test.reshape(X_test.shape[0],1,28,28) 
X_training = X_training.astype ('float32') 
#X_test = X_test.astype ('float32') 
X_training /= 255 
#X_test /= 255 


#IMPORTING LABELS FOR 10K TRAINING IMAGES 
saved_column = pd.read_csv('labels4.csv') 

y_labels = array(saved_column) 

Y_train = np_utils.to_categorical(y_labels,501) 

#y_train = np.array ([0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1]) 
#(X_train, y_train),(X_test, y_test) = mnist.load_data() 

#COPYING LABELS FOR SECOND MODEL TRAINING IMAGES 
#Y_training = Y_train 

#IMPORTING TEST IMAGES 
folder2 = 'test' 
read = lambda imname: np.asarray(Image.open(imname).convert("RGB")) 
ims = [read(os.path.join(folder2, filename)) for filename in os.listdir(folder2)] 
X_test = np.array([read(os.path.join(folder2, filename)) for filename in os.listdir(folder2)], dtype='uint8') 

X_test = X_test.reshape(X_test.shape[0],3,48,48) 
X_test = X_test.astype ('float32') 
X_test /= 255 

#IMPORTING LABELS FOR TEST IMAGES 
another_column = pd.read_csv('labelstest4.csv') 
test_labels = array(another_column) 
Y_test = np_utils.to_categorical(test_labels,501) 
#train_labels = np.array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]) 
#Y_train = np_utils.to_categorical(y_train, 2) 
#Y_test = np_utils.to_categorical(y_test,10) 


#BUILDING FIRST NN FOR ORIGINAL IMAGES 
modelo = Sequential() 

modelo.add(Convolution2D(32,3,3, activation='relu', input_shape=(3,48,48), dim_ordering='th')) 
modelo.add(Convolution2D(32,3,3, activation = 'relu')) 
modelo.add(MaxPooling2D(pool_size=(2,2))) 
modelo.add(Dropout(0.25)) 

modelo.add(Flatten()) 
modelo.add(Dense(128,activation='relu')) 
modelo.add(Dropout(0.5)) 
modelo.add(Dense(501, activation = 'sigmoid')) 

modelo.compile(loss='categorical_crossentropy', 
    optimizer = 'adam', 
    metrics = ['accuracy']) 

modelo.fit(X_train, Y_train, 
    batch_size = 5, nb_epoch= 5, verbose = 1) 

score = modelo.evaluate(X_test, Y_test, verbose=0) 

#BUILDING SECOND NN FOR NORMALIZED IMAGES 
modelN1 = Sequential() 

modelN1.add(Convolution2D(32,3,3, activation='relu', input_shape=(3,48,48), dim_ordering='th')) 
modelN1.add(Convolution2D(32,3,3, activation = 'relu')) 
modelN1.add(MaxPooling2D(pool_size=(2,2))) 
modelN1.add(Dropout(0.25)) 

modelN1.add(Flatten()) 
modelN1.add(Dense(128,activation='relu')) 
modelN1.add(Dropout(0.5)) 
modelN1.add(Dense(501, activation = 'sigmoid')) 

modelN1.compile(loss='categorical_crossentropy', 
    optimizer = 'adam', 
    metrics = ['accuracy']) 

modelN1.fit(X_training, Y_train, 
    batch_size = 5, nb_epoch= 1, verbose = 1) 

score = modelN1.evaluate(X_test, Y_test, verbose=0) 

#MERGING MODELS 
merged = average([modelo, modelN1]) 

finalmodel = Sequential() 
finalmodel.add(merged) 
finalmodel.add(Dense(501, activation = 'softmax')) 

finalmodel.compile(loss='categorical_crossentropy', 
    optimizer = 'adam', 
    metrics = ['accuracy']) 

Y_madeuplabels = np.array ([0, 1, 52, 20]) 
Y_training = np_utils.to_categorical(Y_madeuplabels, 501) 


finalmodel.fit([X_train], Y_training, 
    batch_size = 5, nb_epoch= 1, verbose = 1) 

score = finalmodel.evaluate(X_test, Y_test, verbose=0) 

print ("the code ran") 
+0

属性エラーはどの行にスローされますか? – DrBwts

+0

行135:merged = average([modelo、modelN1]) – Deya

答えて

3

シーケンシャルモデルを組み合わせるこの方法はテンソルないオーバーaverage作品以来Keras 2.0 で動作するようには思えません。

したがって、シーケンシャルモデルには、get_shape()の方法がないというエラーメッセージが表示されます。 get_shape()はTensorsにのみ存在します。ここで

はエラーを複製例です。これを回避するために

mod1 = Sequential() 
mod1.add(Dense(1, input_shape=(10,))) 

mod2 = Sequential() 
mod2.add(Dense(1, input_shape=(10,))) 

avg = average([mod1, mod2]) # throws AttributeError 

ハック方法は、二つのモデルの 出力を結合して、ソフトマックス層を行うためにfunctional APIを使用することです。例として:

X1 = np.random.rand(10, 10) 
X2 = np.random.rand(10, 10) 
Y = np.random.choice(2, 10) 

mod1 = Sequential() 
mod1.add(Dense(16, input_shape=(10,))) 

mod2 = Sequential() 
mod2.add(Dense(16, input_shape=(10,))) 

# so use the outputs of the models to do the average over 
# this way we do averaging over tensor __not__ models. 
avg = average([mod1.output, mod2.output]) 
dense = Dense(1, activation="sigmoid")(avg) 

# the two inputs are the inputs to the sequential models 
# and the output is the dense layer 
mod3 = Model(inputs=[mod1.input, mod2.input], outputs=[dense]) 
mod3.compile(loss='binary_crossentropy', optimizer='sgd') 
mod3.fit([X1, X2], Y) 
+0

ありがとう!機能的なAPIを使用するための良いチュートリアルを教えてください - 私はまだそれを使用していません。 – Deya

+0

うれしいことに、私は助けてくれるかもしれません。ケラスの文書には良いチュートリアルがあります。ここにリンクhttps://keras.io/getting-started/functional-api-guide/があります。私はその答えにもリンクしています。この回答があなたを助けて他人を助けることができるように受け入れることを助けたら – putonspectacles

+0

kerasのドキュメントとともに、このリンクはケラスのモデルを作成する方法、モデルに参加する方法、モデルの一部のみをトレーニングする方法などを理解するのに役立ちました。http: //www.kdnuggets.com/2016/07/mnist-generative-adversarial-model-keras.html –

関連する問題