了解Conv2D和LSTM

时间:2018-08-03 16:57:48

标签: python keras deep-learning conv-neural-network lstm

我正在尝试预测下一张图片。因此,我使用的是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)

谢谢!

0 个答案:

没有答案