zoukankan      html  css  js  c++  java
  • 【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) 
    
  • 相关阅读:
    项目结队开发---NABC分析(成员)
    梦断代码读后感(二)
    梦断代码读后感(一)
    首尾相连的循环数组求其子数组最大值
    子数组求和之大数溢出
    梦断代码读后感——终结
    软件工程结对开发——一维最大子数组求和溢出问题
    结对开发——求环形一维数组最大子数组的和
    结对开发——电梯调度问题需求分析
    软件工程——求二维数组所有子矩阵的和的最大值
  • 原文地址:https://www.cnblogs.com/alex-bn-lee/p/15110182.html
Copyright © 2011-2022 走看看