过拟合处理方法汇总

7 篇文章 0 订阅

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


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

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

  • 增大数据集

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

train_datagen = ImageDataGenerator(
      rescale=1./255,
      rotation_range=40,
      width_shift_range=0.2,
      height_shift_range=0.2,
      shear_range=0.2,
      zoom_range=0.2,
      horizontal_flip=True,
      fill_mode='nearest')

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

import scipy 
from scipy import misc 
import os 
import time 
import glob 
from scipy import ndimage 

def get_image_paths(folder): 
    return glob.glob(os.path.join(folder, '*.png')) 

def create_read_img(filename): 
    im = misc.imread(filename) 
    img_rote_90 = ndimage.rotate(im, 90)  
    scipy.misc.imsave(filename[:-4]+'_90.png',img_rote_90) 
    
    img_rote_180 = ndimage.rotate(im, 180) 
    scipy.misc.imsave(filename[:-4]+'_180.png',img_rote_180) 

    img_rote_270 = ndimage.rotate(im, 270) 
    scipy.misc.imsave(filename[:-4]+'_270.png',img_rote_270) 
img_path = './data_aug/train/M/' 
imgs = get_image_paths(img_path) 
#print (imgs) 

for i in imgs: 
    create_read_img(i)
  • dropout适量增大

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

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

在keras中:

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

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

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

(3)去掉LRN

(4)打乱训练数据

keras.layers.normalization.BatchNormalization(epsilon=1e-06, mode=0, axis=-1, 
                                              momentum=0.9, weights=None,
                                              beta_init='zero', 
                                              gamma_init='one')

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

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

  • 添加噪声

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

  • 添加earlystop

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

earlyStopping=kcallbacks.EarlyStopping(monitor='val_loss', patience=10,
                                       verbose=1,mode='auto')  
history = model.fit(callbacks=earlyStopping) 
  • 添加L2正则化


model.add(Dense(1, activation='sigmoid',
         kernel_regularizer=regularizers.l2(0.01),
         activity_regularizer=regularizers.l1(0.001)))

 

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sun_ching

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值