QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-29 17:31 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
                                                       使用卷积神经网络开发图像分类模型# K. U" M$ E0 J/ i+ u
    简介$ h& e5 ?& d. }( E1 r4 [

    % T7 G& C. t4 S2 h+ A0 u' O这篇文章是关于卷积网络、它的工作和组件: 在本文中,我们将使用卷积神经网络执行图像分类,并详细了解所有步骤。因此,如果你对此不熟悉,请继续阅读。
    % Z3 e" q$ M7 O7 B2 o" [6 K) O, G" X
    简而言之,CNN 是一种深度学习算法,也是适用于图像和视频的神经网络类型之一。我们可以从 CNN 中实现各种功能,其中一些是图像分类、图像识别、目标检测、人脸识别等等。
    ( ^1 \. f4 u7 ^  V% ~, A7 R$ }2 q  Z2 F3 ]% z: b
    今天,我们将对CIFAR10 数据集执行图像分类,它是 Tensorflow 库的一部分。它由各种物体的图像组成,如船舶、青蛙、飞机、狗、汽车。该数据集共有 60,000 张彩色图像和 10 个标签。现在让我们进入编码部分。
    * _: ]1 ?# ]2 I
    8 L8 t4 U0 m8 n% a% |  P! f实施
    - a- v! R5 @/ f5 J. a0 c9 g
    ; A3 p2 B& ]' a8 s* G! R+ w) {" B; _# importing necessary libraries; _2 k5 m) n  X
    import numpy as np: R, r) ?) M% A
    import matplotlib.pyplot as plt
    # x7 I! s3 o) W7 N$ X/ Y6 l%matplotlib inline
    3 R! Y' N( y$ g" A0 H4 @- t9 E# To convert to categorical data
    4 J# g& M8 u# a, ffrom tensorflow.keras.utils import to_categorical& J5 k7 M* t4 e/ V
    #libraries for building model& f+ F5 t$ x/ r# a+ ]8 \
    from tensorflow.keras.models import Sequential
    ) N; J  R* M' v+ }8 E5 Kfrom tensorflow.keras.layers import Dense, Conv2D, MaxPool2D, Dropout,Flatten9 M( ^' S7 W' A
    from tensorflow.keras.datasets import cifar10
    4 \3 ]0 D  m/ v* o, N1 u+ H0 G! }. u1 X' v4 L
    #loading the data9 U% A+ j2 U- X, c6 S! ?, k
    (X_train, y_train), (X_test, y_test) = cifar10.load_data()& k$ O  I3 _, l! |

    + ]/ k3 O6 H& E探索性数据分析" k2 O  y) I3 X8 P% i6 |7 B: ?
    #shape of the dataset
    0 E& B8 h& L8 O/ y# ?' D, iprint(X_train.shape)! s& j) s% o  i" m# [, w3 L
    print(y_train.shape)
    ; I9 c- j# W6 Q; L# kprint(X_test.shape): b+ n+ g/ A: o5 j/ H! \6 G2 y: x
    print(y_test.shape)( ]  T1 m( O  P* x
    * t0 E$ Z+ g; ]+ T9 B
    ; B  i: M' ]1 I  x& ^
    我们的训练数据有 50,000 张图像,测试数据有 10,000 张图像,大小为 32*32 和 3 个通道,即 RGB(红、绿、蓝)
    + u8 D. e  @$ B# Y. M6 P5 f4 ]#checking the labels ! ]* `- n$ P+ w0 B* G  Y
    np.unique(y_train)
    5 |5 B6 y4 q4 e; v! q
    8 k" u( N% W! c5 ?' a3 |  T2 v& [
    8 }( d" y/ Z  H& }6 D; u#first image of training data4 O$ l# ]) I; _4 @* Y' w; h
    plt.subplot(121)! @) |/ Q; U5 H0 S8 j% B) W
    plt.imshow(X_train[0])
    . S) `+ B2 j# vplt.title("Label : {}".format(y_train[0]))
    * S9 \/ j* C" X7 c#first image of test data
    . F3 N* X7 K3 j; Q$ Iplt.subplot(122)
    5 K4 }: G, H3 {2 Rplt.imshow(X_test[0])
    ' k- X/ j. z5 gplt.title("Label : {}".format(y_test[0]));$ ^0 n$ @0 `' A0 @

    9 n0 t- _+ C7 h
    2 M% G0 _- l4 B0 {; D#visualizing the first 20 images in the dataset, p3 s* W/ U. B
    for i in range(20):0 Y# g9 k. D$ L5 k1 _+ \  x+ _0 w. ?
        #subplot8 V& d; U- z/ H* V- }
        plt.subplot(5, 5, i+1)' r) {$ \& @/ V# Y/ `* c* @
        # plotting pixel data
    , W! j( c; L8 x; \9 a  }    plt.imshow(X_train, cmap=plt.get_cmap('gray'))0 M( `4 p9 q! Y3 k
    # show the figure
    9 L* E4 @' _4 Q6 Dplt.show()
      @5 [. y9 A2 V; @4 h# O5 f8 r8 M; Q6 n% ?0 t) V
    $ J/ v7 r6 F  j3 ~
    预处理数据

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

    2 K* _& E9 I; B8 n9 z
    # Scale the data to lie between 0 to 1
    # c4 y6 Q3 _& e! R2 \! P/ ~$ bX_train = X_train/255* \& M+ a' X; I$ T) J* Z# ~: H8 \
    X_test = X_test/2553 n! \: d! t3 A5 @  t
    print(X_train)
    5 i) r% \0 m2 z
    4 ^$ o! k9 z* Z  E0 E
    . F6 V" `0 L, J8 E# _#reshaping the train and test lables to 1D
    , K3 B7 R2 Q, p7 m& D  Ry_train = y_train.reshape(-1,)
    ! P  {; i6 [+ M* R9 j. L# x' hy_test = y_test.reshape(-1,)5 {# `* g* ~8 A
    5 O; o  I1 S% m, r' ?; h
    我们在上图中可以看到,图像的像素值已经进行了缩放,其数值在 0 到 1 之间,并且标签也进行了重塑。数据已准备好建模,现在让我们构建 CNN 模型。
    5 b1 E8 @# \8 N3 Y, p: `6 R模型搭建

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

    ; q) K1 w, }( o6 D7 q1 B! O
    model=Sequential()" O  H. M; Z# A
    #adding the first Convolution layer' n4 S( t7 d8 s9 z. D/ N% g- V
    model.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))% x( V* B6 {0 R7 |7 p
    #adding Max pooling layer
    * \6 p2 Q3 X% x  [model.add(MaxPool2D(2,2))
    9 ]8 i: G: I) L- M$ u  ~#adding another Convolution layer
    ' k6 s0 l% q4 x8 n3 Fmodel.add(Conv2D(64,(3,3),activation='relu'))
    4 n0 \4 O9 ]* U0 @6 F& u$ W: rmodel.add(MaxPool2D(2,2)): s! M1 ~4 [1 X4 d2 C
    model.add(Flatten())& ~( c! {' R+ r1 Y: p) k! {/ c
    #adding dense layer
    : T  I" I  I1 Umodel.add(Dense(216,activation='relu'))* w5 d7 d; I( B3 B; j3 f0 r
    #adding output layer
    . u3 e, Q$ K( c9 ~model.add(Dense(10,activation='softmax'))
    0 X. K( X4 B2 f' b* a+ \* z4 H6 H' ~
    我们添加了第一个带有 32 个大小为 (3*3) 的过滤器的卷积层,使用的激活函数是 Relu,并为模型提供输入形状。; I% A; y' o' K4 Z8 B8 D
    7 i- Q# L+ q" q+ a7 \5 t% `- @
    接下来添加了大小为 (2*2)的Max Pooling 层。最大池化有助于减少维度。CNN 组件的解释请参考:https://www.analyticsvidhya.com/blog/2021/08/beginners-guide-to-convolutional-neural-network-with-implementation-in-python/
      I4 U* `. W, [+ N
    3 Q5 L4 @* F5 ^- {' h( `然后我们又添加了一个卷积层, 其中包含 64 个大小为(3*3) 的过滤器 和一个大小为 (2*2)的 最大池化层' |1 o$ j1 B6 R' Z; o% b
    8 y! @, m. b9 z3 l3 T, O: z
    在下一步中,我们将层展平以将它们传递到 Dense 层,并添加了一个包含 216 个神经元的Dense 层。4 @2 S. L( Y% \8 F& |$ B9 V+ i
    , z# y+ z$ \  i( M0 W+ e2 ]
    最后,输出层添加了一个 softmax 激活函数,因为我们有 10 个标签。
    $ L# E2 Q2 S% \+ y% b+ p7 w1 k4 m( `
    : E7 X8 B' t& t1 J& U6 y第 2 步:编译模型' D4 v9 f& B' w. [7 I" G
    model.compile(optimizer='rmsprop',loss='sparse_categorical_crossentropy',metrics=['accuracy'])" V  ^( W& ?# i# c9 e. e$ V; }
    ' _% X0 e* s, x4 B) g
    第 3 步:拟合模型model.fit(X_train,y_train,epochs=10)
    3 ?: P+ \8 P3 T+ ~! Z# \, h, S: f6 P% O; ]
    , e2 U( w" I8 ^3 r* l
    如上图所示,我们的准确率为 89%,损失为 0.31。让我们看看测试数据的准确性。
    ) a# m$ a$ {+ c/ q: i第 4 步:评估模型model.evaluate(X_test,y_test)& X8 A0 @7 @; A# C5 _7 f- W

    $ k9 o3 A  T# G# B( U0 ?  \3 }8 k6 {% \$ ]* c" O
    测试数据的准确率为 69%,与训练数据相比非常低,这意味着我们的模型过度拟合。
    : X3 D- r) L/ I& t, a: G! [' S2 f第 5 步:进行预测
    % P) j! d8 k* @2 W1 Cpred=model.predict(X_test)+ F( Z" y! Z  A  v
    #printing the first element from predicted data
    ( |1 A1 |* B/ @$ rprint(pred[0])! V4 f. A3 {/ Y# B3 H4 m5 {9 ^
    #printing the index of 8 E  r# W/ b; x
    print('Index:',np.argmax(pred[0]))8 A  d* \) x' [$ y9 Q8 j) E

    & k/ p2 g  ?" O9 G$ d1 w0 S( x; w5 O9 A! D: Z

    0 c- o7 k+ I" m3 G) ]8 L4 C; [

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

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

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

    y_classes = [np.argmax(element) for element in pred]; @% D9 j8 t8 _0 S0 c/ }' z
    print('Predicted_values:',y_classes[:10])
    2 ^( |0 M: B* u2 z2 Jprint('Actual_values:',y_test[:10])
    " s6 ?! n: X! ~5 P* ~2 W% q3 \1 A& a* v; V( t: C) ~" G" z6 T

    9 i& z9 V- y& e. ^

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

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


      B* ]) r6 t! u2 q4 b* V: Cmodel4=Sequential()4 }3 T$ y' a2 t1 G5 R
    #adding the first Convolution layer
    - Q; u) M; S5 L2 lmodel4.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))
    ; J, |/ t: |8 @# u#adding Max pooling layer& O5 Q  L- r, |% W
    model4.add(MaxPool2D(2,2))
    5 _' q$ @- B1 d1 O1 ~#adding dropout  n* S8 j7 F2 z: f% k" R$ S; d
    model4.add(Dropout(0.2))
    & r! A2 C) i: J0 ?( K! X#adding another Convolution layer; a; W# C( k- V. f
    model4.add(Conv2D(64,(3,3),activation='relu'))/ r$ [2 l/ O4 z/ L& B
    model4.add(MaxPool2D(2,2))
    4 _" w( d* a5 o1 L# L5 r#adding dropout
    % _- h1 |- ]$ b2 smodel4.add(Dropout(0.2))1 N$ D' Z; D0 D4 I$ v
    model4.add(Flatten())
    0 {1 X* E) |" e#adding dense layer
    ; G9 C  k  a5 |! nmodel4.add(Dense(216,activation='relu'))5 T9 e( x2 a2 ?: l* b& v7 a. k) b5 z
    #adding dropout  i" h4 }  t9 O( t, k+ q- \
    model4.add(Dropout(0.2))+ p+ x7 _2 n3 e" c# [6 o% `
    #adding output layer. w9 Z  _1 M+ ?) a
    model4.add(Dense(10,activation='softmax'))
    3 `1 H! m9 K& b" Umodel4.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
    ) K% S7 U$ O! E, W* z% }8 C' }* a5 hmodel4.fit(X_train,y_train,epochs=10)
    + b6 }$ {- `  p0 Q0 ~* X% F) h0 @& ~9 Y( f' `
    & e" n; W! @4 Y) f2 a, `( S! L
    model4.evaluate(X_test,y_test)
    2 \; W4 R; ~6 @4 v7 ?! p6 M* F5 {8 `* k
    通过这个模型,我们得到了76%的训练准确率(低于第一个模型),但我们得到了72%的测试准确率,这意味着过拟合的问题在一定程度上得到了解决。
    ) l! ~( J* W6 B6 c( W' ~2 \$ m2 U$ G' J9 p9 m; S3 ^5 r1 L$ w
    尾注
    . W7 W+ _. e4 d0 |) T这就是我们在 Python 中实现 CNN 的方式。这里使用的数据集是一个简单的数据集,可用于学习目的,但一定要尝试在更大和更复杂的数据集上实现 CNN。这也将有助于发现更多挑战和解决方案。6 y7 H, p  K2 v/ s$ Z, l2 L/ G

    , D7 }* C+ n2 O. ]$ P0 v9 J! R9 |; e+ J9 X

    3 e9 ^4 D, y8 ]$ f" [2 r
    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-1-16 05:50 , Processed in 0.435203 second(s), 51 queries .

    回顶部