繁体   English   中英

tensorflow Keras:维度必须相等 ValueError

[英]tensorflow Keras: Dimenions must be equal ValueError

提示:本站为国内最大中英文翻译问答网站,提供中英文对照查看,鼠标放在中文字句上可显示英文原文

我正在尝试在 Keras 中训练 model,以在出现棋盘时建议最佳下一步行动。 棋盘表示为 64 个整数的列表(0 表示空,1 表示玩家,2 表示敌人)。 output 由字段列表和该字段上的图形应该移动的方向表示,这意味着我需要两个输出层,大小为 64(字段数)和 5(可能的移动方向数,包括两个前向并且在游戏结束时没有移动)。 我有一个板列表和一个解决方案列表。 但是,当我尝试适合 model 时,出现上述错误。

确切的错误信息是:

Epoch 1/75
Traceback (most recent call last):
  File "C:\Users\lulll\Documents\CodeStuff\tfTesting\main.py", line 75, in <module>
    model.fit(train_fig_starts, train_fig_moves, epochs=75)
  File "C:\Users\lulll\Documents\CodeStuff\tfTesting\venv\lib\site-packages\keras\utils\traceback_utils.py", line 70, in error_handler
    raise e.with_traceback(filtered_tb) from None
  File "C:\Users\lulll\AppData\Local\Temp\__autograph_generated_filej0zia4d5.py", line 15, in tf__train_function
    retval_ = ag__.converted_call(ag__.ld(step_function), (ag__.ld(self), ag__.ld(iterator)), None, fscope)
