如何在tensorflow中为导入的图像手动创建标签列表

如何在tensorflow中为导入的图像手动创建标签列表,tensorflow,Tensorflow,假设只有2个类,批量大小为2,logits是[2,2]张量,我如何制作“onehot”变量列表,其中包含一个热编码标签,如图像0,1,2.jpg的[1,0],以及图像3,4.jpg的[0,1]。非常感谢:) 如果您知道需要标签=[1,1,1,0,0],只需使用 tf.one\u热(标签,深度=2) 结果为一个热标签的张量: 数组([[0,1.], [ 0., 1.], [ 0., 1.], [ 1., 0.], [1,0.]],dtype=float32) 注:将1放入第一次输入所指示

假设只有2个类批量大小为2logits是[2,2]张量,我如何制作
“onehot”
变量列表,其中包含一个热编码标签,如图像0,1,2.jpg的[1,0],以及图像3,4.jpg的[0,1]。非常感谢:)

如果您知道需要
标签=[1,1,1,0,0]
,只需使用

tf.one\u热(标签,深度=2)
结果为一个热标签的张量:

数组([[0,1.],
[ 0.,  1.],
[ 0.,  1.],
[ 1.,  0.],
[1,0.]],dtype=float32)
注:将
1
放入第一次输入所指示的索引中。还要注意,这是一个张量,所以如果你在笔记本上运行它,然后尝试打印张量,你会得到如下结果:


直到对它进行评估,它才接受上面所示的值,但TensorFlow就是这样做的

因此,如果批处理大小为2,则每个培训步骤将向网络中提供两个标签,然后将这些标签(在培训步骤中或在网络中)转换为一个热标签。我会这样做:

labels=tf.placeholder(tf.int32,[None])#“None”表示它有一个由批大小决定的维度
# ... 定义您的网络。。。
损耗op=tf.nn.softmax\u交叉熵与logits(logits=logits,
标签=tf.1_热(标签))
损失率=tf.减少平均值(损失率)
然后在培训过程中:

用于范围内的(数值):
d=#生成数据批处理
t=#生成标签批处理,例如前两个图像的[1,1]
_,批次损耗=连续运行([列车运行,损耗运行],
feed_dict={data:d,labels:t})
如果您知道需要
标签=[1,1,1,0,0]
,只需使用

tf.one\u热(标签,深度=2)
结果为一个热标签的张量:

数组([[0,1.],
[ 0.,  1.],
[ 0.,  1.],
[ 1.,  0.],
[1,0.]],dtype=float32)
注:将
1
放入第一次输入所指示的索引中。还要注意,这是一个张量,所以如果你在笔记本上运行它,然后尝试打印张量,你会得到如下结果:


直到对它进行评估,它才接受上面所示的值,但TensorFlow就是这样做的

因此,如果批处理大小为2,则每个培训步骤将向网络中提供两个标签,然后将这些标签(在培训步骤中或在网络中)转换为一个热标签。我会这样做:

labels=tf.placeholder(tf.int32,[None])#“None”表示它有一个由批大小决定的维度
# ... 定义您的网络。。。
损耗op=tf.nn.softmax\u交叉熵与logits(logits=logits,
标签=tf.1_热(标签))
损失率=tf.减少平均值(损失率)
然后在培训过程中:

用于范围内的(数值):
d=#生成数据批处理
t=#生成标签批处理,例如前两个图像的[1,1]
_,批次损耗=连续运行([列车运行,损耗运行],
feed_dict={data:d,labels:t})

如果您的输入数组是NumPy数组,则可以使用
np.eye

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))

结果是:[[0.1.]、[0.1.]、[0.1.]、[1.0.]、[1.0.]

如果您的输入数组是一个NumPy数组,则可以使用
np.eye

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))

结果是:[[0.1.]、[0.1.]、[0.1.]、[1.0.]、[1.0.]

感谢您的回复,我已经尝试过了,但正如我所说,logits变量形状是[2,2],您的解决方案将生成[5,2]的一个热形状。它正在抛出一个错误值error:两个形状中的维度0必须相等,但对于输入形状为[2,2],[5,2]的“SoftmaxCrossEntropyWithLogits”(op:“SoftmaxCrossEntropyWithLogits”)而言,维度0为2和5。我遗漏了什么吗?不可能,只要将特定批次的标签输入网络即可。我将更新答案以反映这一点。@yinyang我更新的目的是展示如何以我认为您想要的方式使用它。我没有运行此操作,因此您可能会从占位符的定义中得到标注错误。如果是这样,请尝试
tf.placeholder(tf.int32,[None])
。感谢您的回复,我已经尝试过了,但正如我所说的,logits变量形状是[2,2],您的解决方案将使[5,2]成为一个热形状。它正在抛出一个错误值error:两个形状中的维度0必须相等,但对于输入形状为[2,2],[5,2]的“SoftmaxCrossEntropyWithLogits”(op:“SoftmaxCrossEntropyWithLogits”)而言,维度0为2和5。我遗漏了什么吗?不可能,只要将特定批次的标签输入网络即可。我将更新答案以反映这一点。@yinyang我更新的目的是展示如何以我认为您想要的方式使用它。我没有运行此操作,因此您可能会从占位符的定义中得到标注错误。如果是这样,请尝试使用
tf.placeholder(tf.int32[None])