Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.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
Computer vision 如何在TensorFlow中实现场景标记的像素级分类?_Computer Vision_Classification_Tensorflow_Scene_Labeling - Fatal编程技术网

Computer vision 如何在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实例进行分类一样?如果

我正在使用谷歌的TensorFlow开发一个深度学习模型。该模型应用于分割和标记场景

  • 我使用的是SiftFlow数据集,它有33个语义 具有256x256像素的类和图像
  • 因此,在最后一层,使用卷积和反卷积,我得到了以下张量(数组)[256,256,33]
  • 接下来我想 应用Softmax并将结果与大小的语义标签进行比较 [256,256]
  • 问题:
    我是否应该对最后一层应用平均值或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您不需要重塑,我将更新答案