数学建模社区-数学中国

标题: 使用卷积神经网络开发图像分类模型 [打印本页]

作者: 1047521767    时间: 2021-10-29 17:31
标题: 使用卷积神经网络开发图像分类模型
                                                   使用卷积神经网络开发图像分类模型4 X0 p; }7 j- I, k; z/ {5 D& }
简介
$ o" @- O' ~7 j4 r; l0 U
( M9 P- j+ F/ I/ L" }6 x这篇文章是关于卷积网络、它的工作和组件: 在本文中,我们将使用卷积神经网络执行图像分类,并详细了解所有步骤。因此,如果你对此不熟悉,请继续阅读。
0 u! `9 R5 t2 q, a6 M
, B; `4 S" \8 q! E9 A简而言之,CNN 是一种深度学习算法,也是适用于图像和视频的神经网络类型之一。我们可以从 CNN 中实现各种功能,其中一些是图像分类、图像识别、目标检测、人脸识别等等。
+ i2 G% k9 ]' x) W! U7 _2 \' U  O6 J& k5 E' N; o3 U" z
今天,我们将对CIFAR10 数据集执行图像分类,它是 Tensorflow 库的一部分。它由各种物体的图像组成,如船舶、青蛙、飞机、狗、汽车。该数据集共有 60,000 张彩色图像和 10 个标签。现在让我们进入编码部分。
9 s! S1 c( u( ]7 z( B% [1 z
$ L8 r' L% p3 a8 @+ s" A" ^实施
: b  T$ v# q  k; I+ q# B# z6 [; J
- y, ~9 B( \0 F# importing necessary libraries- [" f' y7 H+ f0 N* @3 r1 G
import numpy as np6 r# u+ ~2 W4 Y6 X2 |* c
import matplotlib.pyplot as plt3 U9 k( b" X2 J: p- O5 ^) z
%matplotlib inline
, ]$ k1 e% I" Y7 S. ]# To convert to categorical data
) V  Q/ P6 T( tfrom tensorflow.keras.utils import to_categorical
! ?# A+ @6 U9 Z7 K8 T( z6 k: f#libraries for building model
3 P2 u- ^; [% c' }2 J: C# ofrom tensorflow.keras.models import Sequential* q! A* [; M% N! a- r: _
from tensorflow.keras.layers import Dense, Conv2D, MaxPool2D, Dropout,Flatten, @2 D1 i/ Y- Q  U7 [$ {
from tensorflow.keras.datasets import cifar10
. x6 @5 V; ~6 E% y4 b* b
% p& V8 N2 G+ Q#loading the data
) u5 I; c) `" r7 j; Y- x(X_train, y_train), (X_test, y_test) = cifar10.load_data()- b& ~( \0 X( _$ z
# ^) b5 \. k! `7 {! L2 G0 B  n! m; b
探索性数据分析
# C+ T; n2 k/ P#shape of the dataset
* i! o/ ?- x5 }' e4 g9 c( D& yprint(X_train.shape)5 p* r6 e" r! u* |( d/ n0 Q
print(y_train.shape)7 S( C7 D5 \& m1 j
print(X_test.shape)2 H5 T3 |0 E5 j( H# X
print(y_test.shape)
( T+ o0 F1 ^4 U# [" }3 C" }# k0 T* A$ h! J1 [0 E: T
! f1 o# i# I5 O4 E
我们的训练数据有 50,000 张图像,测试数据有 10,000 张图像,大小为 32*32 和 3 个通道,即 RGB(红、绿、蓝)' ^3 a( v# _8 R* q/ K0 h: z
#checking the labels
7 [$ u  z/ j8 L, E. A  @np.unique(y_train)
5 P0 F6 J! l* g0 e/ L7 j5 \
$ `; e! ?( G3 w: z8 \3 B( ?
2 \. R5 L+ ?7 Y  t& S9 k#first image of training data" w: X. H5 Q$ ]/ k
plt.subplot(121)( Z$ }5 n: _( z7 F4 g5 I# J: Z
plt.imshow(X_train[0])
: q3 D0 {! x4 I7 a0 gplt.title("Label : {}".format(y_train[0]))7 [6 T  r  c& m, y
#first image of test data1 R  @. T8 @1 w8 E3 J9 m% M
plt.subplot(122)% E: Q$ H3 K, I6 {8 S; f3 {+ r
plt.imshow(X_test[0])
  d  L; M& S2 v1 ?; f) Zplt.title("Label : {}".format(y_test[0]));  Z; s7 s- ~1 h. b$ d' @/ N  h

, j$ `5 y* |  j5 U2 z" t
% \/ m/ L( q  C5 A1 X1 Z#visualizing the first 20 images in the dataset
- ~$ Q  L+ e- b0 n# zfor i in range(20):
% I# J6 q" y: l, z    #subplot" @1 u' a) Q: i. l5 `: A* N0 ?* G
    plt.subplot(5, 5, i+1)
' w- f4 e; C2 E, W8 N& o# L6 @/ V    # plotting pixel data
  ?5 M% A5 B) s4 \6 h    plt.imshow(X_train, cmap=plt.get_cmap('gray'))
, P  ]5 h, n+ v1 H6 h+ ]* @" G8 l# show the figure
4 q- F) m  c( W: Z4 rplt.show()
$ d: E4 L$ t7 S2 D" R9 H& e' y* k7 m* x
" y$ d9 @; b* x1 u5 U
预处理数据

对于数据预处理,我们只需要在这里执行两个步骤,首先是缩放图像的像素值到0到1之间,然后是将标签从 2D 重塑为 1D

4 @9 a& T* t7 W2 m+ U
# Scale the data to lie between 0 to 1
; D! E; g2 n8 F1 \: tX_train = X_train/255
( A- S/ v) @" ]( E' P2 C; KX_test = X_test/255
; C& |% P, ]4 P  w0 x3 T2 zprint(X_train)% r& `8 B! X' v& a& O
: L: ]0 o' A) B/ D0 Q, p
, ?. `- T1 D! f3 E
#reshaping the train and test lables to 1D/ I1 J4 I' M0 ]5 M9 w' ?# e
y_train = y_train.reshape(-1,)
4 Q+ U3 b. S' {$ L  E6 @% H- q) t3 Oy_test = y_test.reshape(-1,)
' |+ B1 D( k# M' h) y4 K: @- i9 l1 r6 K7 [
我们在上图中可以看到,图像的像素值已经进行了缩放,其数值在 0 到 1 之间,并且标签也进行了重塑。数据已准备好建模,现在让我们构建 CNN 模型。
  P! }5 }* z$ w' \( J6 p% z模型搭建

正如我们之前讨论的,深度学习模型的构建分为 5 个步骤,即定义模型、编译模型、拟合模型、评估模型和进行预测,这也是我们在这里要做的。


6 P: F9 K' f5 ^& i# Q& m6 [0 dmodel=Sequential()
/ T7 _# ^- n) T; p% r#adding the first Convolution layer- W3 G5 Q& W$ [, F8 r9 H
model.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))
8 U. e  H5 r1 T" h* N#adding Max pooling layer
5 n; y5 ?8 V3 o! I; S+ ?, _model.add(MaxPool2D(2,2)); ~) ]5 }/ s" ^2 M& \$ u- Z
#adding another Convolution layer; e/ S: d) \) a& n4 S$ K" P
model.add(Conv2D(64,(3,3),activation='relu'))
  K9 f/ k8 J5 x2 W/ Ymodel.add(MaxPool2D(2,2))2 X3 C* f0 O% u- q" Q- M
