QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-29 17:31 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
                                                       使用卷积神经网络开发图像分类模型
    : P1 s9 N2 F( e; v3 i" s! c% ?简介
    - G* V1 C+ K! P/ e, Z$ R+ h; @3 O/ D0 K, j
    这篇文章是关于卷积网络、它的工作和组件: 在本文中,我们将使用卷积神经网络执行图像分类,并详细了解所有步骤。因此,如果你对此不熟悉,请继续阅读。
    " c" k& ^9 K8 W/ T0 M9 q8 b( s  V+ W3 O
    简而言之,CNN 是一种深度学习算法,也是适用于图像和视频的神经网络类型之一。我们可以从 CNN 中实现各种功能,其中一些是图像分类、图像识别、目标检测、人脸识别等等。6 F6 o3 _# L. K" Z( z
    " n! E1 d$ p2 m1 P! F6 v. f
    今天,我们将对CIFAR10 数据集执行图像分类,它是 Tensorflow 库的一部分。它由各种物体的图像组成,如船舶、青蛙、飞机、狗、汽车。该数据集共有 60,000 张彩色图像和 10 个标签。现在让我们进入编码部分。
    ( k5 ?7 [& x) [! M) b
    6 @  D) ^* _  I实施
    * D$ l" D" Y  A+ P: O# e
    2 g0 X- T) d8 w! t' q# importing necessary libraries; k% o7 ~* `  A! i
    import numpy as np. z. V. k. x: O. }2 u
    import matplotlib.pyplot as plt+ X* L- t; y+ ?( I. e: e- T
    %matplotlib inline& _$ R+ I+ W1 \3 D
    # To convert to categorical data& J1 s) V- L3 }) n0 I  v7 X. f
    from tensorflow.keras.utils import to_categorical' x% N  m7 |9 z* z5 o% U7 o. |
    #libraries for building model0 h2 h" m0 l/ [7 J
    from tensorflow.keras.models import Sequential
    % {; l/ O" k$ Gfrom tensorflow.keras.layers import Dense, Conv2D, MaxPool2D, Dropout,Flatten
    4 P. X: \$ T( h- ~( {from tensorflow.keras.datasets import cifar10
    1 \4 h, u  s6 a  j+ o) m2 ~/ u4 z& L3 t9 N
    #loading the data2 T; D$ T3 V/ E6 d
    (X_train, y_train), (X_test, y_test) = cifar10.load_data()7 r6 L  ]) o1 E. ?1 f
    6 ^' Y' C% G1 Q; F9 z
    探索性数据分析/ x9 R0 ]( c+ F* c# P
    #shape of the dataset
    7 y3 C3 o) t+ J7 q" o8 }. hprint(X_train.shape)
    5 `( ~3 V! s# X, |print(y_train.shape)
    5 H1 c  S! E8 q9 D% `4 Yprint(X_test.shape)
    6 y$ r# V! k+ _print(y_test.shape)
    0 o5 U/ l# `5 ~; i
    " e, L# @! F/ I9 j1 ?; V7 `- I5 H( R
    ) f3 D% U6 u4 z5 L6 J我们的训练数据有 50,000 张图像,测试数据有 10,000 张图像,大小为 32*32 和 3 个通道,即 RGB(红、绿、蓝)- A7 z. K: N) g
    #checking the labels
    7 X- Q$ W4 Y* \" Y: Wnp.unique(y_train)
    4 {# h! O# M, W; N9 V2 G# I/ P# \1 e& m0 {! j

    . F3 C7 a& |: z4 J2 K0 m8 g#first image of training data' K* e# [, E+ m! O' B
    plt.subplot(121)
    4 S/ f/ C+ y9 D/ I7 {3 e' Tplt.imshow(X_train[0])" \9 u" Q9 k3 a0 |8 U9 U% p% \4 _
    plt.title("Label : {}".format(y_train[0]))# X4 u. O$ m" B6 O; K" h
    #first image of test data% b" [9 k! w3 K1 K9 i- v4 }
    plt.subplot(122). p2 e: T8 w  O7 q, ]! B6 }
    plt.imshow(X_test[0])1 }; b8 r/ q& j4 C
    plt.title("Label : {}".format(y_test[0]));4 E6 W4 S8 Y1 {

    & Z5 r" X0 _7 o' E0 j/ W+ U& b1 B/ H
    #visualizing the first 20 images in the dataset* O3 z; D% h; U* y
    for i in range(20):
      J9 ~6 Q, A1 `+ R) b3 A    #subplot9 G( X+ [3 v! D3 q
        plt.subplot(5, 5, i+1): M( v' P) c. S" n; _
        # plotting pixel data
      @# T/ `5 t3 b- g5 P( R    plt.imshow(X_train, cmap=plt.get_cmap('gray'))# r2 h) b' V5 M" j/ P# v
    # show the figure
    * ^  o# c3 A+ r) k& p9 Eplt.show()
    8 `& c7 M9 m/ W5 @* r4 ]/ i% n& f& Q- A4 k! |% W) U9 W

    , b# g2 X% [# [  K) O( I# G预处理数据

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

    & y. V7 y8 P% V5 O7 n* w9 S8 C7 q
    # Scale the data to lie between 0 to 1
    % D; N- G  F- `6 OX_train = X_train/255
    3 P9 g4 M4 h- fX_test = X_test/2553 u. z% ~. c6 F: R2 l: J
    print(X_train)" p: x9 W+ C: h

    6 h' l- w* f( c; i- d4 R6 f; T4 f, X( e: I9 G) P% b
    #reshaping the train and test lables to 1D
    $ D' X- o! J4 |0 _. _( s( ly_train = y_train.reshape(-1,)
    * Z% }7 a' X( b0 d' ^- oy_test = y_test.reshape(-1,)
    ; i$ k+ d2 q$ g  D
    # j7 ^# @0 h. @- j+ s我们在上图中可以看到,图像的像素值已经进行了缩放,其数值在 0 到 1 之间,并且标签也进行了重塑。数据已准备好建模,现在让我们构建 CNN 模型。# f+ d% z% y$ M
    模型搭建

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


    ; j4 ?0 [! Q; A9 c7 _3 V! \model=Sequential()( W; |. R2 w6 M6 `, v  Q7 I
    #adding the first Convolution layer" O4 ]0 f/ ?# E- b" o- ?# j6 Z9 a5 A& `
    model.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))
    & b" u; V4 Q  S9 b8 H$ E; T; p#adding Max pooling layer
    : C- T+ K# l: E% B" emodel.add(MaxPool2D(2,2))
    3 V+ E# F6 n* O/ N, Z! M#adding another Convolution layer
    , G9 V- Y. [4 a; o  s5 dmodel.add(Conv2D(64,(3,3),activation='relu'))$ M- u' G$ Y( j; ~
    model.add(MaxPool2D(2,2)); c8 a+ q+ L6 c+ S! d' z
    model.add(Flatten())
    ; M! \4 ^$ _( l+ G$ `1 l! v#adding dense layer; h6 n% v% |" I8 r8 q
    model.add(Dense(216,activation='relu'))$ c+ b8 e, B4 T. ^8 J" ]; A& V
    #adding output layer
    : N3 b. }- }6 \( N$ E& N  ymodel.add(Dense(10,activation='softmax'))# e% D/ K& V; y2 K! ?, ]8 O

      \, f( {, g* I# g- F( U我们添加了第一个带有 32 个大小为 (3*3) 的过滤器的卷积层,使用的激活函数是 Relu,并为模型提供输入形状。- U, s" P( Y' U2 s2 k/ W. W

    ; i, `3 c9 c, m- r  P接下来添加了大小为 (2*2)的Max Pooling 层。最大池化有助于减少维度。CNN 组件的解释请参考:https://www.analyticsvidhya.com/blog/2021/08/beginners-guide-to-convolutional-neural-network-with-implementation-in-python/
    4 j/ K# L1 k5 h# A3 O) m% q2 B
    % E  d* [( e$ K# |+ i然后我们又添加了一个卷积层, 其中包含 64 个大小为(3*3) 的过滤器 和一个大小为 (2*2)的 最大池化层
    : z1 {8 n4 D4 i1 m. Q
    3 b$ H6 o5 V( [% d+ ^5 J在下一步中,我们将层展平以将它们传递到 Dense 层,并添加了一个包含 216 个神经元的Dense 层。
    6 a6 J5 D1 g0 Z1 O  x
    ! s# S% Q6 U) B( z2 z2 K. q% V最后,输出层添加了一个 softmax 激活函数,因为我们有 10 个标签。
    & Y7 r: @3 |. p) W& ^5 g* E$ R/ }4 q/ C
    第 2 步:编译模型" o0 H7 W9 B* k: ^, ^6 H: q! g
    model.compile(optimizer='rmsprop',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
    * V9 b/ o  q7 L, K/ L" }0 L  x5 \. Q7 e2 ~
    第 3 步:拟合模型model.fit(X_train,y_train,epochs=10)
    ) l4 X' e- `, C/ A: h3 H) p: y7 _
      [4 r4 q* E4 p! i7 c6 D7 B6 j, Z/ x+ {9 u
    如上图所示,我们的准确率为 89%,损失为 0.31。让我们看看测试数据的准确性。9 K2 H" @* E% o2 v3 L) h
    第 4 步:评估模型model.evaluate(X_test,y_test)
    8 [( j( R- s2 Z! a5 B4 _; j9 ]8 G! w# k6 i0 T
    , L# D# y$ k7 j; Q/ C8 P( r
    测试数据的准确率为 69%,与训练数据相比非常低,这意味着我们的模型过度拟合。
    / m8 u/ l& K% v5 k- h! S+ U6 E) p第 5 步:进行预测
    , C  m" s) N* I2 lpred=model.predict(X_test)$ S  |# w( i! J3 T
    #printing the first element from predicted data
    / h4 ^; r+ a+ H8 r+ T2 hprint(pred[0])
    5 t0 P. ^) r" |3 F#printing the index of
      R$ T8 q$ P7 o, K! i9 i$ Zprint('Index:',np.argmax(pred[0]))% L/ w  H' B) @! T- H: G. u
    " F  h3 }- ]: w* _& X' E

    4 u1 U3 R+ f! P9 `8 y. C$ }$ @5 R! r2 t5 r& m$ p3 ]3 n* i7 K

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

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

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

    y_classes = [np.argmax(element) for element in pred]
    ' ]! f0 r" Y+ Z* {" W! l- Jprint('Predicted_values:',y_classes[:10])
      n/ \8 ?. ]" n/ c* o1 w( E4 xprint('Actual_values:',y_test[:10])
    / E0 y! s' x/ D7 w9 k4 x" R- |
    . W$ g) O* ]. ^  b# C1 g. d. o' C9 q6 P, b

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

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

    7 q/ b$ Q2 E2 k3 G  S3 ~
    model4=Sequential()
    3 l6 [6 Z7 v9 |#adding the first Convolution layer
    ) S6 A/ E4 V0 v  smodel4.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))
    $ ]- M" }6 k  W: Q3 E# S#adding Max pooling layer' M  E7 c3 ?( p- d
    model4.add(MaxPool2D(2,2))
    . D( U9 Q5 @& y#adding dropout
    ( o: \. c" V! k7 W- Hmodel4.add(Dropout(0.2))
    1 P3 c2 Q/ N/ J#adding another Convolution layer1 A* q7 p/ [$ u! R5 Q) q* I$ s
    model4.add(Conv2D(64,(3,3),activation='relu'))
    * {0 X& [& m/ i, {model4.add(MaxPool2D(2,2))9 E' Z* |7 q! m+ U- w
    #adding dropout. }+ i! K$ ~! ^( G# N
    model4.add(Dropout(0.2))) x" Y9 P, p, n( J5 y2 W( r8 R
    model4.add(Flatten())8 F. k+ s5 T- r; U
    #adding dense layer, B  _" U# Q" D2 `% S. U
    model4.add(Dense(216,activation='relu'))
    / d* _- S0 P: r#adding dropout
    . v' _4 _( G1 J) D/ i9 Jmodel4.add(Dropout(0.2))7 ^; o) a8 S$ J/ K# l( A$ B
    #adding output layer$ e8 y8 x7 N. N" ]% X
    model4.add(Dense(10,activation='softmax'))8 y8 B7 ?! Q' d
    model4.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
    ( u1 M# v+ L; D9 b( B7 k' Bmodel4.fit(X_train,y_train,epochs=10)% g7 }3 E" E8 u2 g+ Z% ]) c2 K

    # Z' K3 L3 x: z6 |7 |4 O4 h  o+ C8 I" {  N% [# x4 A( A0 X
    model4.evaluate(X_test,y_test)
    4 P5 B( h, o3 S  a
    + g, S1 s% A9 u- F3 e通过这个模型,我们得到了76%的训练准确率(低于第一个模型),但我们得到了72%的测试准确率,这意味着过拟合的问题在一定程度上得到了解决。( h6 {) j+ V9 e. d5 Y; E
    " O/ i: y! W4 d1 N' n# V, i
    尾注& w: J9 |' }4 F6 s" K. L
    这就是我们在 Python 中实现 CNN 的方式。这里使用的数据集是一个简单的数据集,可用于学习目的,但一定要尝试在更大和更复杂的数据集上实现 CNN。这也将有助于发现更多挑战和解决方案。
    . ~! u% H- D9 G! a
      h, Z  e; |4 E' }5 d; e
    ( C1 M1 W  m* D4 ^' _  O: S5 O3 Q1 i: E
    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-10-18 01:52 , Processed in 1.764212 second(s), 51 queries .

    回顶部