Keras 具有三维卷积和卷积LSTM的自动编码器

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

我在编码器和解码器中实现了一个带有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和Conv3DTranspose吗?或者是否需要进行其他更改

  • 我想在编码器和解码器中试用卷积LSTM(ConvLSTM2D),而不是普通的2D卷积。同样,图像的输入大小为64 x 80 x 1 x 10(即10幅图像的时间序列)。如何调整我的网络以与ConvLSTM2D配合使用


  • 非常感谢你的帮助。非常感谢。

    将您的输入形状设置为
    (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, ....)