Keras 具有三维卷积和卷积LSTM的自动编码器
我在编码器和解码器中实现了一个带有CNN层的可变自动编码器。代码如下所示。我的训练数据(Keras 具有三维卷积和卷积LSTM的自动编码器,keras,conv-neural-network,lstm,keras-layer,autoencoder,Keras,Conv Neural Network,Lstm,Keras Layer,Autoencoder,我在编码器和解码器中实现了一个带有CNN层的可变自动编码器。代码如下所示。我的训练数据(train_X)由40000张大小为64 X 80 X 1的图像组成,我的验证数据(valid_X)由4500张大小为64 X 80 X 1的图像组成 我想通过以下两种方式调整我的网络: 我不使用二维卷积(Conv2D和conv2dtranpse),而是使用三维卷积来考虑时间(作为第三维)。为此,我希望使用10幅图像的切片,即,我将使用大小为64 x 80 x 1 x 10的图像。我可以只使用Conv3D和C
train_X
)由40000张大小为64 X 80 X 1的图像组成,我的验证数据(valid_X
)由4500张大小为64 X 80 X 1的图像组成
我想通过以下两种方式调整我的网络:
非常感谢你的帮助。非常感谢。将您的输入形状设置为
(10,64,80,1)
,只需替换图层即可
如果要使用滑动窗口或只是从(images,64,80,1)
重塑为(images//10,10,64,80,1)
,那么枯燥的部分就是组织输入数据
滑动窗口(重叠)与否?
1-好的。。。。如果希望模型能够理解10幅图像的各个片段,则可以重叠或不重叠。你的选择。重叠可能会更好,但不一定
只要10帧是有序的,图像中就没有真正的顺序
这由Conv3D
和LSTM
以及stateful=False
支持
2-但是如果您想让您的模型理解整个序列,只因为内存而划分序列,那么只有LSTM
和stateful=True
可以支持这一点
(内核大小为(frames,w,h)的Conv3D
将起作用,但仅限于frames
,永远不能理解长度超过frames
的序列。它可能仍然能够检测到准时事件的存在,但不能检测到长序列关系)
在这种情况下,对于LSTM
,您需要:
- 在训练中设置
shuffle=False
- 使用
序列的固定批量大小
- 不重叠图像
- 创建一个手动培训循环,每次为培训和预测提供“新序列”时,您都要在其中执行
建模。重置状态()
循环结构将是:
for epoch in range(epochs):
for group_of_sequences in range(groups):
model.reset_states()
sequences = getAGroupOfCompleteSequences() #shape (sequences, total_length, ....)
for batch in range(slide_divisions):
batch = sequences[:,10*batch : 10*(batch+1)]
model.train_on_batch(batch, ....)
太好了,谢谢。我将创建一个矩阵(images//10,10,64,80,1),例如(4000,10,64,80,1)。我认为对于LSTM来说,顺序也很重要。输入是否由(1,10,64,80,1)、(2,10,64,80,1)、(3,10,64,80,1)等处理?此外,序列中的图像是唯一的还是重叠的?我的意思是,例如seq1=(im1,im2,im3,…,im10)和seq2=(im5,im6,im7,…,im14)。顺序是(:,0,:,:,:,:,:)
,,(:,1,:,:,:,:)
,(:,2,:,,:,:,:,:,:,:,:)
数据组织由您决定。如果你认为每组10幅图像构成可理解的序列,你可以按照你的建议做滑动窗口。你是说重叠还是不重叠的滑动窗口?关于顺序,(:,0,:,:,:,:,,(:,1,:,:,:,,,,,,,,,(:,10,:,,:,,:)是Conv3D或CONVLSM单元内的顺序,但当我使用例如128的批大小时,该批中的顺序是什么?我这样问是因为我有700张图像的序列(形成一个视频),但由于内存限制、训练时间等原因,我不得不将这些序列分割成更小的块(例如10张图像)。当然,当我将700张图像的序列分割成10张图像的块时,它们的消费顺序很重要…请查看答案了解详细信息。非常感谢。我目前正在实施它。假设批量大小为100,序列大小为980。在最后一批中,我只有80张图片。在这种情况下我该怎么办?只是跳过80张图片?
for epoch in range(epochs):
for group_of_sequences in range(groups):
model.reset_states()
sequences = getAGroupOfCompleteSequences() #shape (sequences, total_length, ....)
for batch in range(slide_divisions):
batch = sequences[:,10*batch : 10*(batch+1)]
model.train_on_batch(batch, ....)