前言
刚完成机器视觉的作业(利用预训练好的模型,对花的数据集进行识别),所以就记录一下。本次实验中,我使用的是keras的vgg16模型,然后再添加了三层全连接层对花进行识别,50个epoch后在验证集中的准确率为87.63,不算很好,但有由于确实太耗费时间了,就不太想去重新调参然后训练了,就只能勉强接受了。
我的实验数据是直接在kaggle上下的,链接:Flowers Recognition
VGG16
VGG是Oxford的Visual Geometry Group的组提出的。该网络是在ILSVRC 2014上的相关工作,主要工作是证明了增加网络的深度能够在一定程度上影响网络最终的性能。VGG16共包含16个卷积层(Convolutional Layer),3个全连接层(Fully connected Layer),以及5个池化层(Pool layer),其中,卷积层和全连接层具有权重系数,因此也被称为权重层,总数目为13+3=16,这即是VGG16中16的来源。
VGG16的突出特点是:
1.卷积层均采用相同的卷积核参数。卷积层均表示为conv3-XXX,其中conv3说明该卷积层采用的卷积核的尺寸(kernel size)是3,即宽(width)和高(height)均为3,3*3是很小的卷积核尺寸,结合其它参数(步幅stride=1,填充方式padding=same),这样就能够使得每一个卷积层(张量)与前一层(张量)保持相同的宽和高。XXX代表卷积层的通道数。
2.池化层均采用相同的池化核参数。池化层的参数均为2×。
3.模型是由若干卷积层和池化层堆叠(stack)的方式构成,比较容易形成较深的网络结构(在2014年,16层已经被认为很深了)。
VGG16网络结构:
实验源码及结果展示
源码
其实也很简单,就是直接在keras上调取VGG16模型就行了,不过模型比较大,可能需要下载一会。
import os
import cv2
import random
from tensorflow.python.keras.applications import VGG16, VGG19
from tensorflow.python.keras import Sequential
from tensorflow.python.keras import layers
from tensorflow.python.keras.optimizers import SGD
from tensorflow.python.keras.models import Model
import matplotlib.pyplot as plt
import numpy as np
def get_data():
data = []
labels = []
types = os.listdir('./flowers')
for name in types:
flowers = os.listdir('./flowers' + '/' + name)
for flower in flowers:
img = cv2.imread('./flowers' + '/' + name + '/' + flower)
img