python - WARNING : WARNING:tensorflow:Model was constructed with shape (None, 150) ,但它在形状不兼容的输入上被调用 (None, 1)

标签 python tensorflow keras reshape word-embedding

所以我试图建立一个词嵌入模型,但我一直收到这个错误。
在训练过程中,准确率没有变化,val_loss 保持“nan”

数据的原始形状是

x.shape, y.shape
((94556,), (94556, 2557))

然后我 reshape 它:
xr= np.asarray(x).astype('float32').reshape((-1,1))
yr= np.asarray(y).astype('float32').reshape((-1,1))
((94556, 1), (241779692, 1))

然后我通过我的模型运行它
model = Sequential()
model.add(Embedding(2557, 64, input_length=150, embeddings_initializer='glorot_uniform'))
model.add(Flatten())
model.add(Reshape((64,), input_shape=(94556, 1)))
model.add(Dense(512, activation='sigmoid'))
model.add(Dense(128, activation='sigmoid'))
model.add(Dense(64, activation='relu'))
model.add(Dense(10, activation='sigmoid'))
model.add(Dense(1, activation='relu'))
# compile the mode
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
# summarize the model
print(model.summary())
plot_model(model, show_shapes = True, show_layer_names=False)

训练后,我在每个 epoch 都获得了恒定的准确率和 val_loss nan。
history=model.fit(xr, yr, epochs=20, batch_size=32, validation_split=3/9)

Epoch 1/20
WARNING:tensorflow:Model was constructed with shape (None, 150) for input Tensor("embedding_6_input:0", shape=(None, 150), dtype=float32), but it was called on an input with incompatible shape (None, 1).
WARNING:tensorflow:Model was constructed with shape (None, 150) for input Tensor("embedding_6_input:0", shape=(None, 150), dtype=float32), but it was called on an input with incompatible shape (None, 1).
1960/1970 [============================>.] - ETA: 0s - loss: nan - accuracy: 0.9996WARNING:tensorflow:Model was constructed with shape (None, 150) for input Tensor("embedding_6_input:0", shape=(None, 150), dtype=float32), but it was called on an input with incompatible shape (None, 1).
1970/1970 [==============================] - 7s 4ms/step - loss: nan - accuracy: 0.9996 - val_loss: nan - val_accuracy: 0.9996
Epoch 2/20
1970/1970 [==============================] - 7s 4ms/step - loss: nan - accuracy: 0.9996 - val_loss: nan - val_accuracy: 0.9996
Epoch 3/20
1970/1970 [==============================] - 7s 4ms/step - loss: nan - accuracy: 0.9996 - val_loss: nan - val_accuracy: 0.9996
Epoch 4/20
1970/1970 [==============================] - 8s 4ms/step - loss: nan - accuracy: 0.9996 - val_loss: nan - val_accuracy: 0.9996
Epoch 5/20
1970/1970 [==============================] - 7s 4ms/step - loss: nan - accuracy: 0.9996 - val_loss: nan - val_accuracy: 0.9996
Epoch 6/20
1970/1970 [==============================] - 7s 4ms/step - loss: nan - accuracy: 0.9996 - val_loss: nan - val_accuracy: 0.9996
Epoch 7/20
1970/1970 [==============================] - 7s 4ms/step - loss: nan - accuracy: 0.9996 - val_loss: nan - val_accuracy: 0.9996
Epoch 8/20
1970/1970 [==============================] - 7s 4ms/step - loss: nan - accuracy: 0.9996 - val_loss: nan - val_accuracy: 0.9996
Epoch 9/20
1970/1970 [==============================] - 7s 4ms/step - loss: nan - accuracy: 0.9996 - val_loss: nan - val_accuracy: 0.9996
Epoch 10/20
1970/1970 [==============================] - 7s 4ms/step - loss: nan - accuracy: 0.9996 - val_loss: nan - val_accuracy: 0.9996
Epoch 11/20
1970/1970 [==============================] - 8s 4ms/step - loss: nan - accuracy: 0.9996 - val_loss: nan - val_accuracy: 0.9996
Epoch 12/20
1970/1970 [==============================] - 7s 4ms/step - loss: nan - accuracy: 0.9996 - val_loss: nan - val_accuracy: 0.9996
Epoch 13/20
1970/1970 [==============================] - 7s 4ms/step - loss: nan - accuracy: 0.9996 - val_loss: nan - val_accuracy: 0.9996
Epoch 14/20
1970/1970 [==============================] - 7s 4ms/step - loss: nan - accuracy: 0.9996 - val_loss: nan - val_accuracy: 0.9996
Epoch 15/20
1970/1970 [==============================] - 8s 4ms/step - loss: nan - accuracy: 0.9996 - val_loss: nan - val_accuracy: 0.9996
Epoch 16/20
1970/1970 [==============================] - 7s 4ms/step - loss: nan - accuracy: 0.9996 - val_loss: nan - val_accuracy: 0.9996
Epoch 17/20
1970/1970 [==============================] - 7s 4ms/step - loss: nan - accuracy: 0.9996 - val_loss: nan - val_accuracy: 0.9996
Epoch 18/20
1970/1970 [==============================] - 7s 4ms/step - loss: nan - accuracy: 0.9996 - val_loss: nan - val_accuracy: 0.9996
Epoch 19/20
1970/1970 [==============================] - 7s 4ms/step - loss: nan - accuracy: 0.9996 - val_loss: nan - val_accuracy: 0.9996
Epoch 20/20
1970/1970 [==============================] - 7s 4ms/step - loss: nan - accuracy: 0.9996 - val_loss: nan - val_accuracy: 0.9996

