当我尝试使用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")
答案 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")
让我们仔细考虑一下这里发生的事情。
X
形状为(5,7)
(大概是(batch_size,data_size))的占位符。 (batch_size, data_size)
转换为(batch_size, units)
(单位为150)hidden2
和logits
,导致logit的形状为(batch_size, 1)
,在这种情况下为(5, 1)
(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。因此,您肯定做错了什么。没有更多信息很难说什么。