Computer vision 如何在TensorFlow中实现场景标记的像素级分类?
我正在使用谷歌的TensorFlow开发一个深度学习模型。该模型应用于分割和标记场景Computer vision 如何在TensorFlow中实现场景标记的像素级分类?,computer-vision,classification,tensorflow,scene,labeling,Computer Vision,Classification,Tensorflow,Scene,Labeling,我正在使用谷歌的TensorFlow开发一个深度学习模型。该模型应用于分割和标记场景 我使用的是SiftFlow数据集,它有33个语义 具有256x256像素的类和图像 因此,在最后一层,使用卷积和反卷积,我得到了以下张量(数组)[256,256,33] 接下来我想 应用Softmax并将结果与大小的语义标签进行比较 [256,256] 问题: 我是否应该对最后一层应用平均值或argmax,使其形状变成[256256,1],然后循环通过每个像素并分类,就像我对256x256实例进行分类一样?如果
我是否应该对最后一层应用平均值或argmax,使其形状变成[256256,1],然后循环通过每个像素并分类,就像我对256x256实例进行分类一样?如果答案是肯定的,如何,如果不是,还有什么其他选择?要应用softmax并使用交叉熵损失,您必须保持完整批量大小为x 256 x 256 x 33的网络的最终输出。因此,不能使用平均值或argmax,因为这会破坏网络的输出概率 您必须循环遍历所有批处理大小x 256 x 256像素,并对该像素的预测应用交叉熵损失。使用内置函数
tf.nn.sparse\u softmax\u cross\u entropy\u和\u logits(logits,labels)
可以轻松实现这一点
应用以下代码前的一些警告:
- 警告:此op需要无标度logits,因为它在内部对logits执行softmax以提高效率。不要使用softmax的输出调用此op,因为它将产生不正确的结果李>
- logits和必须具有形状[batch\u size,num\u classes]和数据类型(float32或float64)
- 标签必须具有形状[batch_size]和数据类型int64
批大小*256*256
作为函数所需的批大小。我们将把logits
和labels
重塑为这种格式。
以下是我使用的代码:
inputs=tf.placeholder(tf.float32,[batch_size,256,256,3])#输入图像
logits=推断(输入)#您的形状输出[批量大小,256,256,33](无最终softmax!!)
labels=tf.placeholder(tf.float32[batch_size,256,256])#您的标签的形状为[batch_size,256,256],类型为int64
重塑(logits,[-1,33])#形状[批量大小*256*256,33]
重塑的标签=tf.重塑(标签,[-1])#形状[批次大小*256*256]
损耗=稀疏\u softmax\u交叉\u熵\u与\u逻辑(重塑的\u逻辑、重塑的\u标签)
然后,您可以对该损失应用优化器
更新:v0.10
tf.sparse\u softmax\u cross\u entropy\u与_logits
的组合表明,它现在接受logits
的任何形状,因此无需重塑张量(感谢@chillinger):
inputs=tf.placeholder(tf.float32,[batch_size,256,256,3])#输入图像
logits=推断(输入)#您的形状输出[批量大小,256,256,33](无最终softmax!!)
labels=tf.placeholder(tf.float32[batch_size,256,256])#您的标签的形状为[batch_size,256,256],类型为int64
损耗=稀疏\u softmax\u交叉\u熵\u与逻辑(逻辑、标签)
如果y数据具有形状(?,)
,那么如何将y数据馈送到标签中?我更新了答案,以明确将数据馈送到何处。用y数据馈送标签(形状[batch\u size,256,256]
),然后将其整形为(?,)
,实际上不需要整形/展平登录和标签tf.sparse\u softmax\u cross\u entropy\u with\u logits
可以处理任意形状,只要logits
有一个额外的dim
。您是对的,因为版本0.10您不需要重塑,我将更新答案