【635】语义分割 label 通道与模型输出通道的

mirrors / fengshuanglang / unet 

二分类问题,应该选择sigmoid还是softmax?

为什么 softmax 函数面对二分类问题时可以简化为 sigmoid 函数

  对于语音分割为两类的情况,label 的值为 0 和 1,预测结果也是只有 0 和 1,存在集中可行的情况:

  1. label 放在 1 个通道,模型输出可以是 1 个通道,包含 0 和 1,用 sigmoid 作为最后的激活函数
  2. label 放在 1 个通道,模型输出可以是 2 个通道,0 通道预测 0 类,1 通道预测 1 类,用 softmax 作为最后的激活函数
  3. label 放在 2 个通道,相当于将 0 和 1 的值做 one-hot 编码,模型输出是 2 个通道,0 通道预测 0 类,1 通道预测 1 类,用 softmax 作为最后的激活函数

  对比下来比较容易理解及操作的就是都是 1 个通道,对于自定义 loss 操作起来更加方便

  

  预测:

  输出为 1 个通道,每个像素表示概率值,直接规定大于 0.5 为 1,其他为 0,实现如下:

# Generate predictions for all images in the validation set
from PIL import ImageOps

val_gen = OxfordPets(batch_size, img_size, val_input_img_paths, val_target_img_paths)
val_preds = model.predict(val_gen)

def display_mask(i):
    """Quick utility to display a model's prediction."""
    # val_preds[i], (512, 512, 2)
    # 获取最大值所对应的索引值
    # mask, (512, 512)
 
    # 变化代码 ######################
    # 对数组进行二分计算
    mask = (val_preds[i] > 0.5).astype('uint8')
    # 变化代码 ######################

    img = ImageOps.autocontrast(keras.preprocessing.image.array_to_img(mask))
    img.show()

# Display results for validation image #10
i = 10

# Display input image
img_path = val_input_img_paths[i]
Image.open(img_path).show()

# Display ground-truth target mask
img = Image.open(val_target_img_paths[i])
img.show()

# Display mask predicted by our model
display_mask(i) 

  输出为 2 个通道,通过 argmax 获取概率较高的通道 index(shape 的通道会删掉),然后 expand_dims 到一个通道,实现如下: 

# Generate predictions for all images in the validation set
from PIL import ImageOps

val_gen = OxfordPets(batch_size, img_size, val_input_img_paths, val_target_img_paths)
val_preds = model.predict(val_gen)

def display_mask(i):
    """Quick utility to display a model's prediction."""
    # val_preds[i], (512, 512, 2)
    # 获取最大值所对应的索引值
    # mask, (512, 512)
    
    # 变化代码 ######################
    mask = np.argmax(val_preds[i], axis=-1).astype('uin8')
    mask = np.expand_dims(mask, axis=-1)
    # 变化代码 ######################

    img = ImageOps.autocontrast(keras.preprocessing.image.array_to_img(mask))
    img.show()

# Display results for validation image #10
i = 10

# Display input image
img_path = val_input_img_paths[i]
Image.open(img_path).show()

# Display ground-truth target mask
img = Image.open(val_target_img_paths[i])
img.show()

# Display mask predicted by our model
display_mask(i) 
原文地址:https://www.cnblogs.com/alex-bn-lee/p/15110182.html