#python #numpy #tensorflow #keras
#python #numpy #tensorflow #keras
Вопрос:
У меня возникла проблема с созданием моей модели Keras CNN LSTM:
Ошибка значения при проверке целевого объекта: ожидалось, что dense_2 будет иметь 2 измерения, но получен массив с shape ()
Я удалил некоторые слои, чтобы проверить проблему. Но ничего не изменилось.
Справочная информация: я пытаюсь проанализировать 4D-данные: 3D-изображение одномерный временной ряд. Способ, которым я работаю, заключается в добавлении по 1 изображению за раз для анализа моей моделью CNN LSTM. Мне удалось получить правильные размеры и выполнить их в модели. Но затем я столкнулся с ошибкой, указанной выше.
# define CNN model
model = Sequential()
#Layer 1
model.add(TimeDistributed(Conv3D(32, kernel_size=(5, 5, 5), strides=(1, 1, 1),
activation='relu'),
input_shape=input_shape))
model.add(TimeDistributed(MaxPooling3D(pool_size=(2, 2, 2), strides=(2, 2, 2))))
#Layer 2
model.add(TimeDistributed(Conv3D(64, (5, 5, 5), activation='relu')))
model.add(TimeDistributed(MaxPooling3D(pool_size=(2, 2, 2))))
#Layer 3
model.add(TimeDistributed(Conv3D(128, (5, 5, 5), activation='relu')))
model.add(TimeDistributed(MaxPooling3D(pool_size=(2, 2, 2))))
#Flatten
model.add(TimeDistributed(Flatten()))
# LSTM
model.add(LSTM(512, return_sequences=True))
model.add(LSTM(512))
model.add(Dense(1201))
#Dense
model.add(Dense(num_classes, activation='sigmoid'))
#Compile
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
model.summary()
train_gen = generate_images(train_dataset)
model.fit_generator(train_gen, samples_per_epoch=5, nb_epoch=10)
###################################################################
#Data Generator
def generate_images(dataframe):
while True:
sub_dataframe = dataframe.sample(n=1)
batch_input = []
# batch_output = []
# for index, row in sub_dataframe.iterrows(): # iterate through each row
input_path = os.path.join(base_directory, sub_dataframe['Image'].values[0])
img = get_fmri_sequence(input_path)
img = np.expand_dims(img, axis=-1)
batch_input.append(img)
batch_input = np.array(batch_input)
yield (batch_input, sub_dataframe["DX"].values[0])
###################################################################
Вот краткое описание модели:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
time_distributed_1 (TimeDist (None, None, 43, 54, 45, 4032
_________________________________________________________________
time_distributed_2 (TimeDist (None, None, 21, 27, 22, 0
_________________________________________________________________
time_distributed_3 (TimeDist (None, None, 17, 23, 18, 256064
_________________________________________________________________
time_distributed_4 (TimeDist (None, None, 8, 11, 9, 64 0
_________________________________________________________________
time_distributed_5 (TimeDist (None, None, 4, 7, 5, 128 1024128
_________________________________________________________________
time_distributed_6 (TimeDist (None, None, 2, 3, 2, 128 0
_________________________________________________________________
time_distributed_7 (TimeDist (None, None, 1536) 0
_________________________________________________________________
lstm_1 (LSTM) (None, None, 512) 4196352
_________________________________________________________________
lstm_2 (LSTM) (None, 512) 2099200
_________________________________________________________________
dense_1 (Dense) (None, 1201) 616113
_________________________________________________________________
dense_2 (Dense) (None, 2) 2404
=================================================================
Total params: 8,198,293
Trainable params: 8,198,293
Non-trainable params: 0
_________________________________________________________________
Комментарии:
1. метки должны быть вектором, с которым можно сравнивать. не уверен, что это возвращает: sub_dataframe[«DX»].значения [0] . Рассмотрите возможность кодирования их в одно горячее представление.
2. Массив с shape (), вероятно, создается
np.array(object)
выражением, гдеobject
является некоторым не итерируемым объектом. Это скалярный массив 0d, содержащий один элемент, этот объект.3. Большое вам всем спасибо! Код sub_dataframe[«DX»].values[0] извлекал необработанное значение, которое было двоичным представлением класса. Кроме того, в моем плотном слое было 2 узла, когда ему нужен был только 1. Теперь это работает.