我尝试构建一个模型(用于简单的聊天机器人),但我停留在嵌入层上。 我有 X_train 形状 = (100082, 1307) --> 问题 y_train 形状 = (100082, 1307) --> 答案 其中 1307 是我填充序列的最大长度
下面是我的代码:
model = Sequential([
Embedding(total_tokens, 128, input_length=max_seq_length),
# Bidirectional(LSTM(150)),
# Dense(total_tokens, activation='softmax')
])
model.summary()
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-4),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(X_train, y_train, epochs=50)
但是,当我训练模型时,出现了如下错误: 收到标签值 83193,超出了 [0, 128) 的有效范围。
我该如何解决这个问题?
问题是由于您的标签
y_train
包含大于指定间隔[0, 128)
的整数,因为您的Embedding
层的输出大小设置为128
。
让我们用一个简化的例子来说明这一点。这里我将形状从
(100082, 1307)
缩小到 (1000, 1307)
:
我们使用随机生成器来创建
y_train
张量,如下所示:
y_train = tf.random.uniform(shape=([1000, 1307]), minval=0, maxval=127)
这里我们测试 10 个 epoch:
model = Sequential([
Embedding(total_tokens, 128, input_length=max_seq_length),
])
model.summary()
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-4),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(X_train, y_train, epochs=10)
这是输出:
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
embedding_1 (Embedding) (None, 1307, 128) 128000
=================================================================
Total params: 128000 (500.00 KB)
Trainable params: 128000 (500.00 KB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________
Epoch 1/10
32/32 [==============================] - 4s 124ms/step - loss: 10.5185 - accuracy: 0.0000e+00
Epoch 2/10
32/32 [==============================] - 5s 152ms/step - loss: 10.4612 - accuracy: 0.0000e+00
Epoch 3/10
32/32 [==============================] - 4s 116ms/step - loss: 10.4123 - accuracy: 0.0000e+00
Epoch 4/10
32/32 [==============================] - 4s 116ms/step - loss: 10.3636 - accuracy: 0.0000e+00
Epoch 5/10
32/32 [==============================] - 6s 175ms/step - loss: 10.3126 - accuracy: 0.0000e+00
Epoch 6/10
32/32 [==============================] - 4s 120ms/step - loss: 10.2577 - accuracy: 0.0000e+00
Epoch 7/10
32/32 [==============================] - 4s 119ms/step - loss: 10.1967 - accuracy: 0.0000e+00
Epoch 8/10
32/32 [==============================] - 5s 152ms/step - loss: 10.1267 - accuracy: 0.0000e+00
Epoch 9/10
32/32 [==============================] - 4s 119ms/step - loss: 10.0431 - accuracy: 0.0000e+00
Epoch 10/10
32/32 [==============================] - 4s 119ms/step - loss: 9.9369 - accuracy: 7.6511e-07
<keras.src.callbacks.History at 0x7de0b88f0ee0>
在此示例中,模型运行没有错误。
但是,如果生成器的上限设置为
200
(大于128):
y_train = tf.random.uniform(shape=([1000, 1307]), minval=0, maxval=200)
出现错误:
Received a label value of 199 which is outside the valid range of [0, 128).
因此,您应该确保
y_train
中的标签落在 Embedding
层的输出大小指定的有效范围内。