Ошибка, связанная с количеством входных тензоров в Keras

#python #tensorflow #keras #gdal

Вопрос:

Я ввожу серию изображений в оттенках серого float32 в виде списка с 16*16 формой на python и пытаюсь выполнить задачу регрессии с метками, введенными из фрейма данных Pandas.

Вот форма изображений и df:

 print(np.shape(images))
(2000, 16, 16)

print(np.shape(df))
(2000, 1)
 

Я использовал train_test_split from sklearn для разделения данных для обучения и тестирования:

 print (np.shape(trainY),np.shape(testY),np.shape(trainX),np.shape(testX))
(1700, 1) (300, 1) (1700, 16, 16) (300, 16, 16)
 

Я использую следующую модель для прогнозирования, но model.fit возвращаю ошибку и не запускаю обучение.

 model = models.Sequential()
model.add(layers.Dense(512, activation='relu', input_shape=(16 * 16 * 1,)))
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='linear'))

model.compile(optimizer='adam',
              loss='mean_squared_error',
              metrics=['mae'])

history = model.fit(trainX, trainY, epochs=50, validation_split=.2, batch_size=128,verbose=1)
 

 ValueError: Layer sequential_18 expects 1 input(s), but it received 1700 input tensors
 

Я также тестировал trainX = np.expand_dims(trainX, -1) раньше model.fit , но это все равно дает еще одну ошибку. Кто-нибудь может помочь мне решить эту проблему?

 ValueError: Input 0 of layer sequential_18 is incompatible with the layer: expected axis -1 of input shape to have value 256 but received input with shape (None, 16, 16, 1)
 

Ответ №1:

Ваши следующие слои просты Dense , поэтому добавление Flatten слоя в верхней части вашей сети выполняет эту работу (нет необходимости дополнительно манипулировать входными изображениями).

 trainX = np.random.uniform(0,1, (1700, 16, 16))
trainY = np.random.uniform(0,1, (1700, 1))

model = models.Sequential()
model.add(layers.Flatten(input_shape=(16,16)))
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1, activation='linear'))

model.compile(optimizer='adam',
              loss='mean_squared_error',
              metrics=['mae'])

history = model.fit(trainX, trainY, epochs=50, 
                    validation_split=.2, batch_size=128, verbose=1)
 

Обратите внимание также на то, чтобы правильно манипулировать своими изображениями…

Изображения хранятся в списке массивов. Вы должны преобразовать список в единый массив фигур (n_sample, 16, 16) .

Это можно сделать просто:

 images = np.asarray(images)