堆叠卷积网络和循环层
Stacking convolutional network and recurrent layer
我正在研究视频序列的分类器。它应该在输入和输出标签上采用几个视频帧,0 或 1。因此,它是一个多对一网络。
我已经有了一个单帧分类器。该分类器与 Conv2D
进行多次卷积,然后应用 GlobalAveragePooling2D
。这导致长度为 64 的 1D 向量。然后原始的每帧分类器有一个具有 softmax 激活的 Dence
层。
现在我想扩展这个分类器来处理序列。理想情况下,序列的长度应该不同,但现在我将长度固定为 4。
为了扩展我的分类器,我将用 1 个单元的 LSTM 层替换 Dense
。因此,我的目标是让 LSTM 层逐个获取几个长度为 64 的一维向量,并输出一个标签。
示意图,我现在有:
input(99, 99, 3) - [convolutions] - features(1, 64) - [Dense] - [softmax] - label(1, 2)
所需架构:
4x { input(99, 99, 3) - [convolutions] - features(1, 64) } - [LSTM] - label(1, 2)
我不知道如何用 Keras 做到这一点。
这是我的卷积代码
from keras.layers import Conv2D, BatchNormalization, GlobalAveragePooling2D, \
LSTM, TimeDistributed
IMAGE_WIDTH=99
IMAGE_HEIGHT=99
IMAGE_CHANNELS=3
convolutional_layers = Sequential([
Conv2D(input_shape=(IMAGE_WIDTH, IMAGE_HEIGHT, IMAGE_CHANNELS),
filters=6, kernel_size=(3, 3), strides=(2, 2), activation='relu',
name='conv1'),
BatchNormalization(),
Conv2D(filters=64, kernel_size=(1, 1), strides=(1, 1), activation='relu',
name='conv5_pixel'),
BatchNormalization(),
GlobalAveragePooling2D(name='avg_pool6'),
])
摘要如下:
In [24]: convolutional_layers.summary()
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv1 (Conv2D) (None, 49, 49, 6) 168
_________________________________________________________________
batch_normalization_3 (Batch (None, 49, 49, 6) 24
_________________________________________________________________
conv5_pixel (Conv2D) (None, 49, 49, 64) 448
_________________________________________________________________
batch_normalization_4 (Batch (None, 49, 49, 64) 256
_________________________________________________________________
avg_pool6 (GlobalAveragePool (None, 64) 0
=================================================================
Total params: 896
Trainable params: 756
Non-trainable params: 140
现在我想要一个循环层来处理这些 64 维向量的序列并为每个序列输出一个标签。
我在手册中读到 TimeDistributed
层将其输入层应用于输入数据的每个时间片。
我继续我的代码:
FRAME_NUMBER = 4
td = TimeDistributed(convolutional_layers, input_shape=(FRAME_NUMBER, 64))
model = Sequential([
td,
LSTM(units=1)
])
结果异常IndexError: list index out of range
的相同例外
td = TimeDistributed(convolutional_layers, input_shape=(None, FRAME_NUMBER, 64))
我做错了什么?
扩展对答案的评论; TimeDistributed 层将给定层应用于输入的每个 时间步 。因此,您的 TimeDistributed 将应用于提供输入 shape=(F_NUM, W, H, C)
的每一帧。将卷积应用到每个图像后,你会得到 (F_NUM, 64)
这是每一帧的特征。
我正在研究视频序列的分类器。它应该在输入和输出标签上采用几个视频帧,0 或 1。因此,它是一个多对一网络。
我已经有了一个单帧分类器。该分类器与 Conv2D
进行多次卷积,然后应用 GlobalAveragePooling2D
。这导致长度为 64 的 1D 向量。然后原始的每帧分类器有一个具有 softmax 激活的 Dence
层。
现在我想扩展这个分类器来处理序列。理想情况下,序列的长度应该不同,但现在我将长度固定为 4。
为了扩展我的分类器,我将用 1 个单元的 LSTM 层替换 Dense
。因此,我的目标是让 LSTM 层逐个获取几个长度为 64 的一维向量,并输出一个标签。
示意图,我现在有:
input(99, 99, 3) - [convolutions] - features(1, 64) - [Dense] - [softmax] - label(1, 2)
所需架构:
4x { input(99, 99, 3) - [convolutions] - features(1, 64) } - [LSTM] - label(1, 2)
我不知道如何用 Keras 做到这一点。
这是我的卷积代码
from keras.layers import Conv2D, BatchNormalization, GlobalAveragePooling2D, \
LSTM, TimeDistributed
IMAGE_WIDTH=99
IMAGE_HEIGHT=99
IMAGE_CHANNELS=3
convolutional_layers = Sequential([
Conv2D(input_shape=(IMAGE_WIDTH, IMAGE_HEIGHT, IMAGE_CHANNELS),
filters=6, kernel_size=(3, 3), strides=(2, 2), activation='relu',
name='conv1'),
BatchNormalization(),
Conv2D(filters=64, kernel_size=(1, 1), strides=(1, 1), activation='relu',
name='conv5_pixel'),
BatchNormalization(),
GlobalAveragePooling2D(name='avg_pool6'),
])
摘要如下:
In [24]: convolutional_layers.summary()
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv1 (Conv2D) (None, 49, 49, 6) 168
_________________________________________________________________
batch_normalization_3 (Batch (None, 49, 49, 6) 24
_________________________________________________________________
conv5_pixel (Conv2D) (None, 49, 49, 64) 448
_________________________________________________________________
batch_normalization_4 (Batch (None, 49, 49, 64) 256
_________________________________________________________________
avg_pool6 (GlobalAveragePool (None, 64) 0
=================================================================
Total params: 896
Trainable params: 756
Non-trainable params: 140
现在我想要一个循环层来处理这些 64 维向量的序列并为每个序列输出一个标签。
我在手册中读到 TimeDistributed
层将其输入层应用于输入数据的每个时间片。
我继续我的代码:
FRAME_NUMBER = 4
td = TimeDistributed(convolutional_layers, input_shape=(FRAME_NUMBER, 64))
model = Sequential([
td,
LSTM(units=1)
])
结果异常IndexError: list index out of range
td = TimeDistributed(convolutional_layers, input_shape=(None, FRAME_NUMBER, 64))
我做错了什么?
扩展对答案的评论; TimeDistributed 层将给定层应用于输入的每个 时间步 。因此,您的 TimeDistributed 将应用于提供输入 shape=(F_NUM, W, H, C)
的每一帧。将卷积应用到每个图像后,你会得到 (F_NUM, 64)
这是每一帧的特征。