QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-29 17:31 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
                                                       使用卷积神经网络开发图像分类模型3 C2 H- m4 _: V+ e- v. p2 M
    简介
    6 K6 m& o8 }! y; y0 X3 ~2 q$ @6 G' {: s8 O
    这篇文章是关于卷积网络、它的工作和组件: 在本文中,我们将使用卷积神经网络执行图像分类,并详细了解所有步骤。因此,如果你对此不熟悉,请继续阅读。8 @1 }  N3 C8 `
    % L4 }. U! _4 P
    简而言之,CNN 是一种深度学习算法,也是适用于图像和视频的神经网络类型之一。我们可以从 CNN 中实现各种功能,其中一些是图像分类、图像识别、目标检测、人脸识别等等。
    - a% K1 t- W" Z% f7 D* K+ s& V- w) u$ ]/ x
    今天,我们将对CIFAR10 数据集执行图像分类,它是 Tensorflow 库的一部分。它由各种物体的图像组成,如船舶、青蛙、飞机、狗、汽车。该数据集共有 60,000 张彩色图像和 10 个标签。现在让我们进入编码部分。
      b* W. w- F9 |( G- O  ]
    ( [" m. E* ^7 f' }1 K# y实施
      f; s4 i6 j, K3 D
      J* V: A" n" k. }% t# importing necessary libraries" S7 {& ?7 p; X3 q# I% ~
    import numpy as np& X0 M/ V2 G" m( u: S6 X' u
    import matplotlib.pyplot as plt' B+ X" J6 I2 W
    %matplotlib inline
    9 ^. x( C& D5 }. k# To convert to categorical data5 j1 _# _8 U1 h/ p3 M4 D3 D
    from tensorflow.keras.utils import to_categorical5 I5 [) ^- \! l6 ~9 x9 Y& o
    #libraries for building model
    % ~$ [- O  O4 M: `! ?. Hfrom tensorflow.keras.models import Sequential( }- d- W  F4 S
    from tensorflow.keras.layers import Dense, Conv2D, MaxPool2D, Dropout,Flatten
    " s) a5 A; z* ~4 s- ^/ \from tensorflow.keras.datasets import cifar10
    9 u3 H4 L& ~( I/ R' D$ ^* O& J  Z7 H1 |+ e
    #loading the data- ^& H6 K' {5 ~. p% m
    (X_train, y_train), (X_test, y_test) = cifar10.load_data()
    ( p9 m/ `8 w7 a. a- n# Q; r# Q! A  ]+ l0 z9 Y( p  t9 P5 @
    探索性数据分析: X5 `. V9 D# r, B0 g% s5 Z
    #shape of the dataset
    . }# B: g$ k- Y7 `# I6 Bprint(X_train.shape): w0 o: G( ^; V2 F- h
    print(y_train.shape)4 Z! {: R- P$ l6 t6 J
    print(X_test.shape)
    ( `) f9 p6 c. ^4 Kprint(y_test.shape)
    ; B" D: M* n6 m
    " N" E, e8 f- x; k% C
    6 w! k& K$ n- b' H$ p/ Y我们的训练数据有 50,000 张图像,测试数据有 10,000 张图像,大小为 32*32 和 3 个通道,即 RGB(红、绿、蓝)5 s4 d' V/ k/ M# B
    #checking the labels ! Z+ `+ M3 w. Q. Y
    np.unique(y_train)
    , z# k+ F0 N) s$ a$ Q' |
    ; L8 \8 L" x' I, b6 L
      x7 Y, b: q/ x, _#first image of training data
    5 j' @( P% p7 B* }) n: J' ^plt.subplot(121)2 J7 f4 Z# K$ @7 R1 X
    plt.imshow(X_train[0])
    ; h3 H& r2 u. _0 v& Zplt.title("Label : {}".format(y_train[0]))- @) B( C* |5 R2 ?7 s5 L
    #first image of test data2 L4 w& u3 D3 ^' S( P$ j! Z
    plt.subplot(122), {% q* R7 K" A# ?+ O6 e3 w/ h
    plt.imshow(X_test[0])
    4 c/ I/ U; P' \plt.title("Label : {}".format(y_test[0]));
    8 J7 |+ F( F& H( N# K9 X: u& r$ ^7 I7 D4 n2 o- O/ z) a) }" d4 N( l0 R

    4 w6 }, l* o, s#visualizing the first 20 images in the dataset
    $ O# t5 j! p: r7 w+ z, O0 v9 ]for i in range(20):
    " b# u4 m4 y5 x$ G0 s3 ]4 B    #subplot- @. r: e4 @( U. x: @# a% F  G& H
        plt.subplot(5, 5, i+1)
    % j* }) D1 S, a) }; @    # plotting pixel data/ L2 j; ?0 l" B' v, o- h$ B! a1 B( D
        plt.imshow(X_train, cmap=plt.get_cmap('gray'))9 L. R! m5 @# E; t! c- t
    # show the figure
    " B3 }, W8 \( Y3 D; Xplt.show()
    3 w: f" v7 t% [$ E) `8 G& A8 a2 L6 g5 v3 w% ~

    : v4 v8 c  p7 Q8 J预处理数据

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

    " v5 Q) X2 k5 h1 c
    # Scale the data to lie between 0 to 1' g( l! u, j: _+ W, _9 N
    X_train = X_train/255
    5 ]& d; d# Q3 w$ M9 y' E1 @X_test = X_test/255; A9 j/ ~- P/ U
    print(X_train)1 ]* N! S: I8 T- P$ X

    & m8 ]5 Y1 k) i9 [' B! E% K" K8 ]" R0 }  w6 L
    #reshaping the train and test lables to 1D
    & |8 `, Y: f- E2 \y_train = y_train.reshape(-1,)
    9 u; {) j) h/ p! T% D5 vy_test = y_test.reshape(-1,)1 T5 x! ^4 g) ^8 r

    3 C9 p+ r# r) }; _- C$ U我们在上图中可以看到,图像的像素值已经进行了缩放,其数值在 0 到 1 之间,并且标签也进行了重塑。数据已准备好建模,现在让我们构建 CNN 模型。  z& z1 C4 Q$ q9 d, `& Z9 |
    模型搭建

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


    ; |6 n; \0 a2 u0 ymodel=Sequential()1 _1 i, _8 [8 \7 `  ?: f3 N
    #adding the first Convolution layer& N& _2 w! g6 R: Q: H
    model.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))" N5 H. b. ?8 b4 R9 p, e
    #adding Max pooling layer
    7 z  n3 \- ?1 L! i/ r8 smodel.add(MaxPool2D(2,2))
    7 A6 ]! k8 ~: p* ^# I; t#adding another Convolution layer
    2 J  [& S- @% h% O- @model.add(Conv2D(64,(3,3),activation='relu'))
    4 C8 c9 H) t! a+ F" Zmodel.add(MaxPool2D(2,2))
    $ |) z6 x  [. l' I% K8 ^4 xmodel.add(Flatten())
    " G- b2 A) R# {+ g# e) ?#adding dense layer
    ! x7 o8 P! L/ L. hmodel.add(Dense(216,activation='relu'))
    ' j4 A- e' \4 t+ Y9 W6 D' F#adding output layer% r+ f* `# o/ K3 k9 g) J
    model.add(Dense(10,activation='softmax'))
    " D: c6 P! M' [9 u2 }: e/ \$ f( u; p/ G# s8 _3 U
    我们添加了第一个带有 32 个大小为 (3*3) 的过滤器的卷积层,使用的激活函数是 Relu,并为模型提供输入形状。, ?: T4 z% @& ~, Q$ {- h; x# e

    5 K- y( {0 g5 y$ Z3 N接下来添加了大小为 (2*2)的Max Pooling 层。最大池化有助于减少维度。CNN 组件的解释请参考:https://www.analyticsvidhya.com/blog/2021/08/beginners-guide-to-convolutional-neural-network-with-implementation-in-python/# [: A1 ?8 d, g9 \& U

    9 k# g' Z3 S+ m) }8 N0 u3 G& E& y然后我们又添加了一个卷积层, 其中包含 64 个大小为(3*3) 的过滤器 和一个大小为 (2*2)的 最大池化层
    8 K2 ~+ g% N5 U  n! ~7 E# N3 S( {7 k
    在下一步中,我们将层展平以将它们传递到 Dense 层,并添加了一个包含 216 个神经元的Dense 层。
    & t4 W3 _  y! C. L& _
    9 e! H. Q* i; x: Z$ W& k8 h最后,输出层添加了一个 softmax 激活函数,因为我们有 10 个标签。
    ) |& E, H# _$ i+ t& o! a8 R5 s
    ' R% P$ @! R3 J( h9 [- u第 2 步:编译模型
    + K3 |0 w) q0 l# a& V* }7 q0 wmodel.compile(optimizer='rmsprop',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
    ) h. D9 q- u1 ?3 p' I  N
    - x5 @9 j! o  T7 t9 Q1 r第 3 步:拟合模型model.fit(X_train,y_train,epochs=10)
    % ]( h8 t' {  q2 k' T& m6 v$ C& W
    " l) S1 y$ t2 Q) `9 |
    3 q3 N7 @6 b0 E: T) P5 J7 r/ \如上图所示,我们的准确率为 89%,损失为 0.31。让我们看看测试数据的准确性。3 d; `" ^' E9 ~* u* \% x3 [
    第 4 步:评估模型model.evaluate(X_test,y_test)3 K+ O! R& b4 p8 Y! o  [( d& a

    ! V1 ?1 W7 g/ ?6 u) [3 z: L* M2 z5 M; i; I5 O7 m) k4 z4 Q
    测试数据的准确率为 69%,与训练数据相比非常低,这意味着我们的模型过度拟合。
    " p8 F/ u# r6 C7 l第 5 步:进行预测: G6 p% i- K% f9 E
    pred=model.predict(X_test)
    5 z6 W; [' i  |1 K* q! j, l4 C#printing the first element from predicted data
    ( c9 E8 z1 B# }% Lprint(pred[0])3 l1 g! _3 _, n% J, P* F/ d
    #printing the index of ) q- ]7 |: O7 C& h$ k" @
    print('Index:',np.argmax(pred[0])); |2 \, k; ~9 P- V; F3 I
    7 I5 \/ l  E% ?7 G3 ?
    , `" C4 [' C- B9 m# A
    & K1 p( I6 ^" |0 u

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

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

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

    y_classes = [np.argmax(element) for element in pred]
    - G( ]- X7 [# z4 I/ y, B; }% U. ]print('Predicted_values:',y_classes[:10])
    7 T; U, u5 b, m1 ?print('Actual_values:',y_test[:10])5 C' @2 `: r0 {

    % L" F' v) z4 x& P# ^/ g  N! {& W2 @; _+ z7 z1 Z- V: T6 h

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

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


    ( Y3 w  T! G3 |4 K$ }# {% bmodel4=Sequential()
    % D! |3 i# `8 ~' c5 e6 F' t#adding the first Convolution layer, ~. a6 D) Q& H& |* T$ e
    model4.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))
    # X" S8 W; L1 K3 d9 s#adding Max pooling layer
      E# y8 E: J3 a8 [$ T! \model4.add(MaxPool2D(2,2))" y' d4 s0 @! @/ D& i# F, P
    #adding dropout
    , K! y0 W' ^! r3 c4 imodel4.add(Dropout(0.2))) w9 S- L. }  ~5 r2 ]4 ~) @; ]
    #adding another Convolution layer
    + B3 k7 a" h5 ?7 tmodel4.add(Conv2D(64,(3,3),activation='relu'))% l1 q. S2 @( Z/ E+ c7 W
    model4.add(MaxPool2D(2,2))1 }+ A* J% T+ F; T" ]3 F6 J
    #adding dropout* ~; K1 l) O7 a, ^+ L' |) m
    model4.add(Dropout(0.2))
    . }' t' k- \$ Wmodel4.add(Flatten())5 [) Z/ B1 f/ d( \9 ?
    #adding dense layer
    3 p, ^' {, x+ l, c, }model4.add(Dense(216,activation='relu'))
    : a: a; s) h) r#adding dropout
    8 t% r6 r7 A; T- ?) l& e# s2 j/ amodel4.add(Dropout(0.2))
    - q: t, x6 M' ^' `1 h* p5 ^#adding output layer& @9 L/ l/ l1 l2 ?( s* B4 r, E" v
    model4.add(Dense(10,activation='softmax'))* [3 Q" N# q1 I
    model4.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
    $ @/ a! e1 n* e  X3 Y8 W5 lmodel4.fit(X_train,y_train,epochs=10)1 S- i- q* `' k

    * S* z6 E8 i' Y0 t9 X0 I+ @$ ~. \9 A( I
    model4.evaluate(X_test,y_test), n; \& x: e; n2 `+ s& n, R
    6 A9 i% k2 |; y7 P: o# u
    通过这个模型,我们得到了76%的训练准确率(低于第一个模型),但我们得到了72%的测试准确率,这意味着过拟合的问题在一定程度上得到了解决。* x  A0 u# y3 ]& x

    ( h: _; X! E, W/ D尾注5 P& s% L; M1 u3 y, r* x
    这就是我们在 Python 中实现 CNN 的方式。这里使用的数据集是一个简单的数据集,可用于学习目的,但一定要尝试在更大和更复杂的数据集上实现 CNN。这也将有助于发现更多挑战和解决方案。
    0 N3 O1 ]8 m! k/ d8 m' D' h. R) @7 o) `  |5 X9 G! M

    $ J  k# {- Y, n  [8 k2 j3 R, y5 d% W
    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, 2025-8-18 05:42 , Processed in 0.349127 second(s), 50 queries .

    回顶部