Machine learning 深度自动编解码器结构/形状错误中的Keras非类型错误

Machine learning 深度自动编解码器结构/形状错误中的Keras非类型错误,machine-learning,keras,nlp,Machine Learning,Keras,Nlp,我的神经网络训练有困难。我对神经网络的定义如下: shared = embedding_layer inputA = keras.Input(shape=(40, ), name="anchor") # Variable-length sequence of ints inputP = keras.Input(shape=(40, ), name="positive") # Variable-length sequence of ints input

我的神经网络训练有困难。我对神经网络的定义如下:

shared = embedding_layer

inputA = keras.Input(shape=(40, ), name="anchor")  # Variable-length sequence of ints
inputP = keras.Input(shape=(40, ), name="positive")  # Variable-length sequence of ints
inputN = keras.Input(shape=(40, ), name="negative")  # Binary vectors of size num_tags

concatenated = layers.concatenate([inputA, inputP, inputN])

embedded_A = shared(concatenated)

encoded = Dense(900, activation = "relu")(embedded_A)
encoded = Dense(600, activation = "relu")(encoded)
encoded = Dense(300, activation = "relu")(encoded)
encoded = Dense(100, activation = "relu")(encoded)

decoded = Dense(100, activation = "relu")(encoded)
decoded = Dense(300, activation = "relu")(decoded)
decoded = Dense(600, activation = "relu")(decoded)
decoded = Dense(900, activation = "relu")(decoded)


predictionsA = Dense(40, activation="sigmoid", name ='outA')(decoded)
predictionsP = Dense(40, activation="sigmoid", name ='outB')(decoded)
predictionsN = Dense(40, activation="sigmoid", name ='outC')(decoded)

ml_model = keras.Model(
    inputs=[inputA, inputP, inputN],
    outputs=[predictionsA, predictionsP, predictionsN]
)


ml_model.compile(
    optimizer='adam',
    loss='mse'
)

ml_model.fit(
    {"anchor": anchor, "positive": positive, "negative": negative},
    {"outA": anchor, "outB": positive, 'outC': negative},
    epochs=2)

embedding_m = model.syn0
embedding_layer = Embedding(len(vocab),
                            300,
                            weights=[embedding_m],
                            input_length=40,
                            trainable=True)

从示意图上看

埋置层的定义如下:

shared = embedding_layer

inputA = keras.Input(shape=(40, ), name="anchor")  # Variable-length sequence of ints
inputP = keras.Input(shape=(40, ), name="positive")  # Variable-length sequence of ints
inputN = keras.Input(shape=(40, ), name="negative")  # Binary vectors of size num_tags

concatenated = layers.concatenate([inputA, inputP, inputN])

embedded_A = shared(concatenated)

encoded = Dense(900, activation = "relu")(embedded_A)
encoded = Dense(600, activation = "relu")(encoded)
encoded = Dense(300, activation = "relu")(encoded)
encoded = Dense(100, activation = "relu")(encoded)

decoded = Dense(100, activation = "relu")(encoded)
decoded = Dense(300, activation = "relu")(decoded)
decoded = Dense(600, activation = "relu")(decoded)
decoded = Dense(900, activation = "relu")(decoded)


predictionsA = Dense(40, activation="sigmoid", name ='outA')(decoded)
predictionsP = Dense(40, activation="sigmoid", name ='outB')(decoded)
predictionsN = Dense(40, activation="sigmoid", name ='outC')(decoded)

ml_model = keras.Model(
    inputs=[inputA, inputP, inputN],
    outputs=[predictionsA, predictionsP, predictionsN]
)


ml_model.compile(
    optimizer='adam',
    loss='mse'
)

ml_model.fit(
    {"anchor": anchor, "positive": positive, "negative": negative},
    {"outA": anchor, "outB": positive, 'outC': negative},
    epochs=2)

embedding_m = model.syn0
embedding_layer = Embedding(len(vocab),
                            300,
                            weights=[embedding_m],
                            input_length=40,
                            trainable=True)

输入和输出是一样的,因为我正在制作一个自动编码器-解码器

我得到的错误是:

尺寸必须相等,但对于输入形状为[32120,40],[32,40]的“{node mean_squared_error/SquaredDifference}}=SquaredDifference[T=DT_FLOAT](model_3/outA/Sigmoid,mean_squared_error/Cast)”,尺寸为120和32

但我似乎无法找出原因,或如何修复它。。。有什么想法吗?如果需要,我可以提供更多的例子。我怀疑存在一些维度错误,因为我希望我的输出的形状(120000,40)与我的输入完全相同。

删除一个“解码”行以修复网络结构:


修复了有问题的端编码器-解码器版本:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from keras.layers import Dense

#shared = embedding_layer
#Simulate that...
shared=Dense(1,activation="relu")

inputA = keras.Input(shape=(40, ), name="anchor")  # Variable-length sequence of ints
inputP = keras.Input(shape=(40, ), name="positive")  # Variable-length sequence of ints
inputN = keras.Input(shape=(40, ), name="negative")  # Binary vectors of size num_tags

concatenated = layers.concatenate([inputA, inputP, inputN])

embedded_A = shared(concatenated)

encoded = Dense(900, activation = "relu")(embedded_A)
encoded = Dense(600, activation = "relu")(encoded)
encoded = Dense(300, activation = "relu")(encoded)
encoded = Dense(100, activation = "relu")(encoded)

#decoded = Dense(100, activation = "relu")(encoded)
decoded = Dense(300, activation = "relu")(encoded)
decoded = Dense(600, activation = "relu")(decoded)
decoded = Dense(900, activation = "relu")(decoded)


predictionsA = Dense(40, activation="sigmoid", name ='outA')(decoded)
predictionsP = Dense(40, activation="sigmoid", name ='outB')(decoded)
predictionsN = Dense(40, activation="sigmoid", name ='outC')(decoded)

ml_model = keras.Model(
    inputs=[inputA, inputP, inputN],
    outputs=[predictionsA, predictionsP, predictionsN]
)


ml_model.compile(
    optimizer='adam',
    loss='mse'
)

#Simulate...
anchor=tf.random.uniform((100,40))
positive=tf.random.uniform((100,40))
negative=tf.random.uniform((100,40))

ml_model.fit(
    {"anchor": anchor, "positive": positive, "negative": negative},
    {"outA": anchor, "outB": positive, 'outC': negative},
    epochs=2)

很遗憾,这不起作用。第24行的最后一部分也更改为编码。我将添加工作代码给您作为答案!太棒了,真管用!谢谢。新的问题是,它只在我的句子的一次迭代中运行,因此我最后输出节点的输出权重是(300,40),不幸的是,不是(120000,300,40),正如我对所有句子所期望的那样。我应该把它放在一个环中吗?