Python 罗吉特的形状不对
当我尝试使用softmax交叉熵函数时,我得到一个值错误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='
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)
(批次大小,数量类)
,其中每个值是特定类别的权重,标签必须具有形状(批次大小)
,其中每个值是特定样本的类别编号。这就是你的问题所在。您的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)