我的神经网络接收一个(1000, 1000, 5)
形状阵列,该形状阵列在一个分支中卷积(5个堆叠的光栅图像),并接收一个(12)
形状阵列(仅12个数字),该阵列经过两个密集的层第二个分支。
将输出连接成(31, 31, 65)
形状张量,然后将其反卷积为最终的(1000, 1000)
形状数组。
我制作了自己的简单损失函数(平均误差),因为输出表示一个区域的温度。
我目前的问题是,我的损失大大减少了200个纪元(loss
和val_loss
,从一个小数点到大约-3),并且准确度一直徘徊在0.002左右。
我已将学习率更改为1e-5
。我给训练集提供了更多样本(不幸的是,开始时没有太多样本),增加了(因为担心过度拟合)而减少了(由于缺乏数据)批量大小。所有输入数据都归一化为0:1,这使得-1
以外的任何损失都不合理。
我不确定是否应该为此任务使用其他优化器,还是应使用不同的激活,还是仅删除一两个层。但是大多数情况下,我很想了解使模型变得如此不可靠的情况。 我确实尽力避免将整个内容都张贴在这里,但是我正式没有想法。
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
如上所述,我的损失从未稳定下来,准确性在各个时期大致徘徊在相同的数字上。
自从写了这个问题以来,我一直在尝试:
BatchNormalization()
层之后添加Conv2DTranspose()
。