QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-29 17:31 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
                                                       使用卷积神经网络开发图像分类模型* g( q7 X# |8 G0 d8 a. T" v6 w
    简介' B9 S5 m+ i0 j% x' l( i3 x. }
    8 I! p. ?/ t9 v" `5 L& ]$ d
    这篇文章是关于卷积网络、它的工作和组件: 在本文中,我们将使用卷积神经网络执行图像分类,并详细了解所有步骤。因此,如果你对此不熟悉,请继续阅读。+ }. m( u' I; R( M+ _3 i- M8 \9 H
    4 B+ X  o' j8 [, [- {9 S% `* f+ N, f! [" _
    简而言之,CNN 是一种深度学习算法,也是适用于图像和视频的神经网络类型之一。我们可以从 CNN 中实现各种功能,其中一些是图像分类、图像识别、目标检测、人脸识别等等。
    * V& q; x$ ^& D& ]" G3 b& R0 u& Q9 R* I% K' N' w, h6 F
    今天,我们将对CIFAR10 数据集执行图像分类,它是 Tensorflow 库的一部分。它由各种物体的图像组成,如船舶、青蛙、飞机、狗、汽车。该数据集共有 60,000 张彩色图像和 10 个标签。现在让我们进入编码部分。
    8 {' U: Q7 |& E2 t& R% ~, o
    / s. b% F! U6 L) t5 u; n实施6 C+ E5 z- @2 ?  a  E
    5 N. o  N! I  C6 R; O7 y
    # importing necessary libraries5 d) n2 y# ^& E3 J/ t
    import numpy as np
    + i4 s" j7 P0 o7 N7 w0 vimport matplotlib.pyplot as plt# Y+ Q4 B- H4 j) }. ^
    %matplotlib inline
    / o9 `" X; a$ f. f' T: G: c# To convert to categorical data' p" ^- d) W( C+ E; s# |6 Z
    from tensorflow.keras.utils import to_categorical3 B! F* b" @/ p! n% A: J* P
    #libraries for building model
    1 B) K7 e; p8 S7 X! kfrom tensorflow.keras.models import Sequential6 _6 z2 @; w! L* x8 k2 g
    from tensorflow.keras.layers import Dense, Conv2D, MaxPool2D, Dropout,Flatten
    8 [% t1 l4 Y+ I) g# S4 cfrom tensorflow.keras.datasets import cifar101 j/ W" W4 C: z8 O; l- C
    4 T1 R6 o3 q  D. X* H+ t% f
    #loading the data
    ( Y# [' \  e) p2 |(X_train, y_train), (X_test, y_test) = cifar10.load_data()8 X* j4 u3 u2 t7 F- F* Q3 g7 c

    $ D, m7 I! K. C) C探索性数据分析) a( w4 u$ |5 k6 {
    #shape of the dataset
    , V  r6 ^  o3 ?print(X_train.shape)1 k/ l- l4 M6 f- P0 R" h" N
    print(y_train.shape)# s) _7 h/ U! z# V1 C0 d' a
    print(X_test.shape)
    3 I1 B/ z9 D/ Z9 Q' Fprint(y_test.shape)' x5 t2 r& \  s3 q( ?7 P& K
    & |- C9 |- x9 ^/ \; w2 s( y
    4 f# r+ Q/ [! }/ ^7 @
    我们的训练数据有 50,000 张图像,测试数据有 10,000 张图像,大小为 32*32 和 3 个通道,即 RGB(红、绿、蓝)
    6 e/ {" N! O; y4 B& D; b7 Y$ I#checking the labels , u$ V5 z& K% u" x3 }+ n
    np.unique(y_train)
    * n: t5 c7 x$ m2 c. M! k" T: R0 T; f) |$ s( |& M( n; Q- F

    ( B8 Q# I: S, y% A& T, _6 b; x#first image of training data
    , B! [& \9 H, T% i+ a7 R3 F& v0 gplt.subplot(121)
    " a4 }: f0 S- V/ S# [4 [plt.imshow(X_train[0])
    ) S% h9 Y- g/ Splt.title("Label : {}".format(y_train[0]))
    ; k) x# H& {2 [3 h. n* o: X#first image of test data
    6 k( t3 {- o' [% Zplt.subplot(122)
    : b9 R7 {7 a9 S, C/ i2 d; |plt.imshow(X_test[0]). G3 s# f+ l" f5 [4 n. q
    plt.title("Label : {}".format(y_test[0]));! o; H; f5 ^3 ~! K7 \
    , S5 d! u# E' J

    : p' o5 z5 M/ R' d#visualizing the first 20 images in the dataset" @  |" p) \, ~) ?: b( q
    for i in range(20):
    - K. ^5 X, \# U5 l  C0 O1 A% O" q    #subplot
    8 g: a1 \3 g! I$ T4 M    plt.subplot(5, 5, i+1)- [! X  ~, @) s: p  J+ b& n" Q
        # plotting pixel data
    + _% P( d1 [+ q; J    plt.imshow(X_train, cmap=plt.get_cmap('gray'))
    ' v3 K3 H) s9 M6 F, C" D# show the figure) q9 m0 Q' y5 D& Q- m% y
    plt.show()
    0 w7 u+ a& k- a! B
    ! v+ G2 `* w/ ?: `  e  |0 ]8 v6 h8 J! c; T$ t: ~0 c- y7 P/ s6 u" \
    预处理数据

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


    / H! V! P) L5 S2 Y# Scale the data to lie between 0 to 1
    6 `1 ~4 L! ^( H# b! ~* yX_train = X_train/2551 |! F4 _$ [. V0 C
    X_test = X_test/255
      Y  p8 d7 k7 p- Z, Wprint(X_train)
    ' x' ]. c# u; h& X0 `" e' }2 }' o0 [2 T" ^

    + u& K. d) V2 M: E# y1 }#reshaping the train and test lables to 1D
    0 o6 X  T* r2 q/ d! w, my_train = y_train.reshape(-1,)7 H" @+ [% c8 e9 h
    y_test = y_test.reshape(-1,)
    ! H1 C& z& a3 O$ B% |# r1 {
    & z1 \% Y: U! `- t' ^我们在上图中可以看到,图像的像素值已经进行了缩放,其数值在 0 到 1 之间,并且标签也进行了重塑。数据已准备好建模,现在让我们构建 CNN 模型。
    6 j2 q# y4 T; D模型搭建

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

      X7 N+ M* i+ q7 H" X, c/ R
    model=Sequential()% D4 Y: k# k$ S$ }9 F+ H) w9 ]3 }9 |
    #adding the first Convolution layer3 z# w- _) t  G9 d/ x6 ^
    model.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))2 H6 x! Y' E( a6 |7 S3 k
    #adding Max pooling layer
    ( |/ {, R- u: d4 P9 B% jmodel.add(MaxPool2D(2,2))( E4 W) e* B9 r
    #adding another Convolution layer
    # b: q3 E& i8 @0 {model.add(Conv2D(64,(3,3),activation='relu'))( a& b  S" K7 S; Y: n
    model.add(MaxPool2D(2,2))( P& m4 b' T$ t1 L8 \& ]
    model.add(Flatten()); C7 Z8 _$ Y9 n- m: R( |1 e2 F& t
    #adding dense layer
    * _8 ^' o6 ]% s4 C, t3 n, S- [) y& pmodel.add(Dense(216,activation='relu'))! N# q0 D6 W: Q7 @* `  Z& X
    #adding output layer. a' Z# n. E: k
    model.add(Dense(10,activation='softmax'))
    4 G+ Z; I( |& S( }( L% w# X) w( j$ ]6 K9 ~7 M0 s- X/ _% P
    我们添加了第一个带有 32 个大小为 (3*3) 的过滤器的卷积层,使用的激活函数是 Relu,并为模型提供输入形状。
      Z+ V$ m% ^6 h  i, g0 s
    0 D- D6 |  y, B0 C4 c, [$ Q, {接下来添加了大小为 (2*2)的Max Pooling 层。最大池化有助于减少维度。CNN 组件的解释请参考:https://www.analyticsvidhya.com/blog/2021/08/beginners-guide-to-convolutional-neural-network-with-implementation-in-python/
    ! i) b& V; g3 X2 L1 Y$ c9 y3 v. [1 g/ U! Y6 ~2 z$ ?/ p( j
    然后我们又添加了一个卷积层, 其中包含 64 个大小为(3*3) 的过滤器 和一个大小为 (2*2)的 最大池化层- X/ h1 Z2 p' r/ X; m2 _2 Y# ?
    7 c# G5 z  }* o+ M5 n1 z
    在下一步中,我们将层展平以将它们传递到 Dense 层,并添加了一个包含 216 个神经元的Dense 层。
    $ O8 U2 ?) N# C- `- e9 O* J9 i) W/ z2 [" [  P
    最后,输出层添加了一个 softmax 激活函数,因为我们有 10 个标签。7 l+ T; v3 O4 C  ]0 Z
    - j) X" ~# l9 L( v2 |+ x
    第 2 步:编译模型% F& E, J2 L" P# ~$ E+ b
    model.compile(optimizer='rmsprop',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
    9 h  W& S+ V. H, a5 y4 ~
    $ |1 o+ X8 r. ]( l) D, }第 3 步:拟合模型model.fit(X_train,y_train,epochs=10)
    $ Y3 @$ l& p: T4 t3 a: w- r$ n$ J) T1 a  c, L) A- O

    7 h8 I6 v7 k# Q' V如上图所示,我们的准确率为 89%,损失为 0.31。让我们看看测试数据的准确性。5 u& `6 \( D( t: V& \) x' t2 r
    第 4 步:评估模型model.evaluate(X_test,y_test)
    . \& ]& a5 e6 g, r& k" f. ^9 r
    - S6 C9 ?3 ^4 [# P% g
    9 [1 E7 B8 h/ R% i: K测试数据的准确率为 69%,与训练数据相比非常低,这意味着我们的模型过度拟合。
    ( H" _  ^. y7 `4 n! x第 5 步:进行预测. h6 X5 p$ X" j4 q
    pred=model.predict(X_test)5 ]- a/ G  P* W" g$ y) e( s3 ?, n
    #printing the first element from predicted data
    * \+ l$ `* ?% e0 i1 P! yprint(pred[0])4 Y2 e$ r) F" `, R8 a
    #printing the index of ) ?- A9 B7 b+ h* H- B7 s! D
    print('Index:',np.argmax(pred[0]))
    $ a: L. `& X# Y, r) e8 k) ]. A4 J- t8 R0 n# ]2 W  v

    5 M0 C4 c" \) S0 T) @, j
    2 |9 z2 m. D. f- I/ N3 \3 e

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

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

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

    y_classes = [np.argmax(element) for element in pred]4 d! s9 s- M9 s9 `, G7 E+ |  Z
    print('Predicted_values:',y_classes[:10])
    1 `5 X9 v& P9 c. y& x  `( _print('Actual_values:',y_test[:10])
    & D/ |) o7 N: T) O7 e* L9 `% @9 R' w8 ]- F% {" [( a, E
    ! @% \" g8 v( N( m2 H6 m' s0 C

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

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

    , O0 S! g! T4 E6 X( j" [) F% J
    model4=Sequential()
    . H) u# ?. t5 ?3 }( X#adding the first Convolution layer0 r9 e# z/ v8 U4 d4 I
    model4.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))
    1 r/ R; ]: Z1 C5 t2 I  G  k#adding Max pooling layer
    2 k* M9 p8 F7 Vmodel4.add(MaxPool2D(2,2))
    ! ?0 N7 ^. Z+ [" I5 x3 N9 e#adding dropout; M( y% D0 _% [
    model4.add(Dropout(0.2))
    " @8 R' T1 M; C( f. q#adding another Convolution layer
    : X0 c& t; v. X5 zmodel4.add(Conv2D(64,(3,3),activation='relu'))" b" i3 [$ `" g& |# M
    model4.add(MaxPool2D(2,2))
    . n9 q7 c  l" O' Z#adding dropout; r* \% N5 o$ e" C, |) P8 P, e
    model4.add(Dropout(0.2))
    ; F0 x( _' @6 [. s4 A+ _model4.add(Flatten())$ W+ k  {) e+ ?& t* _! a  J
    #adding dense layer( H' A2 \' R& ~; [2 S# S& V2 |
    model4.add(Dense(216,activation='relu'))
    : a9 Z+ Q0 l5 g#adding dropout
    3 e0 D0 y& t( {3 Imodel4.add(Dropout(0.2))
    * Y* L, d2 `2 f9 E. b#adding output layer
    ! Y5 f. f, Y# o* l: }7 P% `model4.add(Dense(10,activation='softmax')): {, T8 e# `" q  J
    model4.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])+ U+ d/ V  _/ u- O) {
    model4.fit(X_train,y_train,epochs=10)1 {- q4 U0 C0 D4 h" [+ m# y" |

    ! L4 m5 F. f4 `( D4 K: [/ C5 o
    model4.evaluate(X_test,y_test)  N3 N2 d6 B2 Z2 x* d
    ; S" b# S  P- E* V) D
    通过这个模型,我们得到了76%的训练准确率(低于第一个模型),但我们得到了72%的测试准确率,这意味着过拟合的问题在一定程度上得到了解决。
    - r% v2 c( v5 t- J* G. Y8 s7 N0 Z1 W+ F
    尾注
    4 b9 G$ T. |8 z0 O2 j" t' N! c这就是我们在 Python 中实现 CNN 的方式。这里使用的数据集是一个简单的数据集,可用于学习目的,但一定要尝试在更大和更复杂的数据集上实现 CNN。这也将有助于发现更多挑战和解决方案。
    4 \( X6 x: L/ V
    9 v  y+ x, L5 W# _9 R. h8 I$ J8 ^" H+ j* ]1 [; ^) I

    7 y1 {6 p5 E& v
    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-9 15:40 , Processed in 0.324314 second(s), 51 queries .

    回顶部