深度学习与图像处理实战-VGG 网络实现猫狗识别_第1页
深度学习与图像处理实战-VGG 网络实现猫狗识别_第2页
深度学习与图像处理实战-VGG 网络实现猫狗识别_第3页
深度学习与图像处理实战-VGG 网络实现猫狗识别_第4页
深度学习与图像处理实战-VGG 网络实现猫狗识别_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VGG网络实现猫狗识别深度学习与图像处理实战知识要点6.1VGG网络简介6.2数据集介绍及处理6.3主干网络搭建与训练6.4模型训练结果测试目录6.1VGG网络简介VGG网络是英国牛津大学的视觉几何组(VisualGeometryGroup)提出的,该网络主要证明了增加网络的深度能够在一定程度上影响网络的最终性能。VGG网络主要有2种结构,分别为VGG16和VGG19,两者并无本质上的区别,只是网络的深度有所改变。VGG16网络结构如图所示。VGG16网络结构6.1VGG网络简介Convolution表示卷积操作,MaxPooling表示最大池化操作,FullyConnected表示全连接操作。VGG16的网络结构大体就是这样,可以发现共有13次卷积操作,即有13个卷积层,再加上3个全连接层,共16层,这也就是VGG16名称的由来。6.2数据集介绍及处理猫狗识别是Kaggle在2014年创建的一个竞赛,猫狗识别数据集(CatsandDogsDataset)解压后可以得到图中的文件。其中test1文件夹是验证集,train文件夹是训练集。图

猫狗识别数据集6.2数据集介绍及处理打开train文件夹,可以看到图所示的图片。图片中猫被命名为cat.x.jpg,狗被命名为dog.x.jpg。接下来会利用此命名规律来区分不同的标签。图

train文件夹中的图片6.2数据集介绍及处理接下来编写代码,读取这些图片进行数据处理,得到可供训练的图片。MNIST数据集中是单通道的28×28的图片,首先需要把图片缩放为同一大小,代码中还实现了一个生成器函数,可以一边训练一边加载图片,避免同时加载大量的图片,造成内存溢出。Python实现数据处理的代码如下。importosimportnumpyasnpimportrandomimportcv2defjoin_path(path,split_=0.9):#获得路径列表image_paths=[os.path.join(path,p)forpinos.listdir(path)]random.shuffle(image_paths)#打乱数据print(image_paths)label=[]#获得标签数组forimage_pathinimage_paths:#根据命名切割字符name=image_path.split('\\')[-1].split('.')[0]#print(label)ifname=='cat':label.append(0)ifname=='dog':label.append(1)#切分训练集和测试集num_len=int(len(image_paths)*split_)

