用于图像转换的Keras CNN,NAN损失

时间:2020-02-17 15:55:31

标签: python tensorflow machine-learning keras conv-neural-network

我正在为图像转换编写CNN(通常使用傅立叶转换和参数集完成)

我在从第一个时期返回NAN的损失函数时遇到了麻烦,我尝试过更改优化器,调整学习率,添加辍学和批量归一化,更改模型的设计,但似乎没有任何效果。

我还确保我的数据本身不包含inf。我的数据集确实包含大量的零,所以不确定是否会影响它。我已将数据标准化为[0,1]

即使我将其简化为仅具有这一层,也会立即造成损失(#个通道= 1,图像尺寸1024x1024):

model.add(Conv2D(1, 1 , activation = 'relu', input_shape = (1,1024, 1024),
                 kernel_regularizer=regularizers.l2(0.01),
                 bias_regularizer=regularizers.l2(0.01))) 

opt = Adagrad(learning_rate = 0.0001, clipvalue = .5)
model.compile(optimizer = opt, loss = 'mean_squared_error',
          metrics= ['acc', 'mse'])

history = model.fit_generator(generator=training_generator,
                steps_per_epoch = 30, verbose = 2,
                epochs = 20)

我正在使用自己的生成器将图像数据的批次馈送到模型中。我目前使用的批量大小仅为2。

当前输出为:

    Epoch 1/20
    - 62s - loss: nan - acc: 0.2009 - mse: nan
    Epoch 2/20
   - 61s - loss: nan - acc: 0.2007 - mse: nan
   Epoch 3/20
   - 62s - loss: 9.5592 - acc: 0.1675 - mse: 0.2778
   Epoch 4/20
   - 61s - loss: nan - acc: 0.2340 - mse: nan
   Epoch 5/20
   - 61s - loss: nan - acc: 0.1172 - mse: nan
   Epoch 6/20
   - 61s - loss: nan - acc: 0.1173 - mse: nan

以此类推

我要建模的问题是使用傅立叶变换和相移将图像变换为全息图,输出图像应具有与输入相同的尺寸(1、1024、1024)

任何帮助或见识将不胜感激,也许我只是缺少一个非常明显的步骤!

1 个答案:

答案 0 :(得分:0)

我认为您的问题来自于您定义模型的方式:

  • 您正在使用mean_squarred_error损失,因此您正在计算图像上每个像素的平方误差!
  • 此外,您正在使用relu激活,因此您的模型可以预测0到inf之间的值。
  • 这两点组合在一起:1024 * 1024的图像,平均误差为50,使您感到茫然无措,以至于NaN。

为我们提供更多有关您要预测的精确度的信息,如果您需要更多有关使用哪种激活/损失的帮助!