我正在尝试创建一个具有 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.
只是添加我的想法可能会对将来的人有所帮助。
我使用填充解决了这个问题。所以输入数组将为 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