我有一个模型,通过CNN处理数据,然后输入到LSTM中。但在LSTM阶段之前,我需要重新组织CNN的输出,如下所示:
输入:(600, 512, 1) –(CNN)–> (600, 32)
这个(600, 32)的张量由两个参数k(窗口大小)和s(步长)修改,这两个参数都是整数,它们决定了以下张量的形状(我将这个过程称为’重新批处理’):
重新批处理:(600, 32) –> (146, 20, 32)
这里n_in=600,n_out计算结果为146,k=20,p=0,s=4。
这个新的张量然后可以输入到LSTM中,因为其形状是(批次大小,时间步长,特征),因此模型从那里继续…
我的问题是,我不知道如何在不破坏模型的反向传递的情况下’重新批处理’这个张量。我尝试创建一个空数组 – np.empty(shape_of_lstm_input) – 并迭代地用所需数据填充批次轴的每个元素,但转换为numpy数组时,在尝试最小化损失时会丢失信息,如下面的警告消息所示:
WARNING:tensorflow:Gradients do not exist for variables ['list of all parameters in my CNN'] when minimizing the loss.
因此,我尝试遵循相同的过程,但改用tf.zeros(shape_of_lstm_input),因为我认为这可以解决缺少梯度的问题,但取而代之的是,我得到了以下错误消息:
TypeError: 'tensorflow.python.framework.ops.EagerTensor' object does not support item assignment
有谁知道这个问题是否有解决方案?我不确定反向传递将如何处理前向传递中张量的这种’重新批处理’。
回答:
看起来你正在尝试从你的数据中创建一个滑动窗口。这是获取它的一个简单方法: