QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-29 17:31 |只看该作者 |正序浏览
    |招呼Ta 关注Ta
                                                       使用卷积神经网络开发图像分类模型: o; p! A2 h1 ~- Z
    简介
    ! e# k8 ]2 C0 q" W0 C9 x
    ; c+ w) W0 p3 H! V这篇文章是关于卷积网络、它的工作和组件: 在本文中,我们将使用卷积神经网络执行图像分类,并详细了解所有步骤。因此,如果你对此不熟悉,请继续阅读。$ ]6 w3 ]. C- {6 W  O( F
    4 z6 z8 l# c  O2 @2 Q
    简而言之,CNN 是一种深度学习算法,也是适用于图像和视频的神经网络类型之一。我们可以从 CNN 中实现各种功能,其中一些是图像分类、图像识别、目标检测、人脸识别等等。
    7 \+ ^" ]& {' H# o4 L
    $ c) W" C' _- D今天,我们将对CIFAR10 数据集执行图像分类,它是 Tensorflow 库的一部分。它由各种物体的图像组成,如船舶、青蛙、飞机、狗、汽车。该数据集共有 60,000 张彩色图像和 10 个标签。现在让我们进入编码部分。
    $ u. |7 i, \& ^" ]( q7 A& j) I1 Y
    , ?1 a6 Z, b& w8 U5 y% O; c  D实施/ Z& u" a; c! e

    / Z3 H, o  y2 q" e; R6 I' V# importing necessary libraries# ~7 ]6 X/ d7 N" w  t
    import numpy as np
    ( t4 }. G% Q; E8 himport matplotlib.pyplot as plt
    + l! G1 a3 L/ r3 {6 i1 N' j%matplotlib inline5 V9 @( ?+ ^6 ~2 H- }
    # To convert to categorical data
    & u9 S) q5 n/ a) Y9 A: J3 Yfrom tensorflow.keras.utils import to_categorical9 D2 \( r5 ?: |6 {3 r; }
    #libraries for building model0 V0 F, }, O7 B" \5 v/ Q$ }% c7 t
    from tensorflow.keras.models import Sequential& B: T7 D+ x; m
    from tensorflow.keras.layers import Dense, Conv2D, MaxPool2D, Dropout,Flatten# d% s0 g2 `' j+ l) b
    from tensorflow.keras.datasets import cifar10; b9 d& `0 m* W' {2 h: |

    5 F* T! \; v3 l1 B. Q$ R- q' {3 d#loading the data0 J* L0 N9 b, P1 a
    (X_train, y_train), (X_test, y_test) = cifar10.load_data()* k! M4 F7 {6 w$ U/ P
    6 t9 v# ?5 Y3 Y1 X$ x) D6 t
    探索性数据分析
    7 v/ o2 h% H* J#shape of the dataset! ^) N- i9 E4 w# {( X5 B
    print(X_train.shape)% p* c' Y8 d! |6 G# m; c' d- `
    print(y_train.shape)& \4 L1 z1 }& @$ x
    print(X_test.shape)
    + q# s- v( ?) ~! l% z' F$ Qprint(y_test.shape)
    + c9 v& Q. \7 ]  A, j5 Y: T
    * L% }! X- v; g2 x9 F, N( R
    + i1 u5 B* W) ]) a我们的训练数据有 50,000 张图像,测试数据有 10,000 张图像,大小为 32*32 和 3 个通道,即 RGB(红、绿、蓝)
    ' r5 u6 h( j, U. J  [# {- k#checking the labels . B; A, z: k7 D4 s. b4 f+ [% F
    np.unique(y_train)
    8 M, ]% z% o* ]( y6 [3 h
    5 ~# ?6 A* t# a3 l. |4 ]4 O( Q  I# Q' \! w3 c. i9 g0 v0 r8 e
    #first image of training data
    + h; \2 @8 Y- Hplt.subplot(121)# m  Z1 N5 N  q  N  s9 |
    plt.imshow(X_train[0])
    5 |1 W5 o/ e+ q& pplt.title("Label : {}".format(y_train[0]))& {' ^  _0 }3 ]6 ^& z7 [
    #first image of test data% f! G; X- J' _2 f7 z; j
    plt.subplot(122)
    ! S5 k( u2 E) C3 I& R: Nplt.imshow(X_test[0])
    7 Z4 e- M: z" P: U3 C8 ^plt.title("Label : {}".format(y_test[0]));
    " g5 q; N2 g5 i6 t) N
    ! l5 n$ S0 H, F) l
    ! `  @- A& }' I" x#visualizing the first 20 images in the dataset& ~  ~8 I5 x& f) X8 H. J- x
    for i in range(20):2 k2 x2 T# M8 d" E- B  d" q
        #subplot2 w+ }6 f4 F  j4 ^0 z
        plt.subplot(5, 5, i+1)
    & j" x9 C. \$ I- L0 Z9 \    # plotting pixel data
    $ [4 e7 w4 H# F* \( ^/ J! E5 h    plt.imshow(X_train, cmap=plt.get_cmap('gray'))
    1 x) |( [. |; r: P& ~8 C" L# show the figure% n9 a+ J6 T7 ^  f
    plt.show()/ g0 O* o3 a: M! y! s

    ( w& s- X4 N+ U0 E; y! ]
    3 \2 u1 }) O6 v/ ?9 c. g) h预处理数据

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

    2 M$ C% V# ~) Q1 ?) F) k/ k+ E
    # Scale the data to lie between 0 to 1. W# Q+ i/ d$ T& j
    X_train = X_train/255
    $ j' g( @0 @# g' t, rX_test = X_test/255
    + g8 K, V/ ^( N+ F. Z7 |print(X_train)7 d7 E/ B" p+ b1 [# ?7 L! E
      Z5 a& X5 X6 i

    " b; g7 X. O: j7 G5 v, O#reshaping the train and test lables to 1D5 q  B6 U" L6 h* v, n. ^" @8 a; C
    y_train = y_train.reshape(-1,)  w# ~* S+ r8 h4 b2 E
    y_test = y_test.reshape(-1,)
      D. G- p1 Y$ K& q) S. V  S4 R. v% C5 S# e) ?* o- i) q+ j
    我们在上图中可以看到,图像的像素值已经进行了缩放,其数值在 0 到 1 之间,并且标签也进行了重塑。数据已准备好建模,现在让我们构建 CNN 模型。& N8 w& |1 U" X0 ~3 i9 x" d4 Z
    模型搭建

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


    8 s0 W$ K3 R/ Kmodel=Sequential()
    ; s" I/ d3 T6 L; p6 H4 Y! g& {) f#adding the first Convolution layer2 q' M/ k2 k0 r. Y9 S7 G
    model.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))1 C3 a# p! ^8 C  @/ a, b+ n
    #adding Max pooling layer! D1 N5 z/ ^2 B$ m# O% Q- ^, k5 D
    model.add(MaxPool2D(2,2))
    4 S0 j8 k# p6 C#adding another Convolution layer: ]( \+ [9 F1 ^) o
    model.add(Conv2D(64,(3,3),activation='relu'))
    7 Z2 G$ _3 \) b/ h+ Bmodel.add(MaxPool2D(2,2))
    3 H/ m& b. V/ _# dmodel.add(Flatten())" _; K* A1 {1 e- @- u
    #adding dense layer/ I2 ^( f4 H+ f4 F( w4 d
    model.add(Dense(216,activation='relu'))) }9 S! j" ~- W3 M) I* ^
    #adding output layer
    . h( E* n& r  u: q, e2 M' Fmodel.add(Dense(10,activation='softmax'))) G' ?! H$ y9 z) {6 o* h" L
    ! c2 U# `: _+ |: b$ Y2 U( E
    我们添加了第一个带有 32 个大小为 (3*3) 的过滤器的卷积层,使用的激活函数是 Relu,并为模型提供输入形状。
    6 o2 J( S/ {* i" Z
    & u: T  m/ X' M8 J+ `' ~# i4 S接下来添加了大小为 (2*2)的Max Pooling 层。最大池化有助于减少维度。CNN 组件的解释请参考:https://www.analyticsvidhya.com/blog/2021/08/beginners-guide-to-convolutional-neural-network-with-implementation-in-python/- T9 E/ D9 T2 e! O# k5 D

    ( M$ U1 i" x( r7 O! M9 r' z然后我们又添加了一个卷积层, 其中包含 64 个大小为(3*3) 的过滤器 和一个大小为 (2*2)的 最大池化层! O: e" Y: r- q

    9 X; ?' L1 C2 ?* {在下一步中,我们将层展平以将它们传递到 Dense 层,并添加了一个包含 216 个神经元的Dense 层。
    7 v* x) z" W4 M% z% {& v
    6 K* M1 `  n& v. ~. ~最后,输出层添加了一个 softmax 激活函数,因为我们有 10 个标签。0 T0 J% `3 x& |+ P2 p' o# @

    6 t, K; _+ g) {1 {4 u  {第 2 步:编译模型
    9 I3 e# c5 r1 }- `( m! h% vmodel.compile(optimizer='rmsprop',loss='sparse_categorical_crossentropy',metrics=['accuracy'])) f% l4 t8 v: G. t$ ?

      o7 P5 k- R! m1 S1 H第 3 步:拟合模型model.fit(X_train,y_train,epochs=10)) \1 c) ^, a! z; M) f% u1 H- y

    4 {8 t$ y0 V  H3 v: R1 o$ ?  _; D) E. [( e/ w8 M" k! ?, L
    如上图所示,我们的准确率为 89%,损失为 0.31。让我们看看测试数据的准确性。
    + y2 ~; _/ ]/ ]9 V, h" S0 |" W/ [第 4 步:评估模型model.evaluate(X_test,y_test)
    / C$ z0 G/ p' j- p& ?4 N3 K) N
    * s4 D) H7 U) L( T
    % `' ^. }! W% w7 a: ^9 ?测试数据的准确率为 69%,与训练数据相比非常低,这意味着我们的模型过度拟合。2 l- \: h9 e% j
    第 5 步:进行预测
    % f& M  @6 ~- I: E! w' _' ^7 T1 Hpred=model.predict(X_test)
    2 g4 V1 |, `' [# I" k2 A#printing the first element from predicted data5 D# I3 l+ g% l, l3 N
    print(pred[0])
    - [; H1 y5 O, v# \8 A0 d#printing the index of ; e7 x1 X3 c# m# }( J* u2 ?5 |" `
    print('Index:',np.argmax(pred[0]))
    8 B; D2 r* j# z: a5 N/ A5 Z6 d7 w; h
    5 C: g8 @9 x5 l: s- i. [" h

    1 s" G; K+ G7 _" ?, Y* q. Z8 J

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

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

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

    y_classes = [np.argmax(element) for element in pred]
    6 y& N- I2 p5 R/ B/ N7 zprint('Predicted_values:',y_classes[:10])0 @  ^3 m, s5 j: g; |! H& s. F- G- ]1 a
    print('Actual_values:',y_test[:10])
    % i! y% c# [. x: h: _0 k2 s
    / q' t. C8 k2 F( F% Z# s; w" }
    0 t; b5 T$ Q. p+ N6 y9 r

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

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

    . t) E  D" p9 c! _+ W5 @- f/ x
    model4=Sequential()# y: i9 ?* P$ @7 T
    #adding the first Convolution layer' x. }/ g* r, s, C, C, E' n& ^
    model4.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))
    8 T  Z, j9 l4 Y) N! w+ |) j( U#adding Max pooling layer& Z% Y  C" s( |( x
    model4.add(MaxPool2D(2,2))% [' E. n$ P3 ~3 M, ?
    #adding dropout8 O5 Z7 ^4 H& F8 s( E2 H& r
    model4.add(Dropout(0.2))" m8 i% i! z$ X" ~' c+ J
    #adding another Convolution layer
    7 w; m5 e$ T& E& V! h7 Hmodel4.add(Conv2D(64,(3,3),activation='relu'))
    1 o! V1 U$ w; t3 L1 Xmodel4.add(MaxPool2D(2,2))
    8 d4 b/ l2 J/ N4 h#adding dropout
    & K( k0 a5 D$ E  y1 smodel4.add(Dropout(0.2))$ I% r1 [4 p# N& f  D5 i
    model4.add(Flatten())
    7 R+ Y) W- s( Q( F2 I; r+ F#adding dense layer
    - c' }9 p2 r6 ^0 vmodel4.add(Dense(216,activation='relu'))
    8 [  x; p. O* u#adding dropout
    . n+ L: `; G9 `) o% R0 jmodel4.add(Dropout(0.2))# p! a) T6 {1 c# c
    #adding output layer! Y2 k% }% H* W/ \$ @
    model4.add(Dense(10,activation='softmax'))
    , l' W* o* D" s+ ^- _# H! A0 Rmodel4.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
    - F' @& I9 Y7 X) r1 r" kmodel4.fit(X_train,y_train,epochs=10)
    9 B% d8 @8 O% i6 K9 q- M! ~+ u; ]! R) \; L$ q8 X7 t* l
    ' D7 q' r6 h4 c. u" x. r
    model4.evaluate(X_test,y_test): e) G1 [) W: w0 y4 n, k9 P
    8 ?, z; h9 e& R
    通过这个模型,我们得到了76%的训练准确率(低于第一个模型),但我们得到了72%的测试准确率,这意味着过拟合的问题在一定程度上得到了解决。
    + G5 H, \6 w% p8 l: H
    . l5 i8 f+ x5 }7 z尾注
    * v4 [- I9 Q1 m/ f1 U, w" r* ^这就是我们在 Python 中实现 CNN 的方式。这里使用的数据集是一个简单的数据集,可用于学习目的,但一定要尝试在更大和更复杂的数据集上实现 CNN。这也将有助于发现更多挑战和解决方案。
    - _* X7 F* J6 a2 Q8 ?1 i% t4 p: B" C
    ' @- m2 S/ _& i

    ; M# W) k4 E! D4 ]# \* O2 B5 ?5 J
    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-7-18 06:51 , Processed in 0.283874 second(s), 51 queries .

    回顶部