Пара вещей:
Слой TimeDistributed в Keras требует измерения времени, поэтому для обработки видеоизображения здесь может быть 75 (кадры).
Также ожидается, что изображения будут отправлены в форме (120, 60, 3).Таким образом, слой input_shape TimeDistributed должен быть (75, 120, 160, 3).3 обозначает каналы RGB.Если у вас есть изображения в градациях серого, должно работать 1 в качестве последнего измерения.
Input_shape всегда игнорирует измерение "строки" в ваших примерах, в вашем случае 99.
Для проверки созданных выходных формдля каждого слоя модели, ставьте model.summary()
после компиляции.
См .: https://www.tensorflow.org/api_docs/python/tf/keras/layers/TimeDistributed
Вы можете конвертировать изображения в массивы с формой (X, Y, 3), используя Keras.preprocessing.image.
from keras.preprocessing import image
# loads RGB image as PIL.Image.Image type
img = image.load_img(img_file_path, target_size=(120, 160))
# convert PIL.Image.Image type to 3D tensor with shape (120, 160, 3)
x = image.img_to_array(img)
Обновление : Кажется, причина, по которой вам пришлось сделать квадрат всех изображений (128,128,1), заключается в том, что в model.fit (), обучающие примеры (x_train) и метки (обычно y_train) совпадают.Если вы посмотрите на сводку модели ниже, после слоя Flatten все станет квадратным.Поэтому ожидается, что метки будут квадратными.Это имеет смысл: использование этой модели для прогнозирования приведет к преобразованию (120,160,1) изображения в нечто вроде формы (128, 128, 1).Поэтому изменение модели обучения на приведенный ниже код должно работать:
x_train = random.random((90, 5, 120, 160, 1)) # training data
y_train = random.random((90, 5, 128, 128, 1)) # labels
model.fit(x_train, y_train)
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
time_distributed_1 (TimeDist (None, 5, 120, 160, 64) 320
_________________________________________________________________
time_distributed_2 (TimeDist (None, 5, 60, 80, 64) 0
_________________________________________________________________
time_distributed_3 (TimeDist (None, 5, 60, 80, 32) 18464
_________________________________________________________________
time_distributed_4 (TimeDist (None, 5, 30, 40, 32) 0
_________________________________________________________________
time_distributed_5 (TimeDist (None, 5, 30, 40, 16) 4624
_________________________________________________________________
time_distributed_6 (TimeDist (None, 5, 15, 20, 16) 0
_________________________________________________________________
time_distributed_7 (TimeDist (None, 5, 4800) 0
_________________________________________________________________
lstm_1 (LSTM) (None, 5, 64) 1245440
_________________________________________________________________
time_distributed_8 (TimeDist (None, 5, 8, 8, 1) 0
_________________________________________________________________
time_distributed_9 (TimeDist (None, 5, 16, 16, 1) 0
_________________________________________________________________
time_distributed_10 (TimeDis (None, 5, 16, 16, 16) 160
_________________________________________________________________
time_distributed_11 (TimeDis (None, 5, 32, 32, 16) 0
_________________________________________________________________
time_distributed_12 (TimeDis (None, 5, 32, 32, 32) 4640
_________________________________________________________________
time_distributed_13 (TimeDis (None, 5, 64, 64, 32) 0
_________________________________________________________________
time_distributed_14 (TimeDis (None, 5, 64, 64, 64) 18496
_________________________________________________________________
time_distributed_15 (TimeDis (None, 5, 128, 128, 64) 0
_________________________________________________________________
time_distributed_16 (TimeDis (None, 5, 128, 128, 1) 577
=================================================================
Total params: 1,292,721
Trainable params: 1,292,721
Non-trainable params: 0
Обновление 2 : чтобы оно работало с неквадратными изображениями без изменения y,установите LSTM (300), Reshape (15, 20, 1), и впоследствии вы удалите один из слоев повышения дискретизации Conv2D +.Тогда вы можете использовать картинки с формой (120, 160) даже в автоэнкодере.Хитрость заключается в том, чтобы взглянуть на сводку модели и убедиться, что после LSTM вы начинаете с правильной формы, чтобы после добавления всех остальных слоев конечный результат имел форму (120 160).
model = Sequential()
model.add(
TimeDistributed(Conv2D(64, (2, 2), activation="relu", padding="same"), =(5, 120, 160, 1)))
model.add(TimeDistributed(MaxPooling2D(pool_size=(2, 2))))
model.add(TimeDistributed(Conv2D(32, (3, 3), activation='relu', padding='same')))
model.add(TimeDistributed(MaxPooling2D(pool_size=(2, 2))))
model.add(TimeDistributed(Conv2D(16, (3, 3), activation='relu', padding='same')))
model.add(TimeDistributed(MaxPooling2D(pool_size=(2, 2))))
model.add(TimeDistributed(Flatten()))
model.add(LSTM(units=300, return_sequences=True))
model.add(TimeDistributed(Reshape((15, 20, 1))))
model.add(TimeDistributed(UpSampling2D((2, 2))))
model.add(TimeDistributed(Conv2D(16, (3, 3), activation='relu', padding='same')))
model.add(TimeDistributed(UpSampling2D((2, 2))))
model.add(TimeDistributed(Conv2D(32, (3, 3), activation='relu', padding='same')))
model.add(TimeDistributed(UpSampling2D((2, 2))))
model.add(TimeDistributed(Conv2D(1, (3, 3), padding='same')))
model.compile(optimizer='adam', loss='mse')
model.summary()
x_train = random.random((90, 5, 120, 160, 1))
y_train = random.random((90, 5, 120, 160, 1))
model.fit(x_train, y_train)