Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 一个热编码标签的Tensorflow占位符_Python_Tensorflow - Fatal编程技术网

Python 一个热编码标签的Tensorflow占位符

Python 一个热编码标签的Tensorflow占位符,python,tensorflow,Python,Tensorflow,我有一个热编码标签(从0到10的11个类): 并具有以下占位符: # create the graph object graph = tf.Graph() # add nodes to the graph with graph.as_default(): inputs_ = tf.placeholder(tf.int32, [None, None], name='inputs') labels_ = tf.placeholder(tf.int32, [None, 1], name

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

并具有以下占位符:

# create the graph object
graph = tf.Graph()
# add nodes to the graph
with graph.as_default():
    inputs_ = tf.placeholder(tf.int32, [None, None], name='inputs')
    labels_ = tf.placeholder(tf.int32, [None, 1], name='labels')
    keep_prob = tf.placeholder(tf.float32, name='keep_prob')
我用的是稀疏的交叉熵:

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:无法为具有形状“(?,1)”的张量“标签:0”馈送形状(500,1,11)的值


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

第二个维度应该是您有多少个类。一个热编码意味着,如果你有10个类,你对第5类进行编码,这将产生一个向量[0,0,0,0,0,1,0,0,0,0],长度为10。因此,代码应该是:

labels_ = tf.placeholder(tf.int32, [None, ***number of classes***], name='labels')
    feed = {inputs_: x,
            labels_: y,
            keep_prob: 1,
            initial_state: test_state}
然后,再次采用类标签,而不是一个热编码。因此,在将其输入之前,您可以使用以下方法对其进行解码:

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

代码中还有一些其他问题(原始问题中未显示)会影响此问题。首先,向网络提供如下信息:

    feed = {inputs_: x,
            labels_: y[:, None],
            keep_prob: 1,
            initial_state: test_state}
在试图解决
标签问题时,您添加了索引
[:,None]
。问题在于,在Numpy中,索引
None
有一个特殊的含义:它将插入一个新维度。这就是
(500,1,1)
中的额外维度的来源。索引
y
在这里是不必要的,我已经删除了它。因此,代码应该是:

labels_ = tf.placeholder(tf.int32, [None, ***number of classes***], name='labels')
    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))
此外,在定义Logit时,必须有11个单位,因为有11个类(0-10),每个类需要一个概率:

logits = tf.layers.dense(inputs=outputs[:, -1], units=11 )
通过这些变化,训练跑步甚至似乎学到了一些东西:

(‘历元:0/10’、‘迭代:5’、‘列车损失:1.735’)
('Epoch:0/10','Iteration:10','Train loss:2.092')
(‘历元:0/10’、‘迭代:15’、‘列车损失:2.644’)
(‘历元:0/10’、‘迭代:20’、‘列车损失:1.596’)
(‘历元:0/10’、‘迭代:25’、‘列车损失:1.759’)
Val acc:0.012
(‘历元:0/10’、‘迭代:30’、‘列车损失:1.581’)
('Epoch:0/10','Iteration:35','Train loss:2.213')
(‘历元:0/10’、‘迭代:40’、‘列车损失:2.176’)
(‘历元:0/10’、‘迭代:45’、‘列车损失:1.849’)
(‘历元:0/10’、‘迭代:50’、‘列车损失:2.474’)
Val acc:0.017


我以前试过,但是它抛出了
不能压缩dim[1],期望维度为1,对于输入形状为[?,11]的'sparse\u softmax\u cross\u entropy\u loss/remove\u squezable\u dimensions/squese'(op:'squeze')。
at
loss=tf.loss.sparse\u softmax\u cross\u entropy(labels=labels,logits=logits)
更新了答案。我也尝试过(没有使用一个热编码)。。。但是它抛出的
无法为张量“labels:0”提供shape(500,1,1)的值,该张量具有shape'(?,1)
,如果我使用
softmax\u cross\u entropy
,则抛出的
收到的标签值为10,超出了[0,1)。
如果我使占位符
无,1,1
,则抛出
秩不匹配:标签的秩(收到3)应等于logits的秩减1(收到2)。
您必须将标签作为形状
(无,1)
。如何获得额外的维度?对于每个图像,您都有一个标签。