0

두 개의 순차 모델을 작성하려고합니다. 각 모델은 서로 다른 데이터 세트 (서로 다른 이미지 세트)로 작성되었습니다. 그런 다음 출력물의 평균을 취하고 softmax 레이어를 추가하여 두 개의 순차 모델을 기반으로 한 단일 분류 출력을 제공하고 싶습니다. 내 코드는 아래에 있지만 '순차적'개체에 'get_shape'특성이 없다는 특성 오류가 발생합니다.AttributeError : 모델을 병합 할 때 '순차적'속성 '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 : 병합 = 평균 ([modelo, modelN1]) – Deya

답변

3

순차적 모델을 결합하는 텐서하지 이상 average 일부터 Keras 2.0 에서 작동하지 않는 것의이 방법.

따라서 Sequential 모델에없는 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 

해키 방법이 두 모델의 출력을 결합하고이 softmax 층을 수행 할 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

다행스럽게도 keras doc에 대한 유용한 자습서가 있습니다. 여기 링크는 https://keras.io/getting-started/functional-api-guide/입니다. 나는 또한 대답으로 연결했다. 이 답변이 다른 사람들을 도울 수 있도록 그것을 받아 들일 수 있도록 도와 주었다면 – putonspectacles

+0

keras 문서와 함께이 링크는 keras 모델을 만들고, 모델에 가입하고, 모델의 일부만을 교육하는 등의 방법을 이해하는데 많은 도움이되었습니다. http : //www.kdnuggets.com/2016/07/mnist-generative-adversarial-model-keras.html –

관련 문제