Существует ли метод изменения формы для исправления размера массива?

#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))