从 TF 1.12 移动到 1.10 后致密层输出形状错误

Wrong dense layer output shape after moving from TF 1.12 to 1.10

我正在从 Tensorflow 1.12 迁移到 Tensorflow 1.10(Collaboratory -> AWS sagemaker),代码似乎在 Tensorflow 1.12 中运行良好,但在 1.10 中我收到错误 ValueError: Error when checking target: expected dense to have 2 dimensions, but got array with shape (52692,)

输入示例 - 没有空格的字符串:

["testAbc", "aaDD", "roam"]

我通过将小写字母更改为 1、大写字母 2、数字 - 3、'-' - 4、'_' - 5 和填充来进行预处理,因此它们与 0 的长度相等

和 4 个标签 a - 0, b - 1, c - 2, d - 3

假设每个单词的最大长度为 10(在我的代码中为 20):

特征-[[1 1 1 1 2 1 1 0 0 0][1 1 2 2 0 0 0 0 0 0][1 1 1 1 0 0 0 0 0 0]]

标签 - [1, 1, 2, 3]

预期输出:[a: 0%, b: 0%, c: 1%, d: 99%](示例)

model = keras.Sequential()
model.add(
    keras.layers.Embedding(6, 8, input_length=maxFeatureLen))
model.add(keras.layers.LSTM(12))
model.add(keras.layers.Dense(4, activation=tf.nn.softmax))
model.compile(tf.train.AdamOptimizer(0.001), loss="sparse_categorical_crossentropy")
model.fit(train["featuresVec"],
            train["labelsVec"],
            epochs=1,
            verbose=1,
            callbacks=[],
            validation_data=(evale["featuresVec"], evale["labelsVec"],),
            validation_steps=evale["count"],
            steps_per_epoch=train["count"])

train 和 evale 的形状 - 二维数组

train["featuresVec"]=
[[1 2 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0]
 [1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [2 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0]]

evale["featuresVec"]=
[[1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0]
 [1 1 1 1 1 1 2 1 1 1 1 1 0 0 0 0 0 0 0 0]
 [1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 0]
 [1 1 1 1 1 2 1 1 1 1 1 2 1 1 1 1 1 1 0 0]
 [1 1 1 1 1 2 1 1 1 1 1 1 0 0 0 0 0 0 0 0]]

train["labelsVec"] = [1 0 0 0 2]
evale["labelsVec"] = [0 1 1 1 1]

形状:

train["featuresVec"] = [52692, 20]
evale["featuresVec"] = [28916, 20]
train["labelsVec"] = [52692]
evale["labelsVec"] = [28916]

可能您的标签向量需要具有 (batch_size, 1) 的形状,而不仅仅是 (batch_size,)

注意: 由于您使用 sparse_categorical_crossentropy 作为损失函数而不是 categorical_crossentropy,因此不对标签进行单热编码是正确的。