QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-29 17:31 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
                                                       使用卷积神经网络开发图像分类模型
    4 x. g6 _  @- b2 X简介8 U- s  O- L0 J- {
    , N/ q4 L4 H1 V
    这篇文章是关于卷积网络、它的工作和组件: 在本文中,我们将使用卷积神经网络执行图像分类,并详细了解所有步骤。因此,如果你对此不熟悉,请继续阅读。8 H  W8 f# c8 y( A  [# p$ l1 @  T

    $ h1 w4 W# g& E) V' _1 D. l简而言之,CNN 是一种深度学习算法,也是适用于图像和视频的神经网络类型之一。我们可以从 CNN 中实现各种功能,其中一些是图像分类、图像识别、目标检测、人脸识别等等。( D" n! z5 b7 }0 ?
    - K" V: T1 b8 D! i2 j
    今天,我们将对CIFAR10 数据集执行图像分类,它是 Tensorflow 库的一部分。它由各种物体的图像组成,如船舶、青蛙、飞机、狗、汽车。该数据集共有 60,000 张彩色图像和 10 个标签。现在让我们进入编码部分。* v" l; \/ h: K! e! U  P& O
    " F' |; C) Q0 r4 N5 V
    实施$ D: o  M. {& m0 x! Z

    " E$ Q2 @4 w4 J6 \# importing necessary libraries% ^; G4 L& a7 n* r4 I7 g
    import numpy as np
    1 x  i8 ?- H; aimport matplotlib.pyplot as plt1 P# W4 ]6 }: u' k$ R
    %matplotlib inline7 ?0 h3 T/ s8 O) s- J! c
    # To convert to categorical data' u0 N' X) C- w! s! |. q. N) }# E
    from tensorflow.keras.utils import to_categorical4 [: \. l' }  _" j) l" g& V
    #libraries for building model
    ( `4 [) \8 i3 Pfrom tensorflow.keras.models import Sequential$ i. R/ s: q" W) d7 e
    from tensorflow.keras.layers import Dense, Conv2D, MaxPool2D, Dropout,Flatten
    5 G( q0 D3 \0 T; w- s6 V" @; Z9 qfrom tensorflow.keras.datasets import cifar10) I6 r# V5 i4 k) f$ Q
    4 |- j5 \, ?$ g
    #loading the data
    8 P  H4 f# k: s+ t+ k' d" o! L$ Q* o(X_train, y_train), (X_test, y_test) = cifar10.load_data()
    0 `& G0 y3 z% U7 E: x
      Z) {3 C6 m0 p4 E  q# B) x5 M探索性数据分析
    ( D( j$ [5 E1 z# m#shape of the dataset
    $ }! c- U( r: I: R0 k1 Wprint(X_train.shape)
    * S# Q* v. n) v  d6 pprint(y_train.shape)
    ! N8 J! A1 U9 P+ g9 M$ lprint(X_test.shape)3 u* h2 `! o, _: d
    print(y_test.shape)
    " y  b' D6 O. `1 ]6 v. R; {: G3 f' X, ?& N
    6 x  P. B( p2 o
    我们的训练数据有 50,000 张图像,测试数据有 10,000 张图像,大小为 32*32 和 3 个通道,即 RGB(红、绿、蓝)
    & |  P( ]0 f  k( @#checking the labels
      V& V, p. v2 }' K# U' |% dnp.unique(y_train)
    6 l2 @% u2 W) P. i0 w
    7 I$ k# J; i; V1 `. a6 X- V* T8 v5 {
    #first image of training data
    , ^' ]3 Y8 K9 _plt.subplot(121)  f+ z4 T& E! }! |  S6 {0 i- P; s" c
    plt.imshow(X_train[0])$ g* t5 Z- u3 X4 w4 b
    plt.title("Label : {}".format(y_train[0]))- h( o; I. D% |$ K; D, P0 J
    #first image of test data2 j! A" Y. ]: f; S" a7 ^
    plt.subplot(122)* I1 z, D1 t% E2 J* {  L
    plt.imshow(X_test[0])
    * k3 U* x; N5 x! s% g! g$ [plt.title("Label : {}".format(y_test[0]));3 X, j$ v. Y. ^2 o

    : ?, I8 N3 T; M1 p
    + c4 X# `% ~9 l#visualizing the first 20 images in the dataset
    % {' _: {# ]% t; @for i in range(20):
    : Z6 ^8 i# k# C& E" w    #subplot; l# n. x. Z, P
        plt.subplot(5, 5, i+1)) m* O+ C2 x8 b1 q
        # plotting pixel data
    + s6 X; b) m* B, \4 z5 a5 G    plt.imshow(X_train, cmap=plt.get_cmap('gray'))5 R2 B+ p* q! i$ L# V2 L
    # show the figure
    1 |+ [$ j' w, r* g8 Eplt.show()4 x* l% ?8 j! S3 y* c

    4 N" S6 c% V5 {7 B' w8 x! O7 M' N- E8 a  D# a/ z9 H4 C! Q/ L
    预处理数据

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

    ) o  I* v4 R$ a& D+ D
    # Scale the data to lie between 0 to 1' _7 |9 k# t* b+ ]0 ^
    X_train = X_train/255
    - S0 l8 y5 F7 c0 R) XX_test = X_test/2555 W- O+ j. K8 G+ c
    print(X_train)
    . {7 x- y' z% c0 L  W! w" ~3 A: O4 Q7 D+ C- g
    2 y4 c6 \$ K6 k0 W, ^
    #reshaping the train and test lables to 1D
    9 Y) j4 Q( _9 W  by_train = y_train.reshape(-1,)/ }8 _4 ^4 a& v5 A
    y_test = y_test.reshape(-1,)
    ( H6 d0 O9 g! g7 ?- m
    : e6 F- D! X7 Z3 J. s我们在上图中可以看到,图像的像素值已经进行了缩放,其数值在 0 到 1 之间,并且标签也进行了重塑。数据已准备好建模,现在让我们构建 CNN 模型。: U" ~% Y: {% K( p  r
    模型搭建

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

    6 B' T' Q6 w' n9 c' v  N8 o& N+ Z
    model=Sequential()
    " K7 ~9 K; F# Z: N; Y#adding the first Convolution layer
    2 d/ {$ T1 ?, B2 T. M. imodel.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))
    5 n" M4 O0 F9 c4 p% J#adding Max pooling layer! |0 `3 W1 }+ E7 K/ ^
    model.add(MaxPool2D(2,2))* i# Q! _" A' N7 K6 X9 `
    #adding another Convolution layer
    * n( c- }8 z- @& \, J9 ?model.add(Conv2D(64,(3,3),activation='relu'))
    " ?; B/ D" X* D1 Rmodel.add(MaxPool2D(2,2))3 _, n+ K3 \  s* r! |6 N
    model.add(Flatten())
    ( x9 P+ T) B2 N& y" z# u#adding dense layer3 o7 R: H1 |1 b. F0 Y) G. u
    model.add(Dense(216,activation='relu'))
    ) s. y$ J$ _7 l3 C' g+ r#adding output layer9 ?3 V* ?' p9 R5 U7 m9 P
    model.add(Dense(10,activation='softmax'))0 K! C5 X" n5 d) j6 L" q

    . @* n% ~. a" I- l我们添加了第一个带有 32 个大小为 (3*3) 的过滤器的卷积层,使用的激活函数是 Relu,并为模型提供输入形状。! Y- k" t- x$ i) h# w

    ) z" I5 a4 U" ~/ i* m8 s- F接下来添加了大小为 (2*2)的Max Pooling 层。最大池化有助于减少维度。CNN 组件的解释请参考:https://www.analyticsvidhya.com/blog/2021/08/beginners-guide-to-convolutional-neural-network-with-implementation-in-python/$ a& M; ]9 m7 f% `* B

    " H: _/ }( s( d! _( L* t4 d  ~然后我们又添加了一个卷积层, 其中包含 64 个大小为(3*3) 的过滤器 和一个大小为 (2*2)的 最大池化层
    4 U! g' ?: K" e, t
    . g8 u$ v9 P% v5 B# h在下一步中,我们将层展平以将它们传递到 Dense 层,并添加了一个包含 216 个神经元的Dense 层。: Q/ z2 j8 p5 D6 g! D
    1 B: W/ ~2 r* o; W: ~% z5 j
    最后,输出层添加了一个 softmax 激活函数,因为我们有 10 个标签。
    - O/ [& ^' o; P
    5 ?/ |/ o  \1 A9 Z3 v) I/ T第 2 步:编译模型1 h+ k( R3 F  n8 m' d: M0 X
    model.compile(optimizer='rmsprop',loss='sparse_categorical_crossentropy',metrics=['accuracy'])% d- d! ~, I; Y
      G) n/ w( p6 v: w6 x6 l2 ~& Y
    第 3 步:拟合模型model.fit(X_train,y_train,epochs=10)
    4 P: x7 O1 A3 r! L8 ^+ f4 l' Y( @7 Z3 w* r2 v
    0 v3 H" ?! f. D) j! T
    如上图所示,我们的准确率为 89%,损失为 0.31。让我们看看测试数据的准确性。/ k* _& n/ ]! e
    第 4 步:评估模型model.evaluate(X_test,y_test)) o1 o: }# l/ S& j9 g

    $ G% l& }" v* c+ E) h* W- o" g0 E, s1 T( b! k3 C( E
    测试数据的准确率为 69%,与训练数据相比非常低,这意味着我们的模型过度拟合。3 t2 U% X/ o+ S/ @8 V
    第 5 步:进行预测
    . `, q6 o& H7 b* {5 o: [% cpred=model.predict(X_test)( H. l$ o# x& M2 E  X& ]
    #printing the first element from predicted data/ y9 z- z6 K2 V* A3 Y6 h3 F
    print(pred[0])
    4 Z. x3 t8 e& t" u1 |#printing the index of
    # {! [& `9 F; @% x5 hprint('Index:',np.argmax(pred[0]))$ i  U3 |! o' b7 A6 v1 i
    - E* D5 S( J% M# c" F2 c" s

    : Z; ^3 ~2 z6 C/ z. H4 O
    1 j3 {. J) i7 W+ A. q4 k0 J( v

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

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

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

    y_classes = [np.argmax(element) for element in pred]
    + A; G# }. t5 H4 n5 Uprint('Predicted_values:',y_classes[:10])( L/ `5 E) N2 |/ F
    print('Actual_values:',y_test[:10])
    . X0 V  n8 B9 L  [) `( D) p- d5 M/ x2 a' G. I6 I7 ?4 ?

    7 z- s  z% X0 L8 W" r7 d

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

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


    ! E3 B) J+ P2 r" e  |model4=Sequential()
    9 _5 T6 e- i$ q; E8 d& Q8 y  I#adding the first Convolution layer
      W0 y+ \' ^$ N! ~model4.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))
    * X! ]; B8 l$ h! f& \#adding Max pooling layer, P( |3 D+ ~) D, c
    model4.add(MaxPool2D(2,2))) W- r2 ~8 G( m. J9 m' u
    #adding dropout& ]# J. v) Z% z4 j" v1 \1 K
    model4.add(Dropout(0.2))
    4 m1 V+ k7 V3 ^/ Y- D#adding another Convolution layer, w. K! s! i2 k# o
    model4.add(Conv2D(64,(3,3),activation='relu'))
      }+ ?( o/ G1 y3 l' w0 s2 y) cmodel4.add(MaxPool2D(2,2))
    & h2 `) ]7 O7 ?" K+ T8 S#adding dropout# D; V! j! h+ h1 G% g: a& _
    model4.add(Dropout(0.2))
    $ @; o$ ^9 l" t# Ymodel4.add(Flatten())
    0 P; T) W; @" W; l  x* I#adding dense layer% b7 Y/ q6 K  B: g
    model4.add(Dense(216,activation='relu'))
    5 B  I3 ?: ]) A6 X#adding dropout
    , ]& j' D. A6 B0 B$ Xmodel4.add(Dropout(0.2))
    4 R$ \$ [8 D6 r7 u. ~#adding output layer
    ' I* K1 a( u0 t. U7 |7 Xmodel4.add(Dense(10,activation='softmax'))7 m; I1 Y4 D$ {3 I9 O& P! F2 c
    model4.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
    6 m. k6 T  d* z( X& h1 S8 Emodel4.fit(X_train,y_train,epochs=10). g* C; ~% k6 p5 i* p
    : Q8 m9 K# p2 H! D- D4 y, B# \

    % Q" m8 t! K# n+ }% \model4.evaluate(X_test,y_test)) _/ h2 O$ J1 J6 E* N

    % \4 q$ ?, S/ B通过这个模型,我们得到了76%的训练准确率(低于第一个模型),但我们得到了72%的测试准确率,这意味着过拟合的问题在一定程度上得到了解决。
    1 P2 ~- ?( i* D
    " |. N# V8 r) u! p1 J5 `2 m尾注
    * F0 ?5 v5 _* b- ^这就是我们在 Python 中实现 CNN 的方式。这里使用的数据集是一个简单的数据集,可用于学习目的,但一定要尝试在更大和更复杂的数据集上实现 CNN。这也将有助于发现更多挑战和解决方案。: o+ G7 `' y6 ]8 L* }8 v+ y

    . t- ^+ M  n6 T( z2 V
      R6 m2 p, h/ e7 F
    1 {9 M/ b( X( v" j$ |4 s
    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, 2026-4-19 02:51 , Processed in 0.808903 second(s), 51 queries .

    回顶部