gpt4 book ai didi

python - Logits 的形状错误

转载 作者:行者123 更新时间:2023-11-30 09:42:40 27 4
gpt4 key购买 nike

当我尝试使用 softmax 交叉熵函数时,我收到一个 ValueError 消息

ValueError: Rank mismatch: Rank of labels (received 2) should equal rank of logits minus 1 (received 2).

问题是,我的层的构建方式使得我的 logits 应该只输出 1 个值。

我的 logits 的形状是 (5, 1),但我不知道为什么会有 5。每个实例的 X 是一个 5x7 矩阵

X = tf.placeholder(shape=(1, 5, 7), name='inputs', dtype=tf.float32)
y = tf.placeholder(shape=(1, 1), name='outputs', dtype=tf.int32)

hidden1 = tf.layers.dense(X, 150)
hidden2 = tf.layers.dense(hidden1, 50)
logits = tf.layers.dense(hidden2, 1)

with tf.name_scope("loss"):
xentropy= tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y,
logits=logits)
loss = tf.reduce_mean(xentropy, name="loss")

最佳答案

编辑

检查评论,并尝试此代码。

X = tf.placeholder(shape=(1, 5, 7), name='inputs', dtype=tf.float32)
y = tf.placeholder(shape=(1), name='outputs', dtype=tf.int32)

flattened = tf.layers.flatten(X) # shape (1,35)
hidden1 = tf.layers.dense(flattened, 150) # shape (1,150)
hidden2 = tf.layers.dense(hidden1, 50) # shape (1,50)
logits = tf.layers.dense(hidden2, 1) # shape (1,1)

with tf.name_scope("loss"):
# expects logits of shape (1,1) against labels of shape (1)
xentropy= tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y,
logits=logits)
loss = tf.reduce_mean(xentropy, name="loss")

原版

让我们思考一下这里发生了什么。

  1. 您创建一个形状为 (5,7)X 占位符(大概是 (batch_size, data_size))。
  2. 将其输入隐藏层,隐藏层将形状从 (batch_size, data_size) 转换为 (batch_size,units)(此处的单位为 150)
  3. 对于接下来的两层 hidden2logits 也是如此,导致 logits 的形状为 (batch_size, 1),即 (5, 1) 在本例中
  4. 您正在计算标签和逻辑之间的交叉熵。这里对形状的要求是 logits 具有形状 (batch_size, num_classes),其中每个值是特定类的权重,并且标签具有形状 (batch_size) >,其中每个值是该特定样本的类别号。所以这就是你出了问题的地方。您的 y 具有形状 (1,1),而 TF 只期望张量或形状 (5)

根据我的猜测,我认为您正在尝试直接将 X 作为单个样本的数据前馈(就像 (5,7) 形状的矩阵)。如果是这种情况,您应该让 X 采取 (1,5,7) 的形状,以向 Tensorflow 表示 X 仅代表一个一条数据。

关于python - Logits 的形状错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56783962/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com