【发布时间】:2017-04-28 13:00:16
【问题描述】:
我想构建一个具有以下特性的端到端可训练模型:
- CNN 从图像中提取特征
- 特征被重塑为矩阵
- 然后将该矩阵的每一行输入到 LSTM1
- 然后将该矩阵的每一列馈送到 LSTM2
- LSTM1 和 LSTM2 的输出连接起来作为最终输出
(和本文的图2差不多:https://arxiv.org/pdf/1611.07890.pdf)
我现在的问题是在重塑之后,如何使用 Keras 或 Tensorflow 将特征矩阵的值提供给 LSTM?
这是我目前使用 VGG16 网络的代码(也是Keras issues 的链接):
# VGG16
model = Sequential()
model.add(Conv2D(64, (3, 3), activation='relu', padding='same', input_shape=(224, 224, 3)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
# block 2
model.add(Conv2D(128, (3, 3), activation='relu', padding='same'))
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
# block 3
model.add(Conv2D(256, (3, 3), activation='relu', padding='same'))
model.add(Conv2D(256, (3, 3), activation='relu'))
model.add(Conv2D(256, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
# block 4
model.add(Conv2D(512, (3, 3), activation='relu', padding='same'))
model.add(Conv2D(512, (3, 3), activation='relu'))
model.add(Conv2D(512, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
# block 5
model.add(Conv2D(512, (3, 3), activation='relu', padding='same'))
model.add(Conv2D(512, (3, 3), activation='relu'))
model.add(Conv2D(512, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
# block 6
model.add(Flatten())
model.add(Dense(4096, activation='relu'))
model.add(Dense(4096, activation='relu'))
# reshape the feature 4096 = 64 * 64
model.add(Reshape((64, 64)))
# How to feed each row of this to LSTM?
# This is my first solution but it doesn’t look correct:
# model.add(LSTM(256, input_shape=(64, 1))) # 256 hidden units, sequence length = 64, feature dim = 1
【问题讨论】:
-
这行得通吗?
标签: tensorflow keras lstm