Logits形状错误

时间:2019-06-27 04:36:38

标签: python tensorflow machine-learning

当我尝试使用softmax交叉熵函数时,出现ValueError提示

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

问题是,我的图层以这样的方式构建:我的日志仅输出1个值。

我的logit形状为(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")

2 个答案:

答案 0 :(得分:1)

编辑

检查注释,然后尝试使用此代码。

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. 您创建一个X形状为(5,7)(大概是(batch_size,data_size))的占位符。
  2. 您将其馈入一个隐藏层,该隐藏层将形状从(batch_size, data_size)转换为(batch_size, units)(单位为150)
  3. 同样,对于接下来的两层分别为hidden2logits,导致logit的形状为(batch_size, 1),在这种情况下为(5, 1)
  4. 您正在计算标签和logit之间的交叉熵。此处形状的要求是logit具有形状(batch_size, num_classes),其中每个值是特定类别的权重,而标签具有形状(batch_size),其中每个值是该特定类别的类别号样品。所以这是您出问题的地方。您的y的形状为(1,1),TF只是期望张量或形状为(5)

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

答案 1 :(得分:0)

  

问题是,我的图层以这样的方式构建:我的日志仅输出1个值。

那不是事实。当X是a X b张量并且您执行tf.layers.dense(X, c)时,您将X与b X c矩阵相乘(并且还加上了大小c的偏差)。因此输出大小为a X c

在您的情况下,由于X的第一个维度为5,即使对于logit,它也继续为5。而且您的登录数应为5。因此,您肯定做错了什么。没有更多信息很难说什么。