个人分类: PythonCNN
1.震荡: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)
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
(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,即沿着通道轴规范化。
在输入,权值以及网络响应上添加噪声
因为我们在初始化网络的时候一般都是初始为较小的权值。训练时间越长,部分网络权值可能越大。如果我们在合适时间停止训练,就可以将网络的能力限制在一定范围内。训练时间长可能会错过最佳点。
earlyStopping=kcallbacks.EarlyStopping(monitor='val_loss', patience=10,
verbose=1,mode='auto')
history = model.fit(callbacks=earlyStopping)
model.add(Dense(1, activation='sigmoid',
kernel_regularizer=regularizers.l2(0.01),
activity_regularizer=regularizers.l1(0.001)))