神经网络中不断减少的损失

时间:2019-12-16 13:00:45

标签: python tensorflow keras deep-learning loss

我的神经网络接收一个(1000, 1000, 5)形状阵列,该形状阵列在一个分支中卷积(5个堆叠的光栅图像),并接收一个(12)形状阵列(仅12个数字),该阵列经过两个密集的层第二个分支。

将输出连接成(31, 31, 65)形状张量,然后将其反卷积为最终的(1000, 1000)形状数组。

我的问题:

我制作了自己的简单损失函数(平均误差),因为输出表示一个区域的温度。 我目前的问题是,我的损失大大减少了200个纪元(lossval_loss,从一个小数点到大约-3),并且准确度一直徘徊在0.002左右。 我已将学习率更改为1e-5。我给训练集提供了更多样本(不幸的是,开始时没有太多样本),增加了(因为担心过度拟合)而减少了(由于缺乏数据)批量大小。所有输入数据都归一化为0:1,这使得-1以外的任何损失都不合理。

我不确定是否应该为此任务使用其他优化器,还是应使用不同的激活,还是仅删除一两个层。但是大多数情况下,我很想了解使模型变得如此不可靠的情况。 我确实尽力避免将整个内容都张贴在这里,但是我正式没有想法。

MLP分支

    dim = 12
    inputs = Input(shape = (dim, ))

    x = inputs
    x = Dense(dim * 4, activation = 'relu')(x)
    x = Dense(dim * 16, activation = 'relu')(x)
    x = Dense(961, activation = 'relu')(x)  # 961 nodes
    x = Reshape((31, 31, 1))(x)  # (31, 31, 1) array

    model1 = Model(inputs, x)

卷积分支

    inputShape = (1000, 1000, 5)
    chanDim = -1
    inputs = Input(shape = inputShape)

    x = inputs

    # layer 1: conv, f = 8, pool = 2
    x = Conv2D(8, (3, 3), padding = 'same', activation = 'relu')(x)
    x = BatchNormalization(axis = chanDim)(x)
    x = MaxPooling2D(pool_size = (2, 2))(x)

    # layer 2: conv, f = 16, pool = 2
    x = Conv2D(16, (3, 3), padding = 'same', activation = 'relu')(x)
    x = BatchNormalization(axis = chanDim)(x)
    x = MaxPooling2D(pool_size = (2, 2))(x)

    # layer 3: conv, f = 32, pool = 2
    x = Conv2D(32, (3, 3), padding = 'same', activation = 'relu')(x)
    x = BatchNormalization(axis = chanDim)(x)
    x = MaxPooling2D(pool_size = (2, 2))(x)

    # layer 4: conv = 64, pool = 4
    x = Conv2D(64, (3, 3), padding = 'same', activation = 'relu')(x)
    x = BatchNormalization(axis = chanDim)(x)
    x = MaxPooling2D(pool_size = (4, 4))(x)

    model2 = Model(inputs, x)

反卷积

    combinedInput = Concatenate()([model1.output, model2.output])
    x = combinedInput  # (31, 31, 65)
    x = Conv2DTranspose(43, (3, 3), strides = (4, 4), padding = 'same', activation = 'relu')(x)  # (124, 124, 43)
    x = Conv2DTranspose(22, (3, 3), strides = (2, 2), padding = 'same', activation = 'relu')(x)  # (248, 248, 22)
    x = Lambda(lambda y: spatial_2d_padding(y))(x)  # (250, 250, 22)
    x = Conv2DTranspose(10, (3, 3), strides = (2, 2), padding = 'same', activation = 'relu')(x)  # (500, 500, 10)
    x = Conv2DTranspose(1, (3, 3), strides = (2, 2), padding = 'same', activation = 'linear')(x)  # (1000, 1000, 1)
    x = Lambda(lambda y: squeeze(y, axis = 3))(x)  # (1000, 1000)

编译

    def custom_loss(y_actual, y_predicted):
        custom_loss_value = mean(y_actual - y_predicted)
        return custom_loss_value

    model = Model(inputs = [mlp.input, cnn.input], outputs = x)
    model.compile(loss = custom_loss, optimizer = Adam(lr = 0.000001), metrics = ['mae'])
    # train with epochs = 200, batch_size = 12

问题

如上所述,我的损失从未稳定下来,准确性在各个时期大致徘徊在相同的数字上。

我很想知道可能的原因和可能的解决方案。 Epoch Loss

编辑:

自从写了这个问题以来,我一直在尝试:

  • Transfering layers从卷积分支到反卷积分支。
  • 在每个BatchNormalization()层之后添加Conv2DTranspose()

0 个答案:

没有答案