Keras深度学习——使用预训练VGG16模型实现性别分类

继续创造,加速生长!这是我参与「日新计划 6 月更文应战」的第8天,点击检查活动详情

0. 前语

在运用卷积神经网络进行性别分类的运用中,咱们看到从零开始练习卷积神经网络 (Convolutional Neural Network, CNN) 模型approve时,或许会遇到以下一些问题:

  • 练习数据会集图画数量缺乏,使得模型难appearance以学习
  • 当图画尺度很大时,卷积或许无法学习图画中的一切特征

第一个问题能够经过对增加数据会集的数据量来处理。第二个问题能够appointment经过在更深的网络架构卷积神经网络的工作原理上练习更多的 epoch 来处理。管咱们能够经过执行一切这些操作来处理上述问题,但通常情况下,咱们或许无法获取更多的数据量。在这种情况下,运用预先练习完成的模型进行搬迁学习将能够快速处理上述问题。

1. 搬迁学习

1.1 ImageNet 数据集介绍

在介绍搬迁学习之前,咱们首先了解下 Kera架构图s 中集成的预练习模型所运用的数据集 ImageNet卷积核ImageNet 是一appetite项权深度学习威性的图画识别比赛,要求参与者猜测图画所属类别,数据会集有数百万个图画,其间包括尺度不同的多种类别的图画。有很多的研讨团队参神经网络引擎与了此比赛,他们提出了不同的神经网络模型猜测图画类别。鉴于有数百万个图画,因而数据会集的数据量不成问题,一起研讨团队为了获取优异的模神经网络对信息的存储依赖什么型性能构建了巨大的神经网络网络体系,因而也处理了上述第卷积核二个问题。

1.2 搬迁学习

简略而言,搬迁学习是指将一个预练习的模型架构师工资从头用于另一个使命中。咱们能够重用树立在不同数据集上的卷积神经网络,卷积层已经学习了appearance图画中的各种特征(卷积层由于预练习模型运用了很多的图片,因而这些特征关于一切图画而言都具有极大程度上的通用性),然后将它们传递给全衔接层,以便咱们能够在新的数据会集猜测图画的类。Keras 中提供了多个由不同研讨人员提出的预练习模型,本节咱们将运用 VG卷积的物理意义G16

1.3 运用预练习 VGG16架构是什么意思 模型进行性别分类

在本节中,咱们将学习如何运用 VGG16 预练习网络进行性别分类卷积核。咱们首先检查 VGG16 模型神经网络算法三大类的体系结卷积公式表大全构信息,以便对模型架构有所了解:

Model: "vgg16"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         [(None, 256, 256, 3)]     0         
_________________________________________________________________
block1_conv1 (Conv2D)        (None, 256, 256, 64)      1792      
_________________________________________________________________
block1_conv2 (Conv2D)        (None, 256, 256, 64)      36928     
_________________________________________________________________
block1_pool (MaxPooling2D)   (None, 128, 128, 64)      0         
_________________________________________________________________
block2_conv1 (Conv2D)        (None, 128, 128, 128)     73856     
_________________________________________________________________
block2_conv2 (Conv2D)        (None, 128, 128, 128)     147584    
_________________________________________________________________
block2_pool (MaxPooling2D)   (None, 64, 64, 128)       0         
_________________________________________________________________
block3_conv1 (Conv2D)        (None, 64, 64, 256)       295168    
_________________________________________________________________
block3_conv2 (Conv2D)        (None, 64, 64, 256)       590080    
_________________________________________________________________
block3_conv3 (Conv2D)        (None, 64, 64, 256)       590080    
_________________________________________________________________
block3_pool (MaxPooling2D)   (None, 32, 32, 256)       0         
_________________________________________________________________
block4_conv1 (Conv2D)        (None, 32, 32, 512)       1180160   
_________________________________________________________________
block4_conv2 (Conv2D)        (None, 32, 32, 512)       2359808   
_________________________________________________________________
block4_conv3 (Conv2D)        (None, 32, 32, 512)       2359808   
_________________________________________________________________
block4_pool (MaxPooling2D)   (None, 16, 16, 512)       0         
_________________________________________________________________
block5_conv1 (Conv2D)        (None, 16, 16, 512)       2359808   
_________________________________________________________________
block5_conv2 (Conv2D)        (None, 16, 16, 512)       2359808   
_________________________________________________________________
block5_conv3 (Conv2D)        (None, 16, 16, 512)       2359808   
_________________________________________________________________
block5_pool (MaxPooling2D)   (None, 8, 8, 512)         0         
=================================================================
Total params: 14,714,688
Trainable params: 14,714,688
Non-trainable params: 0
__________________________________________________________________

