如何将输入张量与输出张量结合以创建递归层?

时间:2019-08-27 15:17:44

标签: python tensorflow keras recurrent-neural-network tensor

我正在尝试将计算输出与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].

如何为每个ny生成一个与输入张量具有相同形状的新输出张量,并通过从张量output_ny附加一个元素和从张量输入附加3个元素来构建?

2 个答案:

答案 0 :(得分:0)

Tensorflow“图”是计算的有向无环图。反向传播算法使该图向后移动,而预测则使它向前移动。

我的理解是,您正在尝试将周期引入图表。这是行不通的。

如果从神经网络的基本实现入手,则可以添加自己的循环单元格。

答案 1 :(得分:0)

要串联您的图层,可以使用keras.layers.Concatenate:

outputs = keras.layers.Concatenate(axis=3)(output_list)

因此,如果您打印输出形状,它将得到预期的结果:

> print(outputs.shape)
(?, 1, ?, 8)