过拟合处理方法汇总

过拟合处理方法汇总

个人分类: PythonCNN

1.震荡:batchsize设置过小,建议适当增大


  • 增大batch_size内存利用率以及速度都会提高,但是batchsize过大可能导致内存溢出

  2.val_loss逐渐增大,极大可能为过拟合,可以进行如下操作:

  • 增大数据集

很多时候出现过拟合现象是因为数据集过小而引起的,所以当数据量较小时,增大数据集是最简单粗暴的方法,可以尝试keras 的ImageDataGenerator,在keras中文文档中解释为:用以生成一个batch的图像数据,支持实时数据提升。训练时该函数会无限生成数据,直到达到规定的epoch次数为止。

 
  1. train_datagen = ImageDataGenerator(

  2. rescale=1./255,

  3. rotation_range=40,

  4. width_shift_range=0.2,

  5. height_shift_range=0.2,

  6. shear_range=0.2,

  7. zoom_range=0.2,

  8. horizontal_flip=True,

  9. fill_mode='nearest')

或者直接批量生成扩充数据集:

 
  1. import scipy

  2. from scipy import misc

  3. import os

  4. import time

  5. import glob

  6. from scipy import ndimage

  7.  
  8. def get_image_paths(folder):

  9. return glob.glob(os.path.join(folder, '*.png'))

  10.  
  11. def create_read_img(filename):

  12. im = misc.imread(filename)

  13. img_rote_90 = ndimage.rotate(im, 90)

  14. scipy.misc.imsave(filename[:-4]+'_90.png',img_rote_90)

  15.  
  16. img_rote_180 = ndimage.rotate(im, 180)

  17. scipy.misc.imsave(filename[:-4]+'_180.png',img_rote_180)

  18.  
  19. img_rote_270 = ndimage.rotate(im, 270)

  20. scipy.misc.imsave(filename[:-4]+'_270.png',img_rote_270)

  21. img_path = './data_aug/train/M/'

  22. imgs = get_image_paths(img_path)

  23. #print (imgs)

  24.  
  25. for i in imgs:

  26. create_read_img(i)

  • dropout适量增大

drop最简单的理解为:训练过程中向前传播时,将神经网络某一层的输出节点数据以P的概率随机丢弃一部分,可以理解为随机把一张图片50%的点删除。tensorflow通过一个placehold传入keep_prob比率来控制。

 
  1. x=tf.placeholder(tf,float32,[None,in_units])

  2. keep_prob=tf.placeholder(tf.float32)

在keras中:

model.add(layers.Dropout(0.5))#根据情况设置dropout
  • 添加BN层

(1)可以选用较大学习率,加快收敛速度

(2)使用BN层可以省略掉dropout以及L2

(3)去掉LRN

(4)打乱训练数据

 
  1. keras.layers.normalization.BatchNormalization(epsilon=1e-06, mode=0, axis=-1,

  2. momentum=0.9, weights=None,

  3. beta_init='zero',

  4. gamma_init='one')

在keras中文文档中: 任意,当使用本层为模型首层时,指定input_shape参数时有意义。

其中mode:为0时是特征规范化,为1时是样本规范化。如果输入是形如(samples,channels,rows,cols)的4D图像张量,则应设置规范化的轴为1,即沿着通道轴规范化。

  • 添加噪声

在输入,权值以及网络响应上添加噪声

  • 添加earlystop

因为我们在初始化网络的时候一般都是初始为较小的权值。训练时间越长,部分网络权值可能越大。如果我们在合适时间停止训练,就可以将网络的能力限制在一定范围内。训练时间长可能会错过最佳点。

 
  1. earlyStopping=kcallbacks.EarlyStopping(monitor='val_loss', patience=10,

  2. verbose=1,mode='auto')

  3. history = model.fit(callbacks=earlyStopping)

  • 添加L2正则化
 
  1.  
  2.  
  3. model.add(Dense(1, activation='sigmoid',

  4. kernel_regularizer=regularizers.l2(0.01),

  5. activity_regularizer=regularizers.l1(0.001)))

 

你可能感兴趣的:(python,过拟合)