QQ登录

只需要一步,快速开始

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

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

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

1158

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-29 17:31 |只看该作者 |正序浏览
    |招呼Ta 关注Ta
                                                       使用卷积神经网络开发图像分类模型( J! D6 u. H4 p: m$ a
    简介; q; H$ x- @5 A, M7 g+ A

      P0 m( H0 T% \4 |5 X这篇文章是关于卷积网络、它的工作和组件: 在本文中,我们将使用卷积神经网络执行图像分类,并详细了解所有步骤。因此,如果你对此不熟悉,请继续阅读。# T. v7 u! D+ l( y' [7 U" e

    8 }, N1 m5 [# V" b简而言之,CNN 是一种深度学习算法,也是适用于图像和视频的神经网络类型之一。我们可以从 CNN 中实现各种功能,其中一些是图像分类、图像识别、目标检测、人脸识别等等。
    0 l8 O  K, [& x5 c9 n) {; H' c. B! b: O+ T4 l$ Z
    今天,我们将对CIFAR10 数据集执行图像分类,它是 Tensorflow 库的一部分。它由各种物体的图像组成,如船舶、青蛙、飞机、狗、汽车。该数据集共有 60,000 张彩色图像和 10 个标签。现在让我们进入编码部分。" `) q( U6 Q2 C! p

    # J+ w" |2 V" R% R实施
    ! |4 J/ |) k. a: e2 ]* k
    / e+ N3 N: L1 d7 I; J# importing necessary libraries# J8 G5 j' r+ n+ a( ]1 d
    import numpy as np
    6 c! z# O$ _4 {9 o: w9 Y( e' Iimport matplotlib.pyplot as plt9 W" D- w% {! Y5 h7 a
    %matplotlib inline
    * D0 U8 |5 C9 `# To convert to categorical data
    + a& k. ?1 j0 @* ]* u: F, rfrom tensorflow.keras.utils import to_categorical( i, i6 u8 f, e8 U) W- ?4 {
    #libraries for building model
    . B) x# D2 `5 jfrom tensorflow.keras.models import Sequential3 |) i" y8 U0 J6 p
    from tensorflow.keras.layers import Dense, Conv2D, MaxPool2D, Dropout,Flatten
    ( J: e$ I) }' {1 f- \; P* Gfrom tensorflow.keras.datasets import cifar10
    8 D% g& G6 s" R: X: M: D; v! y3 T/ v
    #loading the data
    6 J3 C& Y5 G/ ](X_train, y_train), (X_test, y_test) = cifar10.load_data()" Y& h: s3 D+ V: W2 v6 m6 z

    $ O; i8 Z9 _7 l: A7 a探索性数据分析" E3 a$ |+ Q( P. ?9 ?( `/ ~) l
    #shape of the dataset
    + V5 ]( L& W. h) |print(X_train.shape)( {, B; g5 O+ C* ], _. B& _
    print(y_train.shape)! K$ M4 E% X" Y1 a: E' I, A
    print(X_test.shape)7 j2 F% t+ [1 D4 z6 O
    print(y_test.shape)
    $ m! z' P6 p. h5 _& S0 h' L
    " ?1 e% T" i* |0 U9 r% p) Q# K
    7 U4 L6 B0 \7 T" F& x3 P: s+ @7 G! V我们的训练数据有 50,000 张图像,测试数据有 10,000 张图像,大小为 32*32 和 3 个通道,即 RGB(红、绿、蓝)2 I* r5 L$ i  L; ^  A1 \' b
    #checking the labels
    * ]3 V* C5 L; ]5 Y' {- u' q8 p: anp.unique(y_train), o' l8 @; U8 o2 V3 e" W7 r1 K- [
    2 t& N& \5 e2 A
    ; ?' C. u7 z- S
    #first image of training data
    8 o) ~  S3 |4 p5 X- O5 Dplt.subplot(121)
    / ^8 v/ _' x5 J6 g/ h; nplt.imshow(X_train[0])
    * f8 E% L1 Q0 r6 h8 ?6 `plt.title("Label : {}".format(y_train[0]))) ^2 ~8 W6 h) M. i+ [' }3 W
    #first image of test data5 f$ k+ `& S. u5 L
    plt.subplot(122)
    ' H2 {7 N7 Q, h/ @0 {plt.imshow(X_test[0])
    - I# R5 @/ V% H: |. v0 D4 m4 ^plt.title("Label : {}".format(y_test[0]));
    $ D, v9 M& s. R  M( W2 Y
    . |9 j- b3 ?5 @5 ^" F5 W; u8 i( _# t: ?1 @/ q1 v1 j
    #visualizing the first 20 images in the dataset# S/ j! {. M. K- a- r
    for i in range(20):* Q3 U8 @2 b" a2 r6 d
        #subplot
    9 J  |0 }: V& x" [    plt.subplot(5, 5, i+1)0 ^0 H2 U, q3 b/ l8 F
        # plotting pixel data
    - t6 \& \+ q( U2 }" ?! F    plt.imshow(X_train, cmap=plt.get_cmap('gray')). K) E/ L- `7 Y1 H/ f; q' c2 }/ v
    # show the figure  O' U' E% k7 E& c
    plt.show()% L, K4 N' W6 N, U* t

    ; u; n' C" M. Q& n" r- M0 B; I" V! u- R7 d9 ^" S' }6 R& ?/ z/ \- C
    预处理数据

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

    - }, n. n, |. C9 D3 c% Q1 a
    # Scale the data to lie between 0 to 1
    + K8 E3 v3 _& |8 zX_train = X_train/255+ @# p6 ?0 X) }- X
    X_test = X_test/255
    $ G' k: k! W% J/ i' P+ Mprint(X_train)
    ; j6 E. `! a! l9 h( Q
    9 M/ }/ m6 ^/ S+ v* U  ]5 A  r9 F$ X& u- K- @7 T- l. m* M9 P
    #reshaping the train and test lables to 1D- j; l7 y& }( s! x0 F
    y_train = y_train.reshape(-1,)8 q! _! D5 ?, {% O8 M
    y_test = y_test.reshape(-1,)- S& i! ^" x$ e! ^
    ! w" P: D2 B5 i$ Z5 L: t
    我们在上图中可以看到,图像的像素值已经进行了缩放,其数值在 0 到 1 之间,并且标签也进行了重塑。数据已准备好建模,现在让我们构建 CNN 模型。
    2 j( ^: `! `$ {7 j7 S0 F1 K模型搭建

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

    9 ~% u1 y& B' c% `" B& m5 @
    model=Sequential()6 H0 b0 H" Y) X+ i: F6 _1 s5 Y+ I- \
    #adding the first Convolution layer/ f# `: T5 j  f) [* ?$ m
    model.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))
      f6 q$ L7 d" Z2 T; j" Y8 {5 C. `#adding Max pooling layer
    5 h0 G1 h. f/ C: _, D; P( \model.add(MaxPool2D(2,2))* o) W' Z/ R$ g1 q) @% M8 E
    #adding another Convolution layer( s0 B/ t* D8 |  u' s
    model.add(Conv2D(64,(3,3),activation='relu'))) p& [" J- Z2 s& A; p8 \' r
    model.add(MaxPool2D(2,2))
    & s0 t8 R- B: ?5 [model.add(Flatten())
    , ]+ e4 M# S7 W9 N) @#adding dense layer7 t6 j4 V, f2 H5 `8 `) L
    model.add(Dense(216,activation='relu'))
    + r$ E7 x* r3 U0 f, e+ h#adding output layer
    1 j4 h. [* u. O6 T  \model.add(Dense(10,activation='softmax'))
    3 K6 x- z6 b3 s& |3 z! h& p, f" n1 o$ @; D9 J
    我们添加了第一个带有 32 个大小为 (3*3) 的过滤器的卷积层,使用的激活函数是 Relu,并为模型提供输入形状。1 n  U# X, }) l' J7 {: _
    ; M1 A! g6 D! v4 _' \
    接下来添加了大小为 (2*2)的Max Pooling 层。最大池化有助于减少维度。CNN 组件的解释请参考:https://www.analyticsvidhya.com/blog/2021/08/beginners-guide-to-convolutional-neural-network-with-implementation-in-python/
    / O* M6 _0 A5 q/ s5 [0 z1 U" `+ H* R* h% V4 F: L
    然后我们又添加了一个卷积层, 其中包含 64 个大小为(3*3) 的过滤器 和一个大小为 (2*2)的 最大池化层
    2 t- ]3 _+ y- N! Q7 N) I% i: B' t# W' a* K9 i
    在下一步中,我们将层展平以将它们传递到 Dense 层,并添加了一个包含 216 个神经元的Dense 层。! \) j; J. C' S
    6 n& V  |1 O+ _' ?( a) T$ r8 k
    最后,输出层添加了一个 softmax 激活函数,因为我们有 10 个标签。1 c# b. f. I) Q
    / J5 j1 n8 Y" u+ M$ d5 X# D
    第 2 步:编译模型+ x. r- m) L+ p8 u4 o& O0 a7 S
    model.compile(optimizer='rmsprop',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
    ( `, U3 H6 q; z. v
    , E; p2 d# H* b- y" I$ q) l# C第 3 步:拟合模型model.fit(X_train,y_train,epochs=10)
    $ d: y2 A9 S/ k4 _; B3 i
    2 C3 q6 I) d9 p# _. ?# l) ]
    : ]; @2 c7 i( O5 @如上图所示,我们的准确率为 89%,损失为 0.31。让我们看看测试数据的准确性。- A, n. }, g, W. ^2 {
    第 4 步:评估模型model.evaluate(X_test,y_test)
    ( C8 }, A* f5 g0 z* R3 l- L& O1 B* u* P) }* K
    + t  s; s$ T& T8 U1 i7 m/ G' b
    测试数据的准确率为 69%,与训练数据相比非常低,这意味着我们的模型过度拟合。
    $ m$ V% h* T1 \! `9 |* g% O- I第 5 步:进行预测
    % ~! [4 [7 A6 f: N% T& f$ f( @pred=model.predict(X_test)
    1 E7 n& M9 c0 u5 E9 @! P#printing the first element from predicted data! o& J# E7 l0 t$ ~
    print(pred[0])
    ' T5 y% F! X2 u( J#printing the index of 5 j  p3 ~5 Y/ Z6 ]* S) e
    print('Index:',np.argmax(pred[0]))
    9 D& _0 n3 i7 T
    - H" R6 x6 ?% B3 s/ S: E4 }( v1 Q- U# r. P$ t1 ~4 M5 y- u

    9 }1 _, O4 }9 V

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

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

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

    y_classes = [np.argmax(element) for element in pred]
    5 X( l7 ^' {9 K6 \/ d* V9 x: j$ kprint('Predicted_values:',y_classes[:10]). q  J0 b; |7 r$ H
    print('Actual_values:',y_test[:10])
    ! x4 R8 e' X# o
    ! ]/ C7 K. Z/ `5 n# P. u1 o+ `( M1 ~

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

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


    ( _, ^& ]2 T, \model4=Sequential()4 j. i6 e: \" g1 y0 K6 K# E
    #adding the first Convolution layer* C& @3 }/ k' F' i( W
    model4.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))
    ! }4 k" d8 Y! T7 R) @#adding Max pooling layer7 L5 q3 d& C- ]% U" M' }
    model4.add(MaxPool2D(2,2))- ^  s! s+ M) w
    #adding dropout- R$ q  g% Q: E! w
    model4.add(Dropout(0.2))
    / T3 p- `6 z  w- N% L#adding another Convolution layer6 E0 c5 ?$ `/ b" a+ ]9 l
    model4.add(Conv2D(64,(3,3),activation='relu'))4 D; a# G: K2 R3 y( Z& G
    model4.add(MaxPool2D(2,2))+ ^- o  O6 c7 T; J$ A
    #adding dropout
    4 s! N/ ^! c4 R+ r4 umodel4.add(Dropout(0.2))* Q; u# d$ W& Z/ M3 A
    model4.add(Flatten())
    9 L! |' j; `8 i( D! I) z# q#adding dense layer$ w$ z) s3 m0 E7 E
    model4.add(Dense(216,activation='relu'))
    1 Z% t  E: Q9 z: z7 D! _#adding dropout
    7 Q% i: Y$ c8 m! \6 W4 x1 H1 bmodel4.add(Dropout(0.2))* \+ R0 S& a+ {6 a  u
    #adding output layer
    + J, W( K3 N& K" q% ]. r0 Y7 E! Fmodel4.add(Dense(10,activation='softmax'))
    " D. y8 B& e! X* hmodel4.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
    8 \* y; _, H! W: Imodel4.fit(X_train,y_train,epochs=10)
    $ }, M0 e  s) [& a3 C5 L+ a# e3 h
    . D2 m0 Q* G2 I% i" T+ ]
    1 J, {% \+ C* S: _model4.evaluate(X_test,y_test)
    + [# J5 |' F! U
    / F% y* I& l+ @7 {通过这个模型,我们得到了76%的训练准确率(低于第一个模型),但我们得到了72%的测试准确率,这意味着过拟合的问题在一定程度上得到了解决。
    ( E- p5 {# `# p7 J4 g- H  v+ }2 n6 d/ t! F2 n5 O
    尾注) r; c+ T. B' a: t% b
    这就是我们在 Python 中实现 CNN 的方式。这里使用的数据集是一个简单的数据集,可用于学习目的,但一定要尝试在更大和更复杂的数据集上实现 CNN。这也将有助于发现更多挑战和解决方案。
    5 _4 X0 X! F* h
    9 h9 B: j" y! A4 Z3 \4 g1 \4 y1 t# P; ?# ^

    ' S( f+ c9 `* s$ I% A
    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, 2024-5-23 10:26 , Processed in 0.398288 second(s), 51 queries .

    回顶部