架构师和程序员的区别模型的架构与咱们在《运用卷积神经卷积积分网络完成性别分类》中练习的 C架构工程师NN 模型相似,首要区别在于该模型更卷积神经网络深,运用了更多的卷积、池化层,VGG16 网络的权重是经过对数百万个图画进行练习而获得的。

咱们在运用预练习模型对图画中的人物进行性别分类时,保证冻住 VGG16 权重的更新。尺度为 256x256x3 的图画经过 VGG16 网络后特征图形状为 8 x 8 x 512。咱们将坚持原始网络中的权重不变,得到 8 x 8 x 512 输出,之后将其经过另一个卷积池化操作,然后经过展平层后,衔接到全衔接层,然后神经网络引擎运用 Sigmoid 激活函数确认图画中人物是男性仍是女人。

本质上,经过架构运用 VGG16 模型的卷积和池化层,咱们运用了在数架构是什么意思以百万计的数据集上练习的卷积核。终究,咱们为要猜测的图片目标架构图怎么画微调 (fine-tuning) 经过这些卷积和池化层得到的输出。

2. 微调模型

2.1 模型完成

本节中,咱们运用 Keras 完成以上分析的搬迁学习策略后。

首先,导入所神经网络的基本原理需库以及预练习appetiteVGG16 模型。咱们不运用 VGG16 模型中的终究一层,即 include_top=False,这是为了之后咱们针对架构工程师要处理的问题微调 VGG16 模型。别的,咱们的指定输入图画形状为 256 X 256 X 3

from keras.applications import VGG16
from keras.applications.vgg16 import preprocess_input
from glob import glob
from skimage import io
import cv2
import numpy as np
from sklearn.model_selection import train_test_split
vgg16_model = VGG16(include_top=False, weights='imagenet', input_shape=(256, 256, 3))

预处理图画数据集。此预处理步骤用于预处理图画数据,以保证appstore其能够作为预练习模型输入。例如,咱们对其间一个名为 img 的图画执行预处理,则运用 preprocess_input 办法apple依据 VGG16 中的预处理要求对图画进行预处理:

from keras.applications.vgg16 import preprocess_input
img = preprocess_input(img.reshape(1,256,256,3))

创立输入和输approach出数据集appearance,首先加载图片,这一进程与卷积神经网络进行性别分类中加载数据的进程相同,然后增加了运用 VGG16 模型提取特征的进程。

咱们经过 VGG16 模型提取每个图画特征,以便咱们获取 VGG16 的输出作为后续微调模型的输入。并且,图片在输入 VGG16 之前需求运用 preprapproachocess_input 办法卷积的物理意义执行预处理进程,如下卷积公式表大全所示:

x = []
y = []
for i in glob('man_woman/a_resized/*.jpg')[:800]:
    try:
        image = io.imread(i)
        x.append(image)
        y.append(0)
    except:
        continue
for i in glob('man_woman/b_resized/*.jpg')[:800]:
    try:
        image = io.imread(i)
        x.append(image)
        y.append(1)
    except:
        continue
x_vgg16 = []
for i in range(len(x)):
    img = x[i]
    img = preprocess_input(img.reshape((1, 256, 256, 3)))
    # 将预处理后的输入传递给 VGG16 模型以提取特征
    img_feature = vgg16_model.predict(img)
    x_vgg16.append(img_feature)

在以上代码中,除了经过 VGG16 模型处理输入图画神经网络是什么外,咱们还将提取到的特征 img_feature 存储在列表 x_vgg16 中,作为后续微调模型的输入。

然后,将输入和输出转换为 NumPy 数组,并创立练习和测试数据集:

