fq=glob.glob("*.jpg") # ['0.jpg','1.jpg','2.jpg','3.jpg','4.jpg'],labels for images=[1,1,1,0,0]
loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=onehot))
假设 2个类且批量大小为2 且 logits为[2,2]张量,我该如何制作"onehot"
变量列表,其中包含一个热门编码标签,例如图像0,1,2 .jpg的 [1,0] 和图像的 [0,1] 3,4 .jpg。非常感谢:))
答案 0 :(得分:0)
如果您知道自己需要labels = [1, 1, 1, 0, 0]
,请使用
tf.one_hot(labels, depth=2)
产生一个单热标签:
array([[ 0., 1.],
[ 0., 1.],
[ 0., 1.],
[ 1., 0.],
[ 1., 0.]], dtype=float32)
注意tf.one_hot
将1
放入您提供的第一个输入所指示的索引中。另请注意,这是一个张量,所以如果你在笔记本中运行它然后尝试打印张量,你会得到类似的东西:
<tf.Tensor 'one_hot:0' shape=(5, 2) dtype=float32>
直到评估它是否具有上面显示的值,但这只是TensorFlow的作用。
因此,如果批量为2,则每个培训步骤为网络提供两个标签,然后将这些标签(在培训步骤或网络中)转换为一个标签。我会做类似的事情:
labels = tf.placeholder(tf.int32, [None]) # 'None' means it has one dimension that is determined by your batch size
# ... define your network ...
loss_op = tf.nn.softmax_cross_entropy_with_logits(logits=logits,
labels=tf.one_hot(labels))
loss_op = tf.reduce_mean(loss_op)
然后在你的训练过程中:
for _ in range(num_iter):
d = # generate data batch
t = # generate label batch, e.g. [1, 1] for the first two images
_, batch_loss = sess.run([train_op, loss_op],
feed_dict={data: d, labels: t})
答案 1 :(得分:0)
如果您的输入数组是NumPy数组,则可以使用np.eye
:
label_array = np.array([1, 1, 1, 0, 0])
onehot_array = np.eye(2)[label_array]
结果是:[[0. 1.],[0. 1.],[0。1.],[1. 0.],[1. 0。]]