我认为它必须与输入/输出形状有关,但我不确定。我尝试以各种方式修改模型,添加层/删除层/不同的优化器/不同的批量大小,但到目前为止没有任何效果。

最佳答案

好的,以下是我的理解,如果我错了,请纠正我:

  • x包含 94556 个整数,每个整数是 2557 个单词中的一个的索引。
  • y包含 2557 个整数的 94556 个向量,每个向量还包含一个词的索引,但这次它是一种单热编码而不是分类编码。
  • 最后,来自 x 的对应词对和 y代表原文中相近的两个词。

  • 如果到目前为止我是正确的,那么以下运行正确:
    import numpy as np
    import tensorflow as tf
    from tensorflow.keras.layers import *
    from tensorflow.keras.models import *
    
    x = np.random.randint(0,2557,94556)
    y = np.eye((2557))[np.random.randint(0,2557,94556)]
    xr = x.reshape((-1,1))
    
    
    print("x.shape: {}\nxr.shape:{}\ny.shape: {}".format(x.shape, xr.shape, y.shape))
    
    
    model = Sequential()
    model.add(Embedding(2557, 64, input_length=1, embeddings_initializer='glorot_uniform'))
    model.add(Reshape((64,)))
    model.add(Dense(512, activation='sigmoid'))
    model.add(Dense(2557, activation='softmax'))
    
    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
    model.summary()
    
    history=model.fit(xr, y, epochs=20, batch_size=32, validation_split=3/9)
    

    最重要的修改:
  • y reshape 正在失去 x 中元素之间的关系和 y .
  • input_lengthEmbedding层应该对应于xr的第二个维度.
  • 网络最后一层的输出应该与y的第二个维度相同。 .

  • 我实际上很惊讶代码运行没有崩溃。

    最后,从我的研究来看,人们似乎并没有在实践中训练这样的跳跃图,而是试图预测训练示例是否正确(这两个词很接近)。也许这就是你想出一维输出的原因。

    这是一个灵感来自 https://github.com/PacktPublishing/Deep-Learning-with-Keras/blob/master/Chapter05/keras_skipgram.py 的模型:
    word_model = Sequential()
    word_model.add(Embedding(2557, 64, embeddings_initializer="glorot_uniform", input_length=1))
    word_model.add(Reshape((embed_size,)))
    
    context_model = Sequential()
    context_model.add(Embedding(2557, 64, embeddings_initializer="glorot_uniform", input_length=1))
    context_model.add(Reshape((64,)))
    
    model = Sequential()
    model.add(Merge([word_model, context_model], mode="dot", dot_axes=0))
    model.add(Dense(1, kernel_initializer="glorot_uniform", activation="sigmoid"))
    

    在这种情况下,您将有 3 个向量,所有向量都来自相同的大小 (94556, 1) (或者甚至可能大于 94556,因为您可能需要生成额外的负样本):
  • x包含从 0 到 2556 的整数
  • y包含从 0 到 2556 的整数
  • output包含0和1,每一对是否来自xy是反例还是正例

  • 训练看起来像:
    history = model.fit([x, y], output, epochs=20, batch_size=32, validation_split=3/9)
    

    关于python - WARNING : WARNING:tensorflow:Model was constructed with shape (None, 150) ,但它在形状不兼容的输入上被调用 (None, 1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61656444/

    相关文章:

    python - 这是一种有效的 pythonic 方式来查看可迭代对象中的任何项目是否对某个属性为真吗?

    python - Tensorflow 中的 CNN - 损失保持不变

    android - 如何在 tflite 中使用posenet模型的输出

    python - 一个问题以及如何在创建模型时处理批处理

    python - 将神经网络输出限制为训练类的子集

    python - 使用 n-1 个部分完成第 x 部分

    python - 在 main 中链接函数调用。是 "Pythonic"吗?

    python - 空列表 boolean 值

    tensorflow - Keras 自定义损失函数,具有带有 tensorflow 后端的二进制(圆形)

    python - 如何将自定义指标的值从自定义回调附加到我需要在张量板中使用的 "logs"?