训练神经网络的一些注意事项(一)

硬搬网络的问题

经典卷积网络的输入一般都是224*224,我们在使用迁移学习的时候,要考虑自己的图片大小,如果我们的图片太小,不能硬搬网络,需要自己利用经典的结构设计适合自己的网络。

总之要遵循这样一个原则:

最后一层特征图的大小一般是7*7左右,最大不会超过9*9,最小不能小于3*3。对于一个网络,最后一个卷积层的输出大小是最重要的。

为什么要进行归一化

特别需要注意的是:

在对图片数据归一化时,直接除以255.0就可以,在对其他数据归一化时,要先对训练集进行归一化,记录下平均值标准差等,然后利用训练集的这些特征对验证集与测试集归一化,切不可对训练集、验证集、测试集分别单独进行归一化,也不可以对所有数据归一化后再划分训练集和验证集,要先划分,再归一化。

sklearn中有相关API,如下:

1
2
3
4
5
6
from sklearn.preprocessing import MinMaxScaler

scalar = MinMaxScaler()
X_train = scalar.fit_transform(X_train)
X_valid = scalar.transform(X_valid)
X_test = scalar.transform(X_test)

样本不均衡问题

如果原始数据各类别样本不均衡,解决方法一般有两个:

  • 使用数据增强,是各类别样本均衡
  • 设置损失权重,让网络更多的关注样本少的类

关于设置损失权重,如果使用keras框架,代码如下:

1
2
3
4
5
6
# 利用sklearn计算权重
from sklearn.utils import class_weight
class_weight = class_weight.compute_class_weight(
"balanced", np.unique(y_train), y_train)

model.fit(X, y_train, batch_size, epochs, class_weight=class_weight)