python深度学习

本文探讨了在小型数据集上训练卷积神经网络,利用预训练网络进行特征提取和模型微调。通过Keras在猫狗分类数据集上实践,展示了过拟合问题及解决方案,如数据增强、dropout和L2正则化。通过特征提取和模型微调,最终验证精度提升至96%。
摘要由CSDN通过智能技术生成

在小型数据集上训练卷积神经网络,本文用到的数据集来自于sklearn中的猫狗分类,但是只用了其中的4000数据,其中2000张用于训练,1000张用于验证,1000张用于测试。
想要在小型图像数据集上训练,一种常见的且非常高效的方法就是使用预训练网络,这种网络是一个保存好的,之前已经在大型数据集上训练好的网络。使用与训练网络一般有两种方法,特征提取和模型微调。
其中特征提取又有两种方法:一种是在本地数据集上运行卷积基,将输出保存成numpy数组,然后以这个数组数据作为输入,训练全连接层。这种方式运行速度快,但是不能做数据增强。
第二种方式就是在卷积基的顶部添加dense层来扩展已有模型,并在本地数据集上端到端的训练整个模型,这个好处是可以做数据增强,但是速度很慢。
特征提取的第一种实现方式的训练和验证精度如下所示:
在这里插入图片描述
训练和验证的损失如下所示:
在这里插入图片描述
由上面两张图可以看到出现了过拟合的问题,训练精度随着时间线性增加,直到接近100%,而验证精度则停留在70%左右,这是因为样本数较少导致的。解决过拟合的问题是数据增强、dropout层、L2正则化等。
正则化就是模型在训练过程中,调节模型允许存储的信息量,如果一个模型智能记住几个模式,那么优化过程会迫使模型记住最重要的模式,从而得到良好的泛化能力。
正则化实施的第一个方法是:降低网络大小,从而降低模型的记忆容量,但是问题就出现在最佳层数或者每层最佳大小的确定
正则化的第二个实施方法是:添加权重正则化。一般地,给定一些训练数据和一种网络架构,很多组权重值都可以解释这些数据,那么简单模型回避复杂模型更不容易过拟合。这里的简单模型是指熵值更小的模型。依照这个思路,一种常见的解决方法就是向网络中添加与较大权重值相关的成本,这个成本可以与权重值正比,叫做L1正则化,或者与权重值的平方成正比,叫做L2正则化。
dropout是在训练时随机将该层的一些输出特征舍弃掉。

'''
@author: liuyunsheng
@file: Cat_Dogs.py
@time: 2019/5/20 14:34
@desc: 本例是作猫狗的分类任务,使用的数据集中包含4000张猫和狗的图像,将其中2000张用于训练,1000张用于验证,1000张用于测试
'''
import os, shutil
from keras import layers
from keras import models
from keras import optimizers
from keras.preprocessing.image import ImageDataGenerator
from keras.preprocessing import image
import matplotlib.pyplot as plt
# 步骤1:划分数据集
original_dataset_dir = 'E:\\BaiduNetdiskDownload\\kaggle\\dogsvscats\\train'
base_dir = 'G:\\Document\\电子书\\5月重点看\\cats_and_dogs_small'
# 判断文件夹是否存在,不存在的话就新建文件夹
if not os.path.exists(base_dir):
    os.mkdir(base_dir)
train_dir = os.path.join(base_dir, 'train')
if not os.path.exists(train_dir):
    os.mkdir(train_dir)
validation_dir = os.path.join(base_dir, 'validation')
if not os.path.exists(validation_dir):
    os.mkdir(validation_dir)
test_dir = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值