Python 罗吉特的形状不对

Python 罗吉特的形状不对,python,tensorflow,machine-learning,Python,Tensorflow,Machine Learning,当我尝试使用softmax交叉熵函数时,我得到一个值错误 ValueError: Rank mismatch: Rank of labels (received 2) should equal rank of logits minus 1 (received 2). 问题是我的层是以这样一种方式构建的,我的logits应该只输出1个值 我的日志的形状是(5,1),但我不知道为什么会有一个5。每个实例的X是一个5x7矩阵 X=tf.placeholder(shape=(1,5,7),name='

当我尝试使用softmax交叉熵函数时,我得到一个值错误

ValueError: Rank mismatch: Rank of labels (received 2) should equal rank of logits minus 1 (received 2).
问题是我的层是以这样一种方式构建的,我的logits应该只输出1个值

我的日志的形状是(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.层密(X,150)
hidden2=tf.层密(hidden1,50)
logits=tf.layers.dense(hidden2,1)
具有tf.name_范围(“损失”):
xentropy=tf.nn.sparse\u softmax\u cross\u熵,
logits=logits)
损失=tf.减少平均值(xentropy,name=“损失”)
问题是我的层是以这样一种方式构建的,我的logits应该只输出1个值

那不是真的。当X是一个
abxb
张量,并且你做了
tf.layers.density(X,c)
,你将X乘以一个
bxc
矩阵(偏差也加上了大小c)。因此,输出大小是
a X c

在您的例子中,因为X的第一个维度是5,所以即使对于logits,它仍然是5。你的登录应该是5号。所以你肯定做错了什么。如果没有更多信息,很难说什么是正确的。

Edit 检查注释,然后尝试此代码

X=tf.placeholder(shape=(1,5,7),name='inputs',dtype=tf.float32)
y=tf.placeholder(shape=(1),name='outputs',dtype=tf.int32)
展平=tf.层。展平(X)#形状(1,35)
hidden1=tf.层。致密(扁平,150)#形状(1150)
hidden2=tf.层。致密(hidden1,50)#形状(1,50)
logits=tf.layers.稠密(hidden2,1)#形状(1,1)
具有tf.name_范围(“损失”):
#根据形状(1)的标签需要形状(1,1)的logit
xentropy=tf.nn.sparse\u softmax\u cross\u熵,
logits=logits)
损失=tf.减少平均值(xentropy,name=“损失”)
起初的 让我们仔细想想这里发生了什么

  • 您可以创建一个
    X
    占位符,其形状为
    (5,7)
    (大概是(批量大小、数据大小))
  • 将其输入到隐藏层,该层将形状从
    (批次大小,数据大小)
    转换为
    (批次大小,单位)
    (此处单位为150)
  • 同样,对于具有
    hidden2
    logits
    的下两个层,导致logits具有形状
    (批次大小,1)
    ,在这种情况下为
    (5,1)
  • 您正在计算标签和logit之间的交叉熵。此处对形状的要求是logits必须具有形状
    (批次大小,数量类)
    ,其中每个值是特定类别的权重,标签必须具有形状
    (批次大小)
    ,其中每个值是特定样本的类别编号。这就是你的问题所在。您的
    y
    具有形状
    (1,1)
    ,而TF只期望一个张量或形状
    (5)

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

    关于表示单个数据实例的5x7矩阵,您是对的。我的登录结果是1乘5乘1,但我不明白为什么5在这里。1乘5乘7应该表明5不是正确的批量大小?在这种情况下,您不应该直接将
    (1,5,7)
    张量送入致密层。“稠密”需要二维形状。您需要首先使用
    tf.layers将其尺寸展平为
    (1,35)
    。展平(X)