如何将输入与输出张量结合起来创建循环层?
How to combine input with output tensors to create a recurrent layer?
我正在尝试将使用 ny 输出计算输出的层更改为计算循环输出的层,以便输出具有与输入相同的形状。例如,考虑以下
nt = 1000
nx_in = 8
ny = 2
x_train = np.array(shape=(nt, nx_in))
input = keras.Input(shape=(1, None, x_train.shape[1]), name='x_input')
output_ny = layers.Dense(ny)(x_input)
以上生成了预期的结果。现在我想通过生成一个新的输出张量来创建一个循环层,该输出张量与输入张量具有相同的形状,并且是通过从张量 output_ny 和 (nx_in/ny-1) 或 3 中获取一个值来创建的, 来自张量输入的值
print('x_input.shape: ', x_input.shape)
print('ny_output.shape:', ny_output.shape)
print('max_lag: ', max_lag)
output_list = list()
ky_start = 0
max_lag = 5
stored_lags = max_lag - 1
for iy in range(ny):
ky_end = ky_start + stored_lags - 1
print('append output, {}:{}'.format(iy, iy+1))
output_list.append(ny_output[:, :, :, iy:(iy+1)])
print('append input, {}:{}'.format(ky_start, ky_end))
output_list.append(x_input[:, :, :, ky_start:ky_end])
ky_start = ky_end + 1
outputs = tf.unstack(output_list, axis=3)
打印输出为
x_input.shape: (?, 1, ?, 8)
ny_output.shape: (?, 1, ?, 2)
max_lag: 5
append output, 0:1
append input, 0:3
append output, 1:2
append input, 4:7
这会生成以下错误消息
ValueError: Dimension 3 in both shapes must be equal, but are 1 and 3. Shapes are [?,1,?,1] and [?,1,?,3].
From merging shape 2 with other shapes. for 'packed' (op: 'Pack') with input shapes: [?,1,?,1], [?,1,?,3], [?,1,?,1], [?,1,?,3].
如何生成一个新的输出张量,该张量与输入张量具有相同的形状,并且是通过从张量 output_ny 中附加一个元素和从张量输入中附加 3 个元素来构建的,对于每个 ny?
Tensorflow "graph" 是一种有向无环计算图。反向传播算法向后走这个图,而预测向前走。
我的理解是你试图在图中引入一个循环。这行不通。
如果您从神经网络的基本实现开始,您可以添加自己的循环单元。
要连接图层,您可以使用 keras.layers.Concatenate:
outputs = keras.layers.Concatenate(axis=3)(output_list)
因此,如果您打印输出形状,它会给出预期的结果:
> print(outputs.shape)
(?, 1, ?, 8)
我正在尝试将使用 ny 输出计算输出的层更改为计算循环输出的层,以便输出具有与输入相同的形状。例如,考虑以下
nt = 1000
nx_in = 8
ny = 2
x_train = np.array(shape=(nt, nx_in))
input = keras.Input(shape=(1, None, x_train.shape[1]), name='x_input')
output_ny = layers.Dense(ny)(x_input)
以上生成了预期的结果。现在我想通过生成一个新的输出张量来创建一个循环层,该输出张量与输入张量具有相同的形状,并且是通过从张量 output_ny 和 (nx_in/ny-1) 或 3 中获取一个值来创建的, 来自张量输入的值
print('x_input.shape: ', x_input.shape)
print('ny_output.shape:', ny_output.shape)
print('max_lag: ', max_lag)
output_list = list()
ky_start = 0
max_lag = 5
stored_lags = max_lag - 1
for iy in range(ny):
ky_end = ky_start + stored_lags - 1
print('append output, {}:{}'.format(iy, iy+1))
output_list.append(ny_output[:, :, :, iy:(iy+1)])
print('append input, {}:{}'.format(ky_start, ky_end))
output_list.append(x_input[:, :, :, ky_start:ky_end])
ky_start = ky_end + 1
outputs = tf.unstack(output_list, axis=3)
打印输出为
x_input.shape: (?, 1, ?, 8)
ny_output.shape: (?, 1, ?, 2)
max_lag: 5
append output, 0:1
append input, 0:3
append output, 1:2
append input, 4:7
这会生成以下错误消息
ValueError: Dimension 3 in both shapes must be equal, but are 1 and 3. Shapes are [?,1,?,1] and [?,1,?,3].
From merging shape 2 with other shapes. for 'packed' (op: 'Pack') with input shapes: [?,1,?,1], [?,1,?,3], [?,1,?,1], [?,1,?,3].
如何生成一个新的输出张量,该张量与输入张量具有相同的形状,并且是通过从张量 output_ny 中附加一个元素和从张量输入中附加 3 个元素来构建的,对于每个 ny?
Tensorflow "graph" 是一种有向无环计算图。反向传播算法向后走这个图,而预测向前走。
我的理解是你试图在图中引入一个循环。这行不通。
如果您从神经网络的基本实现开始,您可以添加自己的循环单元。
要连接图层,您可以使用 keras.layers.Concatenate:
outputs = keras.layers.Concatenate(axis=3)(output_list)
因此,如果您打印输出形状,它会给出预期的结果:
> print(outputs.shape)
(?, 1, ?, 8)