【发布时间】:2019-09-27 16:23:27
【问题描述】:
我正在尝试使用带有 Keras 的 CNN-LSTM 网络来分析视频。我阅读了它并遇到了TimeDistributed 函数和一些示例。
实际上,我尝试了下面描述的网络,它实际上是由卷积层和池化层,然后是循环层和密集层组成。
model = Sequential()
model.add(TimeDistributed(Conv2D(2, (2,2), activation= 'relu' ), input_shape=(None, IMG_SIZE, IMG_SIZE, 3)))
model.add(TimeDistributed(MaxPooling2D(pool_size=(2, 2))))
model.add(TimeDistributed(Flatten()))
model.add(LSTM(50))
model.add(Dense(50, activation = 'softmax'))
model.compile(loss = 'categorical_crossentropy' , optimizer = 'adam' , metrics = ['acc'])
我没有正确测试模型,因为我的数据集太小。然而,在训练过程中,网络在 4-5 个 epoch 内达到 accuracy 0.98(可能是过度拟合,但现在还不是问题,因为我希望以后能得到一个合适的数据集)。
然后,我阅读了如何使用预训练的卷积网络(MobileNet、ResNet 或 Inception)作为 LSTM 网络的特征提取器,因此我使用了以下代码:
inputs = Input(shape = (frames, IMG_SIZE, IMG_SIZE, 3))
cnn_base = InceptionV3(include_top = False, weights='imagenet', input_shape = (IMG_SIZE, IMG_SIZE, 3))
cnn_out = GlobalAveragePooling2D()(cnn_base.output)
cnn = Model(inputs=cnn_base.input, outputs=cnn_out)
encoded_frames = TimeDistributed(cnn)(inputs)
encoded_sequence = LSTM(256)(encoded_frames)
hidden_layer = Dense(1024, activation="relu")(encoded_sequence)
outputs = Dense(50, activation="softmax")(hidden_layer)
model = Model([inputs], outputs)
在这种情况下,在训练模型时,它总是显示准确度 ~0.02(它是基线的 1/50)。
由于第一个模型至少学到了任何东西,我想知道在第二种情况下网络的构建方式是否有任何错误。
有人遇到过这种情况吗?有什么建议吗?
谢谢。
【问题讨论】:
-
由于您的数据集较小,您应该尝试冻结 InceptionV3 的某些层。剩下的层将学习这些特征并产生更好的准确性。
标签: tensorflow keras conv-neural-network recurrent-neural-network