gpt4 book ai didi

python - 如何在 Tensorflow 中重新批处理张量?

转载 作者:行者123 更新时间:2023-12-04 09:36:28 25 4
gpt4 key购买 nike

我有一个模型可以将数据通过 CNN 传递到 LSTM。但是在LSTM阶段之前我必须重新组织CNN的输出,如下:
输入:(600, 512, 1) --(CNN)--> (600, 32)
这个 (600, 32) 张量由两个参数 k(窗口大小)和 s(步长)修改,这两个参数都是整数,它们控制以下张量的形状(我将称该过程为“重新批处理”):
重新批处理:(600, 32) --> (146, 20, 32)
这些维度是使用感受野方程从 k 和 s 获得的:
Receptive Field Equation
这里 n_in=600,n_out 计算为 146,k=20,p=0,s=4。
这个新的张量然后可以输入到 LSTM 中,因为形状是 (batch_size, timesteps, features),所以模型从那里继续......

我的问题是我不知道如何在不破坏模型的向后传递的情况下“重新批处理”这个张量。我尝试创建一个空数组 - 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
有谁知道是否存在解决此问题的方法?我不确定反向传递将如何处理正向传递中张量的这种“重新批处理”。

最佳答案

似乎您正在尝试从数据中创建一个滑动窗口。这是获得它的一种简单方法:

import tensorflow as tf

def sliding_window(x, window_size, stride, axis=0):
n_in = tf.shape(x)[axis]
n_out = (n_in - window_size) // stride + 1
# Just in case n_in < window_size
n_out = tf.math.maximum(n_out, 0)
r = tf.expand_dims(tf.range(n_out), 1)
idx = r * stride + tf.range(window_size)
return tf.gather(x, idx, axis=axis)

# Test
x = tf.reshape(tf.range(30), [10, 3])
print(x.numpy())
# [[ 0 1 2]
# [ 3 4 5]
# [ 6 7 8]
# [ 9 10 11]
# [12 13 14]
# [15 16 17]
# [18 19 20]
# [21 22 23]
# [24 25 26]
# [27 28 29]]
y = sliding_window(x, 4, 2)
print(y.numpy())
# [[[ 0 1 2]
# [ 3 4 5]
# [ 6 7 8]
# [ 9 10 11]]
#
# [[ 6 7 8]
# [ 9 10 11]
# [12 13 14]
# [15 16 17]]
#
# [[12 13 14]
# [15 16 17]
# [18 19 20]
# [21 22 23]]
#
# [[18 19 20]
# [21 22 23]
# [24 25 26]
# [27 28 29]]]

关于python - 如何在 Tensorflow 中重新批处理张量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62558696/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com