x_train=image_paths[:num_len]y_train=label[:num_len]6.2数据集介绍及处理x_test=image_paths[num_len:]y_test=label[num_len:]returnx_train,y_train,x_test,y_test#定义一个生成器函数defgen_data(x_data,y_data,batch_size):whileTrue:data=[]label=[]forindex,valueinenumerate(x_data):#数据处理image=cv2.imread(value)image=cv2.resize(image,(224,224))data.append(image)label.append(y_data[index])#每次生成一个batch_size的数据iflen(data)==batch_size:data=np.array(data).reshape(-1,224,224,3)/255.label=np.array(label)yielddata,labeldata=[]label=[]6.3主干网络搭建与训练使用Python搭建VGG16网络的代码如下。defVGG16_(inpt):#224×224×3x=Conv2D(64,kernel_size=3,activation='relu',padding='same')(inpt)x=Conv2D(64,kernel_size=3,activation='relu',padding='same')(x)x=MaxPool2D()(x)#112×112×64x=Conv2D(128,kernel_size=3,padding='same',activation='relu')(x)x=Conv2D(128,kernel_size=3,padding='same',activation='relu')(x)x=MaxPool2D()(x)#56×56×128x=Conv2D(256,kernel_size=3,activation='relu',padding='same')(x)x=Conv2D(256,kernel_size=3,activation='relu',padding='same')(x)x=Conv2D(256,kernel_size=3,activation='relu',padding='same')(x)x=MaxPool2D()(x)#28×28×2566.3主干网络搭建与训练x=Conv2D(512,kernel_size=3,activation='relu',padding='same')(x)x=Conv2D(512,kernel_size=3,activation='relu',padding='same')(x)x=Conv2D(512,kernel_size=3,activation='relu',padding='same')(x)x=MaxPool2D()(x)#14×14×512x=Conv2D(512,kernel_size=3,activation='relu',padding='same')(x)x=Conv2D(512,kernel_size=3,activation='relu',padding='same')(x)x=Conv2D(512,kernel_size=3,activation='relu',padding='same')(x)x=MaxPool2D()(x)#7×7×512x=Flatten()(x)#将多维矩阵变成一维向量x=Dense(4096,activation='relu')(x)x=Dense(4096,activation='relu')(x)x=Dense(2,activation='softmax')(x)returnk.models.Model(inpt,x)6.3主干网络搭建与训练注意,卷积层和全连接层进行连接时需要通过Flatten层将数据“压平”,即将多维的数据变成一维向量。同样也可以搭建出VGG19网络。VGG19的网络结构如图所示。具体实现可参照VGG16网络结构搭建代码编写。VGG19的网络结构6.3主干网络搭建与训练在模型训练过程中会出现几个问题。训练时损失值稳定在0.69无法继续下降,推测是由于权重变成非数值(NotaNumber,NaN)之后通过全连接层变成了相同的数值,导致最终每类的概率相同,即准确率在50%左右徘徊。②模型参数过多,显卡无法加载模型而导致显存不足(OutOfMemory,OOM)的情况出现①6.3主干网络搭建与训练可以通过以下修改来解决这些问题。使用BN层。BN层的作用就是将这些偏移或者变动的输入值拉回到均值为0、方差为1的标准正态分布中。这样可以使梯度变大,避免梯度消失。②把Flatten层后面修改为如下代码,以减少全连接层神经元的数量。①使用Python减少全连接层神经元数量的代码如下。x=Flatten()(x)x=Dense(256,activation='relu')(x)x=Dense(256,activation='relu')(x)使用Python调用BN层的代码如下。x=BatchNormalization()(x)6.3主干网络搭建与训练Sigmoid函数将输入x输出到值域(0,1)中,即可以输出一个小于1的概率值。标准正态分布Sigmoid函数最后一层使用Sigmoid激活函数,损失函数选用二元交叉熵,这是因为这个程序实际上是猫狗的二分类,使用“Sigmoid+二元交叉熵”的方法更好。6.3主干网络搭建与训练交叉熵(CrossEntropy,CE)的概念源自信息论,在深度学习中常用于度量真实标签与预测标签之间的差异,差异越小说明模型的学习效果越好。二元交叉熵(BinaryCrossEntropy,BCE)是交叉熵在二分类情况下的简化。二元交叉熵的公式如下:其中,y是二元标签0或者1,p(y)是输出属于y标签的概率。作为损失函数,二元交叉熵是用来评判一个二分类模型预测结果的好坏程度的。例如,对于标签y为1的情况,如果预测值p(y)趋近于1,那么损失函数的值应趋近于0;如果预测值p(y)趋近于0,那么损失函数的值应比较大,这比较符合对数函数的性质。6.3主干网络搭建与训练使用Sigmoid与二元交叉熵的代码如下。x=Dense(1,activation='sigmoid')(x)model=VGG16_(k.Input((224,224,3)))pile(loss='binary_crossentropy',optimizer=k.optimizers.Adam(lr=1e-4),metrics=['acc'])然后就可以开始训练了。使用Python实现模型训练与保存的代码如下。his=model.fit_generator(gen_data(x_train,y_train,batch_size),steps_per_epoch=len(x_train)//batch_size,validation_data=gen_data(x_test,y_test,batch_size),validation_steps=len(x_test)//batch_size,epochs=10)#显示测试准确率plt.plot(his.history['val_acc'])plt.show()model.save('cvd.h5')6.4模型训练结果测试当训练好一个模型之后,就可以进行模型测试了。使用Python实现模型测试的代码如下。预测结果importtensorflow.kerasaskimportcv2label=['cat','dog']#加载模型model=k.models.load_model('cvd.h5')img=cv2.imread('cat.jpg')img_=cv2.resize(img,(224,224)).reshape(-1,224,224,3)/255.#预测p=model.predict(img_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论