在 Tensorflow 中训练行编码器和列编码器

问题描述 投票:0回答:1

我正在尝试创建一个具有 2 个编码器和 1 个解码器的自定义神经网络。行编码器接受大小为例如:30x40 的输入,列编码器应该在转置中接受相同的数据,使其成为 40x30。我该如何实现它?

当我连接两个编码器输入时,Tensorflow 给出错误。这可以以某种方式完成吗?我应该使用不同的库或不同的方法吗?这到底能做到吗?

我知道同一模型的 40x40 数据效果很好,但我希望它用于非方阵。

型号:

from tensorflow.keras.models import Model
import tensorflow as tf


r = Input(shape=(data.shape[0],))
c = Input(shape=(data.shape[1],))

re = Dense(data.shape[0])(r)
ce = Dense(data.shape[1])(c)

e = Concatenate()([re, ce])

d = Dense(2, activation='sigmoid')(e)
o = Dense(data.shape[1], activation='linear')(d)

one_model = Model(inputs=[r, c], outputs=o)
one_model.compile(optimizer='adam', loss='mse')

history = one_model.fit([data, np.transpose(data)], data, epochs=50, batch_size=4, verbose=2)```



Error: 

```Shapes of all inputs must match: values[0].shape = [30,40] != values[1].shape = [40,30]```

ValueError: Data cardinality is ambiguous:
  x sizes: 30, 40
  y sizes: 30
Make sure all arrays contain the same number of samples.
tensorflow deep-learning autoencoder encoder encoder-decoder
1个回答
0
投票

只是添加我的想法可能会对将来的人有所帮助。

我使用填充解决了这个问题。所以输入数组将为 30x40 和 40x40。 我的目标是使用输入 1x30 和 1x40 训练两个模型。我无法传递 2 个不同的数组,希望 1 个解码器能够找到 2 个不同数组之间的关系。对于编码器 1 输入和编码器 2 输入的每种组合,必须有 1 个目标输出,该输出将与解码器输出进行比较以进行比较并生成损失。系统内部使用损失来学习。因此输入可以是:

Encoder1 input = 40, 1, 40 
Encoder2 input = 40, 1, 30 --> 10, 1, 30 padded with zeros
Decoder output = 80, 1, output_shape

Or even better approach is:

Encoder1 input = 30 * 40, 1, 40 --> 30 * 40 is the product of rows and columns
Encoder2 input = 30 * 40, 1, 30
Decoder output = 2 * 30 * 40, 1, output_shape --> output shape in my case would be 1. i.e., 1x1 which represents each cell in the 30x40 matrix
© www.soinside.com 2019 - 2024. All rights reserved.