model.add(Flatten())* _) U( u" T9 K& f' U. x) r0 w  l! O/ L
#adding dense layer: Y8 {6 f& L# b5 ~8 t5 E
model.add(Dense(216,activation='relu'))( x2 M! S( K+ x& O
#adding output layer# ?. O% I: m% r$ r
model.add(Dense(10,activation='softmax'))
# b& r2 T2 l- k7 n( W" c" V
1 q/ S+ q7 l5 A; B' P( F- B我们添加了第一个带有 32 个大小为 (3*3) 的过滤器的卷积层,使用的激活函数是 Relu,并为模型提供输入形状。( S1 o# S1 z2 q( F% U/ ^

- C; y! t5 Y5 O$ a1 o接下来添加了大小为 (2*2)的Max Pooling 层。最大池化有助于减少维度。CNN 组件的解释请参考:https://www.analyticsvidhya.com/blog/2021/08/beginners-guide-to-convolutional-neural-network-with-implementation-in-python/
3 m4 K" K: G. q' E) U9 K" ~1 U- p' Z# h/ m7 `
然后我们又添加了一个卷积层, 其中包含 64 个大小为(3*3) 的过滤器 和一个大小为 (2*2)的 最大池化层
$ u% ~6 O9 b3 P8 |$ E2 C7 i6 Z7 U/ c4 Z) n  `: u
在下一步中,我们将层展平以将它们传递到 Dense 层,并添加了一个包含 216 个神经元的Dense 层。
0 B$ p5 v, M! _1 P  X- v' E' }& j8 X5 E; {
最后,输出层添加了一个 softmax 激活函数,因为我们有 10 个标签。) X2 u+ d% m* d
4 r+ F; Z0 u. c; B7 D
第 2 步:编译模型
( j( h/ `8 m" ^5 lmodel.compile(optimizer='rmsprop',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
( R) R' a8 H2 b, d1 j
2 k1 i8 v% c, |4 C( ^/ x5 l& U9 ~8 Y3 _第 3 步:拟合模型model.fit(X_train,y_train,epochs=10). a# w+ Z8 X, ^, D" G- Q" B" m

4 Q8 |' z* |! z5 z  {+ _' k9 \* H! Z; C0 H5 M
如上图所示,我们的准确率为 89%,损失为 0.31。让我们看看测试数据的准确性。
7 G# j, G. \+ V1 e: l" B第 4 步:评估模型model.evaluate(X_test,y_test)
: z0 U1 S4 n, A  }( f8 S
5 K% C' m% [! ?$ M: @4 y) Y/ T/ q# L/ A: c) u  }. A3 T
测试数据的准确率为 69%,与训练数据相比非常低,这意味着我们的模型过度拟合。7 z: y& r5 x% g  @
第 5 步:进行预测! r8 ]4 R$ P" r* X
pred=model.predict(X_test)
; K; k, e) w! d! a2 X#printing the first element from predicted data
: S& A; O8 y) L" p' Q! O  k8 G# Cprint(pred[0])4 G1 U" I% }& X5 B8 I+ X( S) @
#printing the index of 2 I5 K5 k- O! }4 w& {
print('Index:',np.argmax(pred[0]))9 _2 P. N' y, p