x_vgg16 = np.array(x_vgg16)
x_vgg16 = x_vgg16.reshape(x_vgg16.shape[0], x_vgg16.shape[2], x_vgg16.shape[3], x_vgg16.shape[4])
y = np.array(y)
x_train, x_test, y_train, y_test = train_test_split(x_vgg16, y, test_size=0.2)

树立并编译模型:

from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dropout, Dense
model_fine_tuning = Sequential()
model_fine_tuning.add(Conv2D(512, 
                        kernel_size=(3, 3),
                        activation='relu',
                        input_shape=(x_train.shape[1], x_train.shape[2], x_train.shape[3])))
model_fine_tuning.add(MaxPooling2D(pool_size=(2, 2)))
model_fine_tuning.add(Flatten())
model_fine_tuning.add(Dense(512, activation='relu'))
model_fine_tuning.add(Dropout(0.5))
model_fine_tuning.add(Dense(1, activation='sigmoid'))
model_fine_tuning.summary()

微调模型的简要结构信息输入如下:

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 6, 6, 512)         2359808   
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 3, 3, 512)         0         
_________________________________________________________________
flatten (Flatten)            (None, 4608)              0         
_________________________________________________________________
dense (Dense)                (None, 128)               589952    
_________________________________________________________________
dropout (Dropout)            (None, 128)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 129       
=================================================================
Total params: 2,949,889
Trainable params: 2,949,889
Non-trainable params: 0
_________________________________________________________________

编译并拟合模型:

model_fine_tuning.compile(loss='binary_crossentropy',optimizer='adam',metrics=['acc'])
history = model_fine_tuning.fit(x_train, y_train,
                                    batch_size=32,
                                    epochs=20,
                                    verbose=1,
                                    validation_data = (x_test, y_test))

在练习模型后,咱们能够看到模型在测试数据集终究能够很快(大约需求 3-5epoch )达到约 95% 的准确率,神经网络引擎而咱们在卷积神经网络进行性别分类中练习的性别分类 CN架构图怎么制作N 模型在任何情况下都无法在 5epapproachoch 内达到 95% 的分类准确率。:

Keras深度学习——运用预练习VGG16模型完成性别分类

2.2 错误分类的图片示例

模型分类错误的一些图画样本如下:

x = np.array(x)
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
x_test_vgg16 = []
for i in range(len(x_test)):
    img = x_test[i]
    img = preprocess_input(img.reshape((1, 256, 256, 3)))
    img_feature = model.predict(img)
    x_test_vgg16.append(img_feature)
x_test_vgg16 = np.array(x_test_vgg16)
x_test_vgg16 = x_test_vgg16.reshape(x_test_vgg16.shape[0], x_test_vgg16.shape[2], x_test_vgg16.shape[3], x_test_vgg16.shape[4])
y_pred = model_fine_tuning.predict(x_test_vgg16)
wrong = np.argsort(np.abs(y_pred.flatten()-y_test))
print(wrong)
y_test_char = np.where(y_test==0,'M','F')
y_pred_char = np.where(y_pred>0.5,'F','M')
plt.subplot(221)
plt.imshow(x_test[wrong[-1]])
plt.title('Actual: '+str(y_test_char[wrong[-1]])+', '+'Predicted: '+str((y_pred_char[wrong[-1]][0])))
plt.subplot(222)
plt.imshow(x_test[wrong[-2]])
plt.title('Actual: '+str(y_test_char[wrong[-2]])+', '+'Predicted: '+str((y_pred_char[wrong[-2]][0])))
plt.subplot(223)
plt.imshow(x_test[wrong[-3]])
plt.title('Actual: '+str(y_test_char[wrong[-3]])+', '+'Predicted: '+str((y_pred_char[wrong[-3]][0])))
plt.subplot(224)
plt.imshow(x_test[wrong[-4]])
plt.title('Actual: '+str(y_test_char[wrong[-4]])+', '+'Predicted: '+str((y_pred_char[wrong[-4]][0])))
plt.show()

Keras深度学习——运用预练习VGG16模型完成性别分类

能够看到,当输入图画是面部的一部分,或许图画中的面部占整架构师和程序员的区别个图画的比例较小时,则模型或许APP会错误分类。

相关链架构图

Keras深度学习——运用卷积神经网络完成性别分类

发表回复

提供最优质的资源集合

立即查看 了解详情