如何在Keras中使用具有数据增强的样本权重?

时间:2017-05-15 16:10:38

标签: python machine-learning deep-learning keras theano

我尝试在像素分割任务中使用ImageGenerator的样本加权。

  • 图像和蒙版是numpy数组(634,1,64,64)
  • mask有5个类(编码为0到4)
  • sample_weight是一个数组(634,64,64)
  • 使用.flow为具有相同seed=42batch_size=32
  • 的2个生成器进行数据扩充
  • 使用sample_weight_mode='temporal'
  • 编译的模型
  • Unet模型中的最后3层是:

    conv2d_19 (Conv2D)  (None, 5, 64, 64)     325        
    dropout_18[0][0]                 
    
    conv2d_20 (Conv2D)  (None, 1, 64, 64)     6          
    conv2d_19[0][0]                  
    
    activation_1 (Activation) (None, 1, 64, 64)     0
    conv2d_20[0][0]
    

这会引发错误:

ValueError: Found a sample_weight array with shape (634, 64, 64). In order to use timestep-wise sample weighting, you should pass a 2D sample_weight array.

如果我重塑sample_weight到(634,4096),我会得到:

ValueError: Found a sample_weight array with shape (634, 4096) for an input with shape (32, 1, 64, 64). sample_weight cannot be broadcast.

这是我对如何使用ImageGenerator的误解还是无法处理这种特殊情况?

如果我不使用样本权重,则运行模型并且不会抛出任何错误。

Keras 2.0.4,Theano 0.9

1 个答案:

答案 0 :(得分:1)

Keras样本权重在默认模式下将1D阵列(每个特征一个权重)作为输入,在时间模式下作为2D阵列。时间模式可能适合您,但您需要进行以下更改。基本上,Keras不支持3D权重,因此您必须在输入处展平64x64图像,并在卷积图层之前将张量重塑为2D。

1)将sample_weight重塑为634,4096

2)添加一个输入层,接受4096像素长的平坦图像:Keras现在接受每像素权重,将像素视为时间序列(1D信号)

3)在第一个2D卷积之前添加一个Reshape图层