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