QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-29 17:31 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
                                                       使用卷积神经网络开发图像分类模型+ C7 U! B/ }5 o4 q, w% R
    简介' `7 l" [6 ~, I, d1 F
    7 u- X% b. d2 c0 W
    这篇文章是关于卷积网络、它的工作和组件: 在本文中,我们将使用卷积神经网络执行图像分类,并详细了解所有步骤。因此,如果你对此不熟悉,请继续阅读。
    / U& V5 f% q2 [% w0 V; W4 J' B" E% q9 X7 V' ?5 E2 W# d! \
    简而言之,CNN 是一种深度学习算法,也是适用于图像和视频的神经网络类型之一。我们可以从 CNN 中实现各种功能,其中一些是图像分类、图像识别、目标检测、人脸识别等等。, r( o8 P% i9 F$ G. @" L2 o
    & k# I4 W: C) W3 H
    今天,我们将对CIFAR10 数据集执行图像分类,它是 Tensorflow 库的一部分。它由各种物体的图像组成,如船舶、青蛙、飞机、狗、汽车。该数据集共有 60,000 张彩色图像和 10 个标签。现在让我们进入编码部分。
    - c% Z  n+ F6 U( J0 J5 s+ C* d, E# K4 z' G
    实施
    ; u' \) @' F6 k! O
    / @0 ], P4 V& p& `% a# importing necessary libraries% [. ?. ?  Y5 r( a4 U. L5 B2 m
    import numpy as np
    ; _& s$ N0 l* x0 oimport matplotlib.pyplot as plt
    - \$ [  }6 Y7 s6 i' N- P! @%matplotlib inline! e) u  n+ p8 a
    # To convert to categorical data
    2 e7 d5 H- }6 w+ ~+ c, b0 Lfrom tensorflow.keras.utils import to_categorical6 }6 P. y1 D0 g$ C! k! b
    #libraries for building model, @' y- A$ `  ~$ w* x
    from tensorflow.keras.models import Sequential
    - s8 Q7 L( j9 V. L$ }) Rfrom tensorflow.keras.layers import Dense, Conv2D, MaxPool2D, Dropout,Flatten
    ; I$ e1 v* `9 y% Z% v& Xfrom tensorflow.keras.datasets import cifar10
    4 W4 i" P6 c" r/ v/ {. N$ A1 G' c$ M6 Z7 @4 r, i% ~
    #loading the data
    & x4 w+ d+ i- e' |(X_train, y_train), (X_test, y_test) = cifar10.load_data(); z( A2 h& b4 A9 Y( w( T5 G/ \

      Q5 `! D0 o3 b# i% i探索性数据分析% _5 p" f# A: S+ f
    #shape of the dataset" V7 u6 I) {- t, v% i
    print(X_train.shape)+ K9 p7 Q, q# ?* w1 _' w% r/ {4 y) U
    print(y_train.shape)4 q/ H2 S; j0 h- l5 H5 Y
    print(X_test.shape)
    : Y% j, D, M1 F: Q; _! }+ Pprint(y_test.shape)3 {0 B3 B9 G! Q+ @2 h1 g% X

    2 k- Z# ?8 s1 f3 U
    3 L( ~2 O' q$ a我们的训练数据有 50,000 张图像,测试数据有 10,000 张图像,大小为 32*32 和 3 个通道,即 RGB(红、绿、蓝)
    ! `# b$ @  G5 r, U, ~9 O9 w! X#checking the labels 9 j* o( E1 r" {$ y# @& A2 J' ^8 x
    np.unique(y_train)
    / I! O5 k1 J' q
    / C5 b: T8 a7 U6 O
    " M) _; j! |% n# a1 s#first image of training data+ {  O& n; k3 O2 W
    plt.subplot(121)
    6 T% J7 m6 H2 {3 H6 @: Q6 d- Dplt.imshow(X_train[0])
    # w5 P$ A0 H0 D6 d" C3 \plt.title("Label : {}".format(y_train[0]))
    8 c+ |) S  H5 n: t! |2 D! P#first image of test data1 U; G9 b  }8 v- Z7 `. p" z2 s$ G
    plt.subplot(122)% {( {; Z9 T+ l# j6 i
    plt.imshow(X_test[0])
    / [' h5 C) k( B' G/ @% [1 Xplt.title("Label : {}".format(y_test[0]));* S/ c0 N$ G* _3 I6 N% _

    . ^/ J, c+ @4 V' j* X3 Q2 M$ w# [/ i
    4 M! z" D$ q+ I0 a4 h* i#visualizing the first 20 images in the dataset
    " i; v) A* y2 D: M. Jfor i in range(20):8 H+ `& z/ p4 @2 W
        #subplot
    + Z6 f; U9 K0 t  K    plt.subplot(5, 5, i+1)# j% U: b' R" _+ \3 H$ b
        # plotting pixel data$ F. z4 X- t1 m7 d4 p1 P5 ~
        plt.imshow(X_train, cmap=plt.get_cmap('gray'))
      Y3 O$ k  O1 x. D# W# show the figure
    8 A* r3 @9 \" |2 q* ~( tplt.show()
    3 n3 ~7 P: e' J2 v5 N2 `0 l$ q8 @2 I2 H% |, R7 L5 i$ }. E4 e
    3 l: M: G* G" j
    预处理数据

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


    & ?* ]% k1 w% B0 K+ v0 h/ x. C# Scale the data to lie between 0 to 1! s* J9 J5 p& K& Z3 v
    X_train = X_train/255& `, G* A* _. K
    X_test = X_test/255
    + V+ S1 M/ O$ G: ^print(X_train)2 P( A" N3 X! Y- u
    / f+ _* {- A, F
    8 ]! \, G" b7 K% l9 v8 B' a
    #reshaping the train and test lables to 1D0 R& y# V( d) A  J  _- `/ A% L
    y_train = y_train.reshape(-1,)4 O0 K* K. U1 ?& ~
    y_test = y_test.reshape(-1,)
    1 s% F  U0 K- O. j- m$ p
    - e2 R" @, r3 A0 ~: D) C6 ]我们在上图中可以看到,图像的像素值已经进行了缩放,其数值在 0 到 1 之间,并且标签也进行了重塑。数据已准备好建模,现在让我们构建 CNN 模型。" e9 K: L( p+ `7 v
    模型搭建

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

      F) H* ]( o. m0 E, l. t; E
    model=Sequential()
    2 Z6 a; M1 M( H9 x; p, M#adding the first Convolution layer
    9 P/ e1 q) Q2 Hmodel.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))" V- i$ a  K6 ~1 ~3 c6 {
    #adding Max pooling layer
    + Q/ y5 |3 j6 g6 J9 Emodel.add(MaxPool2D(2,2))
    3 J  U0 L. A7 a/ p$ h0 B#adding another Convolution layer  A6 }* w& a1 b- H) f: f
    model.add(Conv2D(64,(3,3),activation='relu'))1 d9 B8 n3 ~! r
    model.add(MaxPool2D(2,2))3 w5 o$ Y( i' ^5 k- k% y' w
    model.add(Flatten())
    ) |8 g: c) R7 C3 o$ V( x#adding dense layer
    ) j6 O- S% o2 t" Nmodel.add(Dense(216,activation='relu'))% `/ z/ g  s* z' R, h
    #adding output layer
    / X: n( x; d) Z" c7 F. @: X8 k8 Mmodel.add(Dense(10,activation='softmax'))
    % {( _1 r* I( j. t# o( Y3 j4 w# w% e
    ! G$ f1 l& h# n/ o$ U我们添加了第一个带有 32 个大小为 (3*3) 的过滤器的卷积层,使用的激活函数是 Relu,并为模型提供输入形状。
      H0 v! A' u5 }# B" m* E7 }9 K% h. i+ F2 K$ N( _
    接下来添加了大小为 (2*2)的Max Pooling 层。最大池化有助于减少维度。CNN 组件的解释请参考:https://www.analyticsvidhya.com/blog/2021/08/beginners-guide-to-convolutional-neural-network-with-implementation-in-python/" G; u" n# U% k, Y7 M- W: i

    : g7 h' J: d' [( }0 q然后我们又添加了一个卷积层, 其中包含 64 个大小为(3*3) 的过滤器 和一个大小为 (2*2)的 最大池化层
    - `  s5 J  k/ S) a- p! a- L
    - ~) e: V9 ?2 I& w9 h: t4 E8 a, \( s在下一步中,我们将层展平以将它们传递到 Dense 层,并添加了一个包含 216 个神经元的Dense 层。
    3 r- s; t0 a3 X  [1 ~% S# t+ \* y8 C7 @) _
    最后,输出层添加了一个 softmax 激活函数,因为我们有 10 个标签。
    6 T, r7 F9 Y! x+ P  [3 _4 M* j. l6 |0 h' |
    第 2 步:编译模型7 X$ N! b! P" X" t; t
    model.compile(optimizer='rmsprop',loss='sparse_categorical_crossentropy',metrics=['accuracy'])1 J9 @9 T9 E1 N" H

    , a" M% y+ R: {/ z0 o' p第 3 步:拟合模型model.fit(X_train,y_train,epochs=10)
    0 }4 p- c% L( X/ \2 E; F8 V5 R, o* @7 ^. H
    7 x0 D* Y0 Y! W+ V7 n9 ~% b5 B
    如上图所示,我们的准确率为 89%,损失为 0.31。让我们看看测试数据的准确性。
    2 s. I* K9 Z5 v( T第 4 步:评估模型model.evaluate(X_test,y_test)
    0 j& T+ ^# ]& B+ J, x$ W+ b. A. k
    2 u& z+ H* X* V8 v$ o
    测试数据的准确率为 69%,与训练数据相比非常低,这意味着我们的模型过度拟合。
    ; ?- |5 P. }& Y2 S第 5 步:进行预测' }1 t% a9 M( q) j8 f0 V
    pred=model.predict(X_test)
    $ I0 F, U- L! M+ }% m& t3 Z#printing the first element from predicted data$ ?& @% R1 R( l( }6 ]' [
    print(pred[0])
    $ _6 {; v$ T! G* x% |#printing the index of $ O+ A3 |; t, R& }; `. v3 ^
    print('Index:',np.argmax(pred[0]))4 `0 B/ A3 o9 K2 e
    - k3 ^( Z- E8 p* E  _3 y: w6 k# a
    2 w' g, b5 F# v* C& M: @: u5 F
    1 e1 V+ m6 X: Y

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

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

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

    y_classes = [np.argmax(element) for element in pred]! z9 ~( u5 |  P
    print('Predicted_values:',y_classes[:10])4 [5 @( x9 z: W3 B6 \
    print('Actual_values:',y_test[:10])
    4 f! o- C* C. M0 z. f. A( G, {4 M. `- g! g
    9 p: K7 O7 m! f, I; R- B4 g! J# t

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

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


    " Z( S. r3 q. Y3 z4 nmodel4=Sequential()9 L( V4 F! f$ Z2 I( L
    #adding the first Convolution layer' K2 Q+ D3 [: e. y7 V) A; }6 i
    model4.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))4 N3 f7 f$ m( \" I) t9 [  b- D7 {: N
    #adding Max pooling layer
    ; G' H; y  U2 ~( B7 z! `& qmodel4.add(MaxPool2D(2,2))
    1 |( N: C( j" D" `% A: F#adding dropout1 k% C5 z9 o' R3 i& P: J( B! _% B0 [
    model4.add(Dropout(0.2))
    2 G7 O1 U( e( r2 x#adding another Convolution layer6 O% e; L. H2 {8 O6 b' C3 x& g
    model4.add(Conv2D(64,(3,3),activation='relu'))+ R0 \: {- W% O4 _2 K
    model4.add(MaxPool2D(2,2))
    : e3 v( k7 u' j+ }' K, Z0 Z9 y#adding dropout
      S2 ~, G% j; v4 Zmodel4.add(Dropout(0.2))% O* i0 ~- W4 g5 k8 ^0 M  x' \2 F
    model4.add(Flatten())
    + m. Z$ m3 @, a( r/ W#adding dense layer
    / `+ `0 ~& h! \4 X7 bmodel4.add(Dense(216,activation='relu'))
    ( {& @* @. Q: M) y#adding dropout+ d# B/ L) A3 {" i
    model4.add(Dropout(0.2))
      H, \( X# \8 a1 J#adding output layer
    # C, p& Q% I$ o. r4 Jmodel4.add(Dense(10,activation='softmax'))
    ( p1 U- b- ?: g. F* m, vmodel4.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
    5 L0 y' Y0 X: O0 `; u8 O' ^model4.fit(X_train,y_train,epochs=10)
    0 h# y3 }- x6 d9 M7 h, P4 L. z1 X% ]; O) s

    * f0 W/ @4 u6 z3 M8 Umodel4.evaluate(X_test,y_test)- j8 E; [/ O: r% J

    # a% }3 w& c" w! W通过这个模型,我们得到了76%的训练准确率(低于第一个模型),但我们得到了72%的测试准确率,这意味着过拟合的问题在一定程度上得到了解决。) ]: @1 d2 s# d

    : }( z& ], M$ ]尾注4 o0 k+ N  `1 Z; G3 U8 A
    这就是我们在 Python 中实现 CNN 的方式。这里使用的数据集是一个简单的数据集,可用于学习目的,但一定要尝试在更大和更复杂的数据集上实现 CNN。这也将有助于发现更多挑战和解决方案。
    . u. @& a% h, o8 M" h# `& r# b- |% t! }( d
    0 n. M, b4 V6 D) `8 b

    , U* f7 [" e2 \& R3 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-4-9 12:27 , Processed in 1.289966 second(s), 51 queries .

    回顶部