keras实战-猫狗数据-VGG16

本文深入探讨了卷积神经网络的基本原理,包括卷积核的选择与使用,如3x3和1x1卷积核的作用,以及通过堆叠小卷积核提升网络的表达能力。此外,还介绍了图像预处理过程,如减去像素均值,以及使用VGG16模型进行猫狗分类任务的具体实现。
摘要由CSDN通过智能技术生成

原理图

在这里插入图片描述

预处理

图片的预处理就是每一个像素减去了均值,算是比较简单的处理

卷积核

整体使用的卷积核都比较小(3x3),3x3是可以表示「左右」、「上下」、「中心」这些模式的最小单元了。
还有比较特殊的1x1的卷积核(Inception-v1也有这个东西),可看做是空间的线性映射。

前面几层是卷积层的堆叠,后面几层是全连接层,最后是softmax层。所有隐层的激活单元都是ReLU,论文中会介绍好几个网络结构,只有其中一个应用了局部响应归一化层(Local Response Normalisation)。

使用多个较小卷积核的卷积层代替一个卷积核较大的卷积层,一方面可以减少参数,另一方面作者认为相当于是进行了更多的非线性映射,可以增加网络的拟合/表达能力

# -*- coding: utf-8 -*-
"""
Created on 2019/7/30 19:31
@Author: Johnson
@Email:593956670@qq.com
@File: catvsdog-02.py
"""
import os
import numpy as np
from keras.models import Sequential,Model
from keras import layers
from keras.preprocessing.image import ImageDataGenerator
from keras import optimizers
from keras.applications.vgg16 import VGG16
from keras.utils.np_utils import to_categorical
from scipy.misc import imread,imresize
import matplotlib.pyplot as plt

imgs = []
labels = []
img_shape = (150,150)
#image generator
files = os.listdir('data/test')
#read 1000 files for the generator
for img_file in files[:10000]:
    img = imread("data/test"+img_file).astype("float32")
    img = imresize(img,img_shape)
    imgs.append(img)


imgs = np.array(imgs)

train_gen = ImageDataGenerator(
    rescale=1./255.,
    featurewise_center=True,
    featurewise_std_normalization=True,
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2,
horizontal_flip=True
)
val_gen = ImageDataGenerator(
     # rescale = 1./255,
     featurewise_center=True,
     featurewise_std_normalization=True)

train_gen.fit(imgs)
val_gen.fit(imgs)

#4500 training images
train_iter = train_gen.flow_from_directory("data/train",classes="binary",target_size=img_shape,batch_size=16)
#501 validation images
val_iter = val_gen.flow_from_directory("data/val",classes="binary",target_size=img_shape,batch_size=16)
'''
# image generator debug
for x_batch, y_batch in img_iter:
    print(x_batch.shape)
    print(y_batch.shape)
    plt.imshow(x_batch[0])
    plt.show()
'''
#######
#创建模型
#######

#finetune from the base model VGG16
base_model = VGG16(include_top=False,weights='imagenet',input_shape=(150,150,3))
base_model.summary()

out = base_model.layers[-1].output
out = layers.Flatten()(out)
out = layers.Dense(1024,activation="relu")(out)
#因为前面输出的dense feature 太多了,我们这里加入Dropout,layer来防止过拟合
out = layers.Dropout(0.5)(out)
out = layers.Dense(512, activation='relu')(out)
out = layers.Dropout(0.3)(out)
out = layers.Dense(1, activation='sigmoid')(out)
tuneModel = Model(inputs=base_model.input, outputs = out)
for layer in tuneModel.layers[:19]: # freeze the base model only use it as feature extractors
    layer.trainable = False
tuneModel.compile(loss='binary_crossentropy', optimizer=optimizers.RMSprop(lr=1e-4),
        metrics=['acc'])

history = tuneModel.fit_generator(
        generator=train_iter,
        steps_per_epoch=100,
        epochs=100,
        validation_data=val_iter,
        validation_steps=32
        )

acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(1,101)
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'r', label='Validation acc')
plt.legend()
plt.figure()
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'r', label='Validation loss')
plt.legend()
plt.show()

Keras是一个基于Python开发的深度学习库,可以方便地创建和训练神经网络模型。CIFAR-10是一个用于图像分类的数据集,包含了10个不同类别的60000张32x32像素彩色图像。 VGG是一种经典的卷积神经网络模型,它在图像分类任务上具有很高的准确率。使用Keras对CIFAR-10数据集进行VGG模型的图像分类,可以通过以下步骤实现: 1. 首先,需要导入所需的Keras库和模块,包括导入CIFAR-10数据集。 2. 然后,可以创建一个顺序模型,该模型将用于构建VGG网络。 3. 在创建模型时,需要添加一系列的卷积层和池化层。对于VGG模型,常用的是使用多个卷积层和池化层的组合。 4. 在最后几层,可以添加全连接层和输出层,用于分类预测。可以根据具体情况设置神经元数量。 5. 在模型完成构建后,需要编译模型并选择适当的损失函数和优化器。对于图像分类,常用的是交叉熵损失函数和Adam优化器。 6. 接下来,可以使用训练集对模型进行训练。可以选择合适的批次大小和迭代次数,并使用模型的fit()函数进行训练。 7. 训练完成后,可以使用测试集对模型进行评估,并计算模型的准确率。 8. 最后,可以使用模型对新的图像进行预测,并得到图像的分类结果。 总之,使用Keras对CIFAR-10图像分类中的VGG模型,可以根据上述步骤实现。这样可以构建一个强大的深度学习模型,用于对CIFAR-10数据集中的图像进行准确的分类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值