#python-3.x #keras #lstm
#python-3.x #keras #lstm
Вопрос:
Моя проблема здесь в том, что я хочу сделать количество входных каналов в python равным размеру фильтров
вот некоторый код из того, что я пробовал
я уже пытался изменить форму, но это выдает мне ту же ошибку .. и поскольку я новичок в python, я не мог понять, как исправить мою ошибку, моя модель заключается в объединении cnn со слоем lstm, и у меня есть 2892 обучающих изображения и 1896 тестовых изображений, всего 4788 изображений, каждое изображение размером 128 * 128
cnn_model = Sequential()
cnn_model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(128,128,3),data_format='channels_last'))
print (cnn_model.output_shape)
cnn_model.add(MaxPooling2D(pool_size=(2, 2)))
print (cnn_model.output_shape)
cnn_model.add(Conv2D(32, (3, 3), activation='relu',data_format='channels_last'))
print (cnn_model.output_shape)
cnn_model.add(MaxPooling2D(pool_size=(2, 2)))
print (cnn_model.output_shape)
cnn_model.add(Conv2D(64, (3, 3), activation='relu',data_format='channels_last'))
print (cnn_model.output_shape)
cnn_model.add(MaxPooling2D(pool_size=(2, 2)))
print (cnn_model.output_shape)
cnn_model.add(Conv2D(128, (3, 3), activation='relu',data_format='channels_last'))
print (cnn_model.output_shape)
cnn_model.add(MaxPooling2D(pool_size=(2, 2)))
print ("MP",cnn_model.output_shape)
cnn_model.add(Flatten())
print (cnn_model.output_shape)
cnn_model.summary()
model = Sequential()
model.add(cnn_model)
print (model.output_shape)
model.add(Reshape((4608,1)))
model.add(LSTM(16,return_sequences=True, dropout=0.5))
print ("LSTM",model.output_shape)
model.add(Dense(1, activation='softmax'))
model.compile(optimizer='adadelta', loss='categorical_crossentropy', metrics=['accuracy'])
model.summary()
X_data = np.array(X_data)
X_datatest = np.array(X_datatest)
model.add(Reshape((-1,128,128,3)))
hist=model.fit(X_data, X_data,epochs=15,batch_size=128,verbose = 2,validation_data=(X_data, X_data))
но это приводит меня к следующей ошибке
Обратная трассировка (последний вызов last): Файл «C:UsersbdyssmDesktopMasterLSTMCNN2.py «, строка 193, в model.add(Изменить форму((2892,1))) Файл «C:UsersbdyssmAppDataLocalProgramsPythonPython35libsite-packageskerasenginesequential.py» строка 181 в файле add output_tensor = layer(self.outputs[0]) «C:UsersbdyssmAppDataLocalProgramsPythonPython35libsite-packageskerasenginebase_layer.py» , строка 474, в файле call output_shape = self.compute_output_shape(входная форма) «C:UsersbdyssmAppDataLocalProgramsPythonPython35libsite-packageskeraslayerscore.py «, строка 398, в файле compute_output_shape input_shape[1:], self.target_shape) «C:UsersbdyssmAppDataLocalProgramsPythonPython35libsite-packageskeraslayerscore.py «, строка 386, в _fix_unknown_dimension ошибка повышения значения (msg) Ошибка значения: общий размер нового массива должен быть неизменным
Ответ №1:
После добавления плотного слоя форма вывода будет такой: (None, 4608, 1)
, так что общий размер будет batch_size * 4608
Но затем вы хотите добавить слой изменения формы, Reshape((-1,128,128,3))
общий размер которого был бы batch_size * 128 * 128 * 3 = batch_size * 49152
Вот в чем ваша проблема.
Комментарии:
1. Итак .. как исправить эту проблему?
2. я добавляю изменение формы, чтобы сделать ее с 4 измерениями, подобными входным данным
3. когда я пытаюсь удалить изменение формы (-1,128,128,3), это выдает мне следующую ошибку «ValueError: ошибка при проверке целевого объекта: ожидалось, что dense_1 будет иметь 3 измерения, но получен массив с формой (2892, 128, 128, 3)»
Ответ №2:
Если ваш первый dense имеет форму 60, то Reshape () должен быть пропорциональным, например, 3,20:
def create_model():
clf = Sequential()
clf.add(Dense(60, input_dim=Input_Dim, activation='relu'))
print('clf.output_shape1: ',clf.output_shape) # clf.output_shape1: (None, 60)
clf.add(Reshape((3,20)))
clf.add(LSTM(LSTM_out, dropout=0.5, recurrent_dropout=0.5))