首页 > 解决方案 > 神经网络中不断减少的损失

问题描述

我的神经网络接收一个(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

问题

正如我上面解释的那样,我的损失永远不会稳定,并且准确率在各个时期大致徘徊在相同的数字附近。

我很想知道可能的原因和可能的解决方案。 历元损失

编辑:

自从写了这个问题以来,我尝试过:

标签: pythontensorflowkerasdeep-learningloss

解决方案


推荐阅读