9 g& ]0 R' g% V& |) q8 E' T4 [% t
8 F2 V( f5 j( S

因此,预测函数给出的是所有10个标签的概率值,概率最高的标签是最终预测。在我们的例子中,我们得到了第三个索引处的标签作为预测。

将预测值与实际值进行比较以查看模型执行的正确程度。

在下图中,我们可以看到预测值与实际值的差异。

y_classes = [np.argmax(element) for element in pred]6 P) z0 x8 }0 f1 X3 Q- R8 _
print('Predicted_values:',y_classes[:10])
7 `! {5 W9 d" [, E2 o8 Qprint('Actual_values:',y_test[:10])
  ]1 P) D- w" a9 M
6 T6 _7 J: ]9 g$ Q
5 V& T" k+ f) d" v4 P

当我们看到我们的模型过度拟合时,我们可以使用一些额外的步骤来提高模型性能并减少过度拟合,例如向模型添加 Dropouts或执行数据增强,因为过度拟合问题也可能是由于可用数据量较少。

在这里,我将展示我们如何使用 Dropout 来减少过拟合。我将为此定义一个新模型。

$ h7 j3 ?( y0 S# Y) P
model4=Sequential()
2 ?$ I' g, k3 \9 U* g+ U5 d#adding the first Convolution layer
) N" Y/ @9 M/ [- nmodel4.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))! ?; G$ u! [' q! X" _$ }
#adding Max pooling layer
4 i$ j4 _5 X9 N, \% Emodel4.add(MaxPool2D(2,2))3 J; V$ [4 A0 ]) t. \% y' q! E. C! h0 F
#adding dropout
7 u( \0 B3 O" a4 V$ ]6 ?model4.add(Dropout(0.2))1 O6 W0 y0 u& J& B2 N/ b/ g
#adding another Convolution layer
2 K- i" W/ ]/ ~& b' g# z4 k" Q4 dmodel4.add(Conv2D(64,(3,3),activation='relu'))
3 n% Z5 l/ c! G4 G9 L* Mmodel4.add(MaxPool2D(2,2)), O4 {% I: a( A. Y: F% r( n1 a
#adding dropout
6 G5 ]7 }0 o8 imodel4.add(Dropout(0.2))$ c. ^1 ^1 Q& @( D2 t! D
model4.add(Flatten())
3 j' M% I5 b' s: q* j#adding dense layer
" l- l$ K3 Y, y% R% w1 t3 Ymodel4.add(Dense(216,activation='relu'))
( \" l! X6 h2 a- }" W#adding dropout
* }% Y7 I; [' p; {5 Lmodel4.add(Dropout(0.2))8 i% S9 M  W3 q- V0 X: k1 `
#adding output layer
. t0 V: G: c5 J# `3 B: Vmodel4.add(Dense(10,activation='softmax'))9 J5 J8 l2 ^% h9 F: }4 z# Y6 z
model4.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy']), ?2 r& o  Q* _: N" z3 H) @3 H6 y
model4.fit(X_train,y_train,epochs=10)
6 o6 J' v! n& [. _0 J
. s2 L+ ^+ a) [) h" J1 P% O# ^+ S( {9 ]: H/ Q3 o" |' j" U7 G
model4.evaluate(X_test,y_test)
- [. L1 e! f' Y3 ~( q. C  h/ G( Z
, P2 S) h- W( {, E% ]通过这个模型,我们得到了76%的训练准确率(低于第一个模型),但我们得到了72%的测试准确率,这意味着过拟合的问题在一定程度上得到了解决。
8 W4 T( s! i- M# c/ n
$ M' _1 P# q% S& }尾注& d/ S8 e, c7 |- P; m* [  ?
这就是我们在 Python 中实现 CNN 的方式。这里使用的数据集是一个简单的数据集,可用于学习目的,但一定要尝试在更大和更复杂的数据集上实现 CNN。这也将有助于发现更多挑战和解决方案。
1 i& Z6 b. ~3 S5 f1 D8 W) N! ~. i" T0 r* S  D+ G8 i* `

' \$ `$ y, x1 m& S" U2 i  K4 R* M$ T' ^





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5