python - 神经网络中不断减少的损失
问题描述
我的神经网络接收一个(1000, 1000, 5)
形状数组,它在一个分支中进行卷积(5 个堆叠的光栅图像)和一个(12)
形状数组(只有 12 个数字),它在第二个分支中经过几个密集层。
输出被连接成一个(31, 31, 65)
形状张量,然后去卷积成一个最终的(1000, 1000)
形状数组。
我的问题:
我制作了自己的简单损失函数(平均误差),因为输出代表一个区域的温度。我目前的问题是,我的损失在 200 多个时期内显着下降(两者都是loss
和val_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
问题
正如我上面解释的那样,我的损失永远不会稳定,并且准确率在各个时期大致徘徊在相同的数字附近。
编辑:
自从写了这个问题以来,我尝试过:
- 将层从卷积分支转移到反卷积分支。
BatchNormalization()
在每Conv2DTranspose()
一层之后添加。
解决方案
推荐阅读
- mongodb - 支持将字节类型表示为十六进制字符串的 GRPC 测试客户端 GUI?
- testing - 执行赛普拉斯测试时出现 ReferenceError 'process not defined'
- php - 当前刀片文件的显示名称
- android - 为 Android 运行 React-Native 应用程序时构建失败,@react-native-async-storage:extractReleaseAnnotations
- excel - 如何用Excel公式将单个单元格的几个括号数字相加?
- node.js - 如何使用 connect mongo 在请求之外更新快速会话?
- excel - Excel-VBA - 将 Excel 范围数据写入 Word 表并进行计算
- python - python,验证自定义返回类型
- java - 将客户端-服务器从 UDP 迁移到 TCP
- php - PHP include_path 是否使用工作目录作为后备?