ValueError: in user code:

    File "C:\Users\lulll\Documents\CodeStuff\tfTesting\venv\lib\site-packages\keras\engine\training.py", line 1249, in train_function  *
        return step_function(self, iterator)
    File "C:\Users\lulll\Documents\CodeStuff\tfTesting\venv\lib\site-packages\keras\engine\training.py", line 1233, in step_function  **
        outputs = model.distribute_strategy.run(run_step, args=(data,))
    File "C:\Users\lulll\Documents\CodeStuff\tfTesting\venv\lib\site-packages\keras\engine\training.py", line 1222, in run_step  **
        outputs = model.train_step(data)
    File "C:\Users\lulll\Documents\CodeStuff\tfTesting\venv\lib\site-packages\keras\engine\training.py", line 1024, in train_step
        loss = self.compute_loss(x, y, y_pred, sample_weight)
    File "C:\Users\lulll\Documents\CodeStuff\tfTesting\venv\lib\site-packages\keras\engine\training.py", line 1082, in compute_loss
        return self.compiled_loss(
    File "C:\Users\lulll\Documents\CodeStuff\tfTesting\venv\lib\site-packages\keras\engine\compile_utils.py", line 265, in __call__
        loss_value = loss_obj(y_t, y_p, sample_weight=sw)
    File "C:\Users\lulll\Documents\CodeStuff\tfTesting\venv\lib\site-packages\keras\losses.py", line 152, in __call__
        losses = call_fn(y_true, y_pred)
    File "C:\Users\lulll\Documents\CodeStuff\tfTesting\venv\lib\site-packages\keras\losses.py", line 284, in call  **
        return ag_fn(y_true, y_pred, **self._fn_kwargs)
    File "C:\Users\lulll\Documents\CodeStuff\tfTesting\venv\lib\site-packages\keras\losses.py", line 2176, in binary_crossentropy
        backend.binary_crossentropy(y_true, y_pred, from_logits=from_logits),
    File "C:\Users\lulll\Documents\CodeStuff\tfTesting\venv\lib\site-packages\keras\backend.py", line 5688, in binary_crossentropy
        bce = target * tf.math.log(output + epsilon())

    ValueError: Dimensions must be equal, but are 2 and 64 for '{{node binary_crossentropy/mul}} = Mul[T=DT_FLOAT](binary_crossentropy/Cast, binary_crossentropy/Log)' with input shapes: [?,2], [?,64].

我完全不知道是什么原因造成的。 我已经搜索了错误,但我发现的唯一提及似乎描述了一个完全不同的场景。 因为它可能有帮助,下面是用于创建和拟合 model 的代码:

inputs = tf.keras.layers.Input(shape=64)
x = tf.keras.layers.Dense(32, activation='relu')(inputs)
out_field = tf.keras.layers.Dense(64, name="field")(x)
out_movement = tf.keras.layers.Dense(5, name="movement")(x)

model = tf.keras.Model(inputs=inputs, outputs=[out_field, out_movement])

model.compile(optimizer='adam',
              loss=tf.keras.losses.BinaryCrossentropy(),
              metrics=['accuracy'])

model.fit(train_fig_starts, train_fig_moves, epochs=75) #train_fig_starts and moves are defined above

编辑 1:这是我正在使用的数据集的示例(整个内容对于字符限制来说太长了)

train_fig_starts = [[0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 2, 0, 1, 0, 0, 0, 0, 1, 2, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 1], [0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0], [0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 1, 2, 2, 2, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 2, 2, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0]]
train_fig_moves = [[0, 0], [0, 0], [0, 0], [0, 0], [15, 2], [15, 2]]

编辑 2:我将其更改为 sparsecategorialcrossentropy 因为这看起来更像我正在寻找的东西。 这是现在的 model 代码

inputs = tf.keras.layers.Input(shape=64)
x = tf.keras.layers.Dense(64, activation='relu')(inputs)

out_field = tf.keras.layers.Dense(64, activation="relu",  name="field")(x)
out_field = tf.keras.layers.Dense(64, activation="softmax", name="field_softmax")(out_field)

out_movement = tf.keras.layers.Dense(5, activation="relu", name="movement")(x)
out_movement = tf.keras.layers.Dense(5, activation="softmax", name="movement_softmax")(out_movement)

model = tf.keras.Model(inputs=inputs, outputs=[out_field, out_movement])

print(model.summary())
tf.keras.utils.plot_model(model, to_file='model_plot.png', show_shapes=True, show_layer_names=True)

model.compile(optimizer='adam',
              loss=[tf.keras.losses.SparseCategoricalCrossentropy(),
                    tf.keras.losses.SparseCategoricalCrossentropy()],
              metrics=['accuracy'])

它仍然会抛出错误,这次是以下错误:

Node: 'sparse_categorical_crossentropy_1/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits'
logits and labels must have the same first dimension, got logits shape [32,5] and labels shape [64]
     [[{{node sparse_categorical_crossentropy_1/SparseSoftmaxCrossEntropyWithLogits/SparseSoftmaxCrossEntropyWithLogits}}]] [Op:__inference_train_function_1666]

我不知道为什么会这样。 Output logits 和 labels 都应该是 [64, 2]。 因为我使用的是稀疏交叉熵,所以我应该能够在我的训练数据中使用整数来表示具有最高 logit 的输出神经元的“索引”,对吧? 如我错了请纠正我。 如果有帮助,这是我的 model 的图表: model 的 plot

问题是您从 model 返回 64 位长度的 output,称为logit ,而您的损失 function 需要 2 位长度的输入。

import numpy as np
import tensorflow as tf

train_fig_starts = tf.constant([[0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 2, 0, 1, 0, 0, 0, 0, 1, 2, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 2, 1, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 1], [0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0], [0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 1, 2, 2, 2, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 2, 2, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0]])
train_fig_moves = tf.constant([[0, 0], [0, 0], [0, 0], [0, 0], [15, 2], [15, 2]])

inputs = tf.keras.layers.Input(shape=64)
x = tf.keras.layers.Dense(32, activation='relu')(inputs)
out_field = tf.keras.layers.Dense(64, activation='relu')(x)
out_field = tf.keras.layers.Dense(2, name="field" , activation='softmax')(out_field)

out_movement = tf.keras.layers.Dense(32, activation='relu')(x)
out_movement = tf.keras.layers.Dense(2, name="movement", activation='softmax')(out_movement)

model = tf.keras.Model(inputs=inputs, outputs=[out_field, out_movement])

model.compile(optimizer='adam',
              loss=tf.keras.losses.CategoricalCrossentropy(),
              metrics=['accuracy'])
model.fit(train_fig_starts, train_fig_moves, epochs=75) #train_fig_starts and moves are defined above
0s 8ms/step - loss: 5.2342 - field_loss: 2.7274 - movement_loss: 2.5068 - field_accuracy: 0.6667 - movement_accuracy: 1.0000

所以我现在自己解决了这个问题。 老实说,这是一个非常愚蠢的错误,但错误消息并没有很好地解释发生了什么。 我将输出交换为一种热编码,并将损失更改为 CategorialCrossEntropy,这也更适合分类问题(由于某些原因,Sparse 不适用于我的整数)。 之后,我需要将 label 列表从包含 len = 2 列表的 1dim 列表更改为包含字段和 move one hots 的 2dim 列表,在单独的列表中。 如果有人遇到类似的问题并且无法理解它,也许这会有所帮助。

问题未解决?试试本站强大的搜索功能,搜索: tensorflow Keras:维度必须相等 ValueError
ValueError:尺寸必须相等(keras)

[英]ValueError: Dimensions must be equal (keras)

我正在尝试训练自动编码器,但在重塑我的 X_train 以使其适合我的 model 模型()时遇到问题。 我的数据的维度如下: X_train = (523, 100,1) X_test = (523, 100,1) ...

Keras LSTM 层值错误:尺寸必须相等,但为 17 和 2

[英]Keras LSTM Layer ValueError: Dimensions must be equal, but are 17 and 2

我正在为一个多类任务开发一个基本的 RNN model,我在 output 尺寸方面遇到了一些问题。 这是我的输入/输出形状: 这是我的 model,使用 Keras 功能 API: 这是我的model.summary() : 然后我编译 model 并运行fit() : 我得到一个尺寸错误: 错 ...

Tensorflow错误:尺寸必须相等

[英]Tensorflow error : Dimensions must be equal

我有一个25000张彩色图片100 * 100(* 3)的数据集,我试图用一个卷积层构建一个简单的神经网络。 它显示了受疟疾感染或未受疟疾感染的细胞的图片,因此我的输出为2。但是似乎我的尺寸不匹配,而且我不知道我的错误来自哪里。 我的神经网络: 我的错误: 我之前使用过一 ...

ValueError:两个形状中的尺寸2必须相等,但分别为3和32

[英]ValueError: Dimension 2 in both shapes must be equal, but are 3 and 32

我目前正在研究Tensorflow。 我通过Django应用程序使用了预先训练的模型进行预测,但是在预测过程中出现错误,请帮助我解决错误。 代码给出了这个错误 在为cross_entropy行时,会发生此错误。 我不明白为什么会这样,如果您需要更多信息,我很乐意为您提供。 ...

ValueError:尺寸必须相等,输入形状

[英]ValueError: Dimensions must be equal, with input shapes

我已经写了这段代码。 我的输入形状是(100 x100 X3)。 我是深度学习的新手。 我花了很多时间在这上面,但无法解决这个问题。 非常感谢任何帮助。 错误:在 [15] 中:runfile('/user/Project/SM/src/ann_algo_keras.py', wdir='/user ...

ValueError:尺寸必须相等,但输入形状为 100 和 19:[?,100], [?,100,19]

[英]ValueError: Dimensions must be equal, but are 100 and 19 with input shapes: [?,100], [?,100,19]

赏金将在 7 天后到期。 此问题的答案有资格获得+50声望赏金。 Aizayousaf正在从有信誉的来源寻找答案。 我的代码中有一个错误,我已经阅读了文档,但它仍然是错误的,如何修复这个错误? 代码: 这是 model 摘要: 这是适合训练数据的代码: 我得到了这个错误: ValueErro ...

ValueError:创建预训练模型的集合时,模型的输出张量必须是Keras Layer的输出

[英]ValueError: Output tensors to a Model must be the output of a Keras `Layer` when creating ensemble of pre-trained model

我有一些预训练的二进制Keras模型。 本示例中的3个模型。 我正在尝试通过平均这些模型的预测来创建整体模型。 要做到这一点,我采取参考这里例如从ensembling模型。 我的代码如下 我收到以下错误 因此,总体目标是使在Sigmoid函数上训练的二进制Keras模型集 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2023 STACKOOM.COM