简单介绍CNN体系结构-自己动手使用VGG-16进行评估


简单介绍CNN体系结构-自己动手使用VGG-16进行评估

VGG16架构

在本文中我们将深入研究所有标准的CNN架构,使其像VGG-16一样简单,或者像Xception一样复杂。在当今世界,卷积神经网络在能力方面已经取得了长足的进步。它可以解决复杂的图像分类任务,甚至是人类无法完成的任务,如对稀有物种狗的分类。在本文中我们将研究VGG-16体系结构。

简单介绍CNN体系结构-自己动手使用VGG-16进行评估

VGG16架构

什么是VGG-16?
VGG-16是一种卷积神经网络体系结构,其名称VGG-16来自于它具有16层的事实。它的层由卷积层,最大池化层,激活层,完全连接层组成。

简单介绍CNN体系结构-自己动手使用VGG-16进行评估

VGG16架构

有13个卷积层,5个最大池化层和3个密集层,这些层总计为21个层,但只有16个权重层。Conv 1的滤波器数量为64,而Conv 2的滤波器为128,Conv 3的滤波器为256,而Conv 4和Conv 5的滤波器为512。VGG-16网络在ImageNet数据集上进行了训练,该数据集具有1400万幅图像和1000个类别,并且达到前5位准确性的92.7%。它通过用较小的3x3滤波器替换第一和第二卷积层中大小为11和5的大型滤波器来超越AlexNet网络。现在,我们将在Keras中使用VGG-16训练图像数据集。

实例

接下来我们需要运行模型来可视化它,我们使用的是Kaggle中的猫和狗数据集。(https://www.kaggle.com/tongpython/cat-and-dog/data)

我们先导入我们需要的部分库,其他部分的库会在我们使用的时候再导入。

<code>import keras
import matplotlib.pyplot as plt
from keras import backend as K
from keras.models import Sequential
from keras.layers import Dense, Conv2D, Flatten, MaxPool2D
from keras.optimizers import Adam,SGD,Adagrad,Adadelta,RMSprop
from keras.utils import to_categorical
/<code>

我们需要使用keras,tensorflow来运行模型并进行可视化,需要使用matplotlib库。

<code>from keras.preprocessing.image import ImageDataGenerator
import numpy as np
trdata = ImageDataGenerator()
traindata = trdata.flow_from_directory(directory="training_set/training_set",target_size=(227,227))
tsdata = ImageDataGenerator()
testdata = tsdata.flow_from_directory(directory="test_set/test_set", target_size=(227,227))/<code>

这是一个名为ImageDataGenerator的keras预处理库,我们在其中预处理数据。在这里,我们将所有图像的大小设置为224x224,因为这是VGG-16网络的标准输入大小。

注意:请使用训练和测试数据集的正确目录。现在,我们将使用Keras Sequential API定义模型。我们将使用卷积层,最大池化层和密集层定义VGG-16网络。

<code>model = Sequential()
model.add(Conv2D(input_shape=(224,224,3),filters=64,kernel_size=(3,3),padding="same", activation="relu"))
model.add(Conv2D(filters=64,kernel_size=(3,3),padding="same", activation="relu"))
model.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))
model.add(Conv2D(filters=128, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=128, kernel_size=(3,3), padding="same", activation="relu"))
model.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))
model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu"))
model.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu"))
model.add(MaxPool2D(pool_size=(2,2),strides=(2,2)))
model.add(Flatten())
model.add(Dense(units=4096,activation="relu"))
model.add(Dense(units=4096,activation="relu"))
model.add(Dense(units=2, activation="softmax"))/<code>

现在我们需要定义优化器和损失函数。

<code>from keras.optimizers import Adam 
opt = Adam(lr=0.001) model.compile(optimizer=opt, loss=keras.losses.categorical_crossentropy, metrics=['accuracy'])/<code>

现在,我们需要训练我们的模型,我们已经使用了两个回调函数(ModelCheckpoint和earlystop),在本文中这不是我们的重点,我不会深入这两个的细节。

<code>from keras.callbacks import ModelCheckpoint, EarlyStopping
checkpoint = ModelCheckpoint("vgg16_1.h5", monitor='val_acc', verbose=1, save_best_only=True, save_weights_only=False, mode='auto', period=1)
early = EarlyStopping(monitor='val_acc', min_delta=0, patience=20, verbose=1, mode='auto')
hist = model.fit_generator(steps_per_epoch=10,generator=traindata, validation_data= testdata, validation_steps=10,epochs=10,callbacks=[checkpoint,early])/<code>

所以我们经过了10个周期的模型训练后已经可以做出我们想要的工作了,显然还可以进行更多次的训练周期以获得更准确的结果。

<code>from keras.preprocessing import image
img = image.load_img("website-donate-mobile.jpg",target_size=(227,227))
img = np.asarray(img)
plt.imshow(img)
img = np.expand_dims(img, axis=0)
from keras.models import load_model
saved_model = load_model("alexnet_1.h5")
output = saved_model.predict(img)
if output[0][0] > output[0][1]:
    print("cat")
else:
/<code>
简单介绍CNN体系结构-自己动手使用VGG-16进行评估

因此,该模型可以正确预测这是一只狗。因此,最终构建了模型,接下来的步骤可能是将其部署到GCP或使用flask,我们最终将在以后的文章中进行介绍。


分享到:


相關文章: