我正在尝试预测下一张图片。因此,我使用的是Conv2D和LSTM而不是ConvLSTM2D。原因是我想成为一个初学者,所以要了解每个步骤。我的问题是: 1)我想编写一个生成器方法,该方法将返回X和y。我认为X的形状将是(样本数,时间步长,高度,宽度,通道),但是我不确定y的形状。 (例如,如果要从数据集中预测温度,则在生成器方法中,X的形状将为(样本数,时间步长,特征数),而y的形状将为(样本数)。 ) 2)在网络体系结构中,最初(在Con2D部分中)输入形状将是5D张量(样本数,时间步长,高度,宽度,通道)。然后在LSTM部分中,输入形状将是3D张量(样本数,时间步长,高度宽度通道)。在预测图像时,是否应该在LSTM的末尾使用Reshape(高度,宽度,通道)? 这是我的代码:
model = Sequential()
model.add(TimeDistributed(Convolution2D(128, (5, 5)), input_shape=(None, 512, 512, 1)))
model.add(Activation('relu'))
model.add(TimeDistributed(MaxPooling2D(pool_size=(2, 2))))
model.add(TimeDistributed(Convolution2D(128, (5, 5))))
model.add(Activation('relu'))
model.add(TimeDistributed(MaxPooling2D(pool_size=(2, 2))))
model.add(TimeDistributed(Convolution2D(256, (5, 5))))
model.add(Activation('relu'))
model.add(TimeDistributed(MaxPooling2D(pool_size=(2, 2))))
model.add(TimeDistributed(Convolution2D(256, (5, 5))))
model.add(Activation('relu'))
model.add(TimeDistributed(MaxPooling2D(pool_size=(2, 2))))
model.add(TimeDistributed(Convolution2D(512, (5, 5))))
model.add(Activation('relu'))
model.add(TimeDistributed(MaxPooling2D(pool_size=(2, 2))))
model.add(TimeDistributed(Convolution2D(512, (5, 5))))
model.add(Activation('relu'))
model.add(TimeDistributed(MaxPooling2D(pool_size=(2, 2))))
model.add(TimeDistributed(Convolution2D(512, (3, 3))))
model.add(Activation('relu'))
model.add(TimeDistributed(MaxPooling2D(pool_size=(2, 2))))
model.add(TimeDistributed(Flatten()))
model.add(LSTM(units=512, activation='tanh', return_sequences=True))
model.add(Dense(262144, activation='linear'))
model.add(TimeDistributed(Reshape((512,512,1))))
model.summary()
def generator(data, lookback, delay, min_index, max_index,
shuffle=False, batch_size=128, step=6):
if max_index is None:
max_index = len(data) - delay - 1
i = min_index + lookback
while 1:
if shuffle:
rows = np.random.randint(
min_index + lookback, max_index, size=batch_size)
else:
if i + batch_size >= max_index:
i = min_index + lookback
rows = np.arange(i, min(i + batch_size, max_index))
i += len(rows)
samples = np.zeros((len(rows), lookback // step, data.shape[1], data.shape[2], data.shape[3]))
targets = np.zeros((len(rows), 1, data.shape[1], data.shape[2], data.shape[3]))
for j, row in enumerate(rows):
indices = range(rows[j] - lookback, rows[j], step)
samples[j] = data[indices]
targets[j] = data[rows[j] + delay]
yield samples, targets
lookback = 3
step = 1
delay = 1
batch_size = 2
train_gen = generator(image_dataset,
lookback=lookback,
delay=delay,
min_index=0,
max_index=19,
shuffle=False,
step=step,
batch_size=batch_size)
val_gen = generator(image_dataset,
lookback=lookback,
delay=delay,
min_index=20,
max_index=29,
step=step,
batch_size=batch_size)
val_steps = (29 - 20 - lookback) // batch_size
model.compile(optimizer=RMSprop(lr = 0.001), loss='mae')
history = model.fit_generator(train_gen,
steps_per_epoch=10,
epochs=5,
validation_data=val_gen,
validation_steps=val_steps)
谢谢!