onehot编码标签的Tensorflow占位符

2024-04-19 22:04:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个热编码标签(从0到10的11个类):

# one-hot encode labels
from sklearn.preprocessing import OneHotEncoder

labels = df.rating.values.reshape([-1, 1])
encoder = OneHotEncoder(sparse=False)
encoder.fit(labels)
labels = encoder.transform(labels)

并具有以下占位符:

^{pr2}$

我正在使用sparse_softmax_cross_entropy

with graph.as_default():
    logits = tf.layers.dense(inputs=outputs[:, -1], units=1)
    loss = tf.losses.sparse_softmax_cross_entropy(labels=labels_, logits=logits)        
    optimizer = tf.train.AdamOptimizer(learning_rate).minimize(loss)

TF抛出:ValueError: Cannot feed value of shape (500, 1, 11) for Tensor 'labels:0', which has shape '(?, 1)'

我什么都试过了,但都没用。一个热编码数据的正确占位符是什么?在


Tags: 编码encoderlabelstf标签oneentropysparse
1条回答
网友
1楼 · 发布于 2024-04-19 22:04:15

第二个维度应该是你有多少个类。一个热编码意味着,假设你有10个类,你对类5进行编码,就会得到一个向量[0,0,0,0,0,1,0,0,0,0]的长度为10。所以代码应该是:

labels_ = tf.placeholder(tf.int32, [None, ***number of classes***], name='labels')

同样,^{}接受一个类标签,而不是一个热编码。所以要么你先用^{}对它进行解码,然后再将其发送给^{},如下所示:

^{pr2}$

或者真正的问题是,为什么你要首先使用ont热编码?您只需将df.rating.values.reshape([-1, 1])作为labels_输入到图中,并将1保持在第二个维度中。整个一个热编码块是不必要的。在

您的代码中还有一些其他问题(未在原始问题中显示)会影响此问题。首先,你要像这样给网络提供信息:

    feed = {inputs_: x,
            labels_: y[:, None],
            keep_prob: 1,
            initial_state: test_state}

{{{cd7}试图解决问题。问题是在Numpy中索引None有一个特殊的含义:它将插入一个新的维度。这就是( 500, 1, 1 )中额外维度的来源。索引y在这里是不必要的,我已经删除了。所以代码应该是:

    feed = {inputs_: x,
            labels_: y,
            keep_prob: 1,
            initial_state: test_state}

接下来是另一个问题,一个非常常见的错误,在这一行:

loss, state, _ = sess.run([loss, final_state, optimizer], feed_dict=feed)

您将loss的值赋给loss,因此loss现在是一个数字,而不是张量。第二次代码迭代失败。我把它改成

loss_val, state, _ = sess.run([loss, final_state, optimizer], feed_dict=feed)

当然,您还需要将该更改传播到print()

print("Epoch: {}/{}".format(e, epochs),
      "Iteration: {}".format(iteration),
      "Train loss: {:.3f}".format(loss_val))

另外,在定义逻辑的地方,你必须有11个单元,因为你有11个类(0-10),并且每个类需要一个概率:

logits = tf.layers.dense(inputs=outputs[:, -1], units=11 )

随着这些变化,训练运行,甚至似乎学到了一些东西:

('Epoch: 0/10', 'Iteration: 5', 'Train loss: 1.735')
('Epoch: 0/10', 'Iteration: 10', 'Train loss: 2.092')
('Epoch: 0/10', 'Iteration: 15', 'Train loss: 2.644')
('Epoch: 0/10', 'Iteration: 20', 'Train loss: 1.596')
('Epoch: 0/10', 'Iteration: 25', 'Train loss: 1.759')
Val acc: 0.012
('Epoch: 0/10', 'Iteration: 30', 'Train loss: 1.581')
('Epoch: 0/10', 'Iteration: 35', 'Train loss: 2.213')
('Epoch: 0/10', 'Iteration: 40', 'Train loss: 2.176')
('Epoch: 0/10', 'Iteration: 45', 'Train loss: 1.849')
('Epoch: 0/10', 'Iteration: 50', 'Train loss: 2.474')
Val acc: 0.017

相关问题 更多 >