QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3019|回复: 0
打印 上一主题 下一主题

使用卷积神经网络开发图像分类模型

[复制链接]
字体大小: 正常 放大

1178

主题

15

听众

1万

积分

  • TA的每日心情
    开心
    2023-7-31 10:17
  • 签到天数: 198 天

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-29 17:31 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
                                                       使用卷积神经网络开发图像分类模型" p  J5 w$ T8 D
    简介# H6 \7 T* j& y' z8 k) k

    0 b$ X! h; z# |5 K$ \/ L/ p( k9 z这篇文章是关于卷积网络、它的工作和组件: 在本文中,我们将使用卷积神经网络执行图像分类,并详细了解所有步骤。因此,如果你对此不熟悉,请继续阅读。
    # T1 e* H% c: p+ w$ G0 e5 Z, G: l( U- T: b
    简而言之,CNN 是一种深度学习算法,也是适用于图像和视频的神经网络类型之一。我们可以从 CNN 中实现各种功能,其中一些是图像分类、图像识别、目标检测、人脸识别等等。
    2 r& `) T# p* t8 T& T( ^3 Y
    ( x/ o/ T$ ?3 i+ A% H6 z; W今天,我们将对CIFAR10 数据集执行图像分类,它是 Tensorflow 库的一部分。它由各种物体的图像组成,如船舶、青蛙、飞机、狗、汽车。该数据集共有 60,000 张彩色图像和 10 个标签。现在让我们进入编码部分。' Z2 U& S) [- m  U) e# p
    $ X) _8 \( y, L4 ~% B6 U7 z0 y
    实施
    6 X7 z1 K" N' [  ]. y( V! M6 M8 `2 E0 [/ j
    # importing necessary libraries
    1 O$ k4 C1 x- n' P* i3 gimport numpy as np) n# y- b7 r2 Y% Q" I. d
    import matplotlib.pyplot as plt0 Y  x9 ~7 {, r
    %matplotlib inline( E# X9 P; _9 h
    # To convert to categorical data
    - X, Z% P6 i/ n2 m2 i# gfrom tensorflow.keras.utils import to_categorical
    / r# j0 T  Q6 _+ _. w7 T, d% I! T#libraries for building model
    , \- b) c8 ~& h; v4 |; hfrom tensorflow.keras.models import Sequential
    $ j6 ?, m7 N6 jfrom tensorflow.keras.layers import Dense, Conv2D, MaxPool2D, Dropout,Flatten
    / C! |% l8 R. Ifrom tensorflow.keras.datasets import cifar10
    ! @& F, i6 c9 }" e# t9 j- E6 v8 F8 E& U. R* h' s& j# b
    #loading the data) _* z% }# W( }$ K: u3 s- i
    (X_train, y_train), (X_test, y_test) = cifar10.load_data()
    ( @) J6 G+ _9 ]# L: `, ]& A2 ?5 \
    2 N1 C% q1 {7 I& P, J& l) I$ [探索性数据分析
    " \# G* e8 w5 `" y#shape of the dataset, r/ k) n) Z9 u0 d" \7 z1 ^9 L) {
    print(X_train.shape)
    2 b4 X" _2 j& O9 T: c% \print(y_train.shape)
    & ^' _5 o! v3 ^3 o5 Wprint(X_test.shape)
    ) O9 e1 h& a" H0 Cprint(y_test.shape)  }" J" J/ S% C8 L' @

    & k& S8 W- N) p: c' C& ~
    ' ?; r# w/ m$ ^* z( R$ P3 \- F我们的训练数据有 50,000 张图像,测试数据有 10,000 张图像,大小为 32*32 和 3 个通道,即 RGB(红、绿、蓝)& C1 f( o  N9 f2 z8 a
    #checking the labels
    , a* b4 l& `1 }np.unique(y_train)
    0 v$ }$ X5 b+ J+ m8 r, l
    ' O* b) t; n! n4 L" u. a+ w" U( x0 A, W0 {) M" N& ?- q* k; ]- O
    #first image of training data
    " Z3 \' [4 f1 X9 a3 ~plt.subplot(121)
    : _7 j5 W: o3 z' x) B% |& ~: Uplt.imshow(X_train[0])
    ' W7 h4 R7 Q3 y0 x) p3 pplt.title("Label : {}".format(y_train[0])); p: ?! E5 L; P2 B; V# s- h
    #first image of test data
      |5 A/ E: o( B7 B8 k# iplt.subplot(122)
    : o. b  a! l& R6 n) e$ `plt.imshow(X_test[0])
    : R. n* B6 u. j, U. eplt.title("Label : {}".format(y_test[0]));5 k6 @) b$ g+ @# `; ^: M+ P

    % m% i5 ~& ]$ Q4 g2 x# P6 l2 a3 d
    #visualizing the first 20 images in the dataset! m8 w5 t& o2 f8 z
    for i in range(20):% g- R8 n! ]; m
        #subplot
    ( }+ K5 z; C, k4 b    plt.subplot(5, 5, i+1)
    ! B# s0 n" }) W- a( v    # plotting pixel data
    * S6 e7 U/ W- g1 w4 x    plt.imshow(X_train, cmap=plt.get_cmap('gray'))
    $ R! d7 r! d5 m+ b5 N. o# show the figure
    & f1 J$ K3 T; c/ C$ q8 I+ V  Vplt.show(), W2 K, j1 h6 O

    % C9 s. Q: J' @+ m5 B$ k" z+ o9 [- K8 N7 J
    预处理数据

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


    9 b9 s4 \, ^. V( ~& U3 M# Scale the data to lie between 0 to 1
    9 \" L5 a4 a  M8 V& I6 dX_train = X_train/255
    + z3 K1 ~- e+ M: c0 C# t7 EX_test = X_test/2552 i: Q4 @2 {4 O. Y0 O" \! d& Z0 N7 m/ J
    print(X_train): j' g* b! l0 ]7 }6 e9 W

    2 G6 q# v! M2 f6 M
    ! y# W/ M% j9 L& N8 H4 N, L#reshaping the train and test lables to 1D4 I2 j: Z2 `5 c# S3 S& A' R
    y_train = y_train.reshape(-1,)
    ; {6 M  I0 k7 _" Q9 yy_test = y_test.reshape(-1,)
    9 P5 U6 x! c9 A5 T. C& J6 U+ |5 A% m) D
    我们在上图中可以看到,图像的像素值已经进行了缩放,其数值在 0 到 1 之间,并且标签也进行了重塑。数据已准备好建模,现在让我们构建 CNN 模型。& E' B5 w# w% x$ P4 r( T
    模型搭建

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

    + @% h. o/ ~3 n. b- l$ X4 V
    model=Sequential()
    % N+ L0 W' R( I3 m#adding the first Convolution layer
    2 z4 a9 s. d8 Q: a7 {' Bmodel.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))1 t9 R$ M& B/ r4 x4 `9 ]- v* v
    #adding Max pooling layer9 S! f7 w) X  Y7 o  T& [
    model.add(MaxPool2D(2,2))4 M: I" u$ i) m4 y6 `% z/ A
    #adding another Convolution layer( C/ B) r( W( i4 o  r
    model.add(Conv2D(64,(3,3),activation='relu'))- o! `9 ]7 `3 `& {2 y
    model.add(MaxPool2D(2,2))5 h: a. p5 c+ t0 `
    model.add(Flatten())# l( v( {: o. o+ s
    #adding dense layer0 z! g7 i& [+ E# P
    model.add(Dense(216,activation='relu'))
    : z' w# M: H+ H, q* }4 H) m3 Z$ n#adding output layer
    : d" c: c9 M# X: O7 {1 kmodel.add(Dense(10,activation='softmax'))7 z$ ?0 C8 O2 b1 G& o$ F
    + R0 x$ p% W2 N3 b% R% ?6 l0 d
    我们添加了第一个带有 32 个大小为 (3*3) 的过滤器的卷积层,使用的激活函数是 Relu,并为模型提供输入形状。
    $ l2 n. k8 ]8 |6 x+ i( A" y6 D: G/ Q
    接下来添加了大小为 (2*2)的Max Pooling 层。最大池化有助于减少维度。CNN 组件的解释请参考:https://www.analyticsvidhya.com/blog/2021/08/beginners-guide-to-convolutional-neural-network-with-implementation-in-python/9 u* {( d- x8 O$ ~1 C1 r
    1 w% _+ r* X$ I7 B; y- `
    然后我们又添加了一个卷积层, 其中包含 64 个大小为(3*3) 的过滤器 和一个大小为 (2*2)的 最大池化层
    7 c% g' C+ r5 X& I( o0 T) C) ~8 P3 E
    + j0 m% Q1 [. F( T& \在下一步中,我们将层展平以将它们传递到 Dense 层,并添加了一个包含 216 个神经元的Dense 层。7 p( W* z9 p+ g6 j" s! Z

    . m/ u& ^2 p5 q/ M& I9 n) V0 [- L最后,输出层添加了一个 softmax 激活函数,因为我们有 10 个标签。  V) X- a# v. ]4 w& d5 n
    - c0 x( B. T. ]. ]; W' `
    第 2 步:编译模型
    ! u# n: i: u$ P/ m* Kmodel.compile(optimizer='rmsprop',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
    0 k( K0 p/ V- D* {' L0 l! r) @3 _& n2 ^7 c+ ^  b
    第 3 步:拟合模型model.fit(X_train,y_train,epochs=10)
      B' H* u* G* G# L) G! c
    7 J) h; n2 a: b6 B. _
      E0 T7 ?$ P: U8 P/ j1 ?如上图所示,我们的准确率为 89%,损失为 0.31。让我们看看测试数据的准确性。
    . N+ ~, O& N' V3 q第 4 步:评估模型model.evaluate(X_test,y_test)% {/ F- h  y. }6 \/ B7 Z
    $ `. z* @% Q, Y$ Z3 ]

    8 C3 T8 r1 p0 u# T测试数据的准确率为 69%,与训练数据相比非常低,这意味着我们的模型过度拟合。
    - o" }5 c$ p) _! n3 \- e  ]. W# P第 5 步:进行预测9 m1 c7 {" i9 N" }
    pred=model.predict(X_test)$ L$ z/ B3 x9 F" v( K$ W% I3 m$ U0 p
    #printing the first element from predicted data6 X7 u& b4 F  G2 {1 E6 d; q
    print(pred[0])
    ( u) @8 _* a( n8 Z6 `#printing the index of 2 g) L$ P7 u/ g8 r* A8 a
    print('Index:',np.argmax(pred[0])); R( e+ E0 |, ~# o+ ]

    3 A4 r0 m7 R$ P1 a, L; T, |" K+ B  p/ E7 w' K3 h

    6 ?. }7 Z3 n3 Q; w+ c) X

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

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

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

    y_classes = [np.argmax(element) for element in pred]
    1 K; d5 o6 x2 t3 q! Rprint('Predicted_values:',y_classes[:10])
    9 N6 ~& k6 H& d  \! H! ]$ Oprint('Actual_values:',y_test[:10])0 y' U3 ?; w: n0 B% [

    ! V0 D5 {# ?- r( o) m! K" R. j6 r* J3 R) w4 r

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

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


    0 A. S6 ]8 a8 r' Bmodel4=Sequential()3 ?& c8 E% F  X$ _; f
    #adding the first Convolution layer
      a# s. a. R* E% g& a$ G  jmodel4.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))
    - m: x: U: G7 M3 p7 ?' C4 K#adding Max pooling layer
    $ K& N; k$ @% s- m( h5 ymodel4.add(MaxPool2D(2,2)), s: J; }9 O8 `5 F/ K% R4 }6 J
    #adding dropout
    ' X) A+ d* N  ]' q8 S# M3 Qmodel4.add(Dropout(0.2))
    # v3 u' \/ @) o#adding another Convolution layer) K, g, c. x) t& {5 P' C; W1 G' w
    model4.add(Conv2D(64,(3,3),activation='relu')): H# J5 v+ j; \1 L
    model4.add(MaxPool2D(2,2))+ M9 W$ r5 Z$ s% w* W
    #adding dropout9 ^  o. \. q* {& H& w2 |: Z
    model4.add(Dropout(0.2))
    " U, @8 Y+ ~2 {; P( y8 E! g# nmodel4.add(Flatten())2 z: O4 E/ t* X# q  U
    #adding dense layer
    ' g3 C2 G' ^9 }( W. rmodel4.add(Dense(216,activation='relu'))/ _9 f6 \. l$ F6 M5 Y
    #adding dropout
    ) `1 c8 e% R3 L* ?, v/ ?model4.add(Dropout(0.2))
    ! ^7 _1 y: X) M# V% j. |; ^$ c#adding output layer
    + v' o: l8 ^9 fmodel4.add(Dense(10,activation='softmax'))
    * d1 Y/ B8 \# t2 K/ bmodel4.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
    0 j( H+ u1 s/ Jmodel4.fit(X_train,y_train,epochs=10)3 g5 G3 @  j' ]# v( }0 }! A

    . \$ F% u% H) [7 o
    ( t- S& G* R& J" L' o  v+ l# Dmodel4.evaluate(X_test,y_test)4 _: S/ P* C$ p! \$ l1 O0 L

    7 f, H* z! w! x/ F) r通过这个模型,我们得到了76%的训练准确率(低于第一个模型),但我们得到了72%的测试准确率,这意味着过拟合的问题在一定程度上得到了解决。# v$ ]& m, ]9 U
    % H7 A, V, C; M+ Y3 b
    尾注
    . f2 M) c9 Q! [) v. Z' {# q: y$ T( x这就是我们在 Python 中实现 CNN 的方式。这里使用的数据集是一个简单的数据集,可用于学习目的,但一定要尝试在更大和更复杂的数据集上实现 CNN。这也将有助于发现更多挑战和解决方案。
    ' m, t# ~. |" E$ h) q% P8 q8 y4 \: X/ q- u

    / f& z$ m4 R/ I- c
    0 Y( Z0 A* A9 y; m' y, A/ L! \
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2025-11-17 18:55 , Processed in 0.432261 second(s), 50 queries .

    回顶部