QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-29 17:31 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
                                                       使用卷积神经网络开发图像分类模型
    ) r/ }; t& e, A2 {8 R1 \% o简介
    . i1 y% L$ {7 s' u, t2 s0 l
    . e' R9 j/ G5 N7 W, L! }. _2 X这篇文章是关于卷积网络、它的工作和组件: 在本文中,我们将使用卷积神经网络执行图像分类,并详细了解所有步骤。因此,如果你对此不熟悉,请继续阅读。
    ; n6 l3 l5 `3 H! C( g
    1 r0 b7 u4 o( h6 M简而言之,CNN 是一种深度学习算法,也是适用于图像和视频的神经网络类型之一。我们可以从 CNN 中实现各种功能,其中一些是图像分类、图像识别、目标检测、人脸识别等等。( s2 b% v4 Q# s4 y; r

    0 @6 L# u) {$ \' l( A3 r/ U7 B4 ]今天,我们将对CIFAR10 数据集执行图像分类,它是 Tensorflow 库的一部分。它由各种物体的图像组成,如船舶、青蛙、飞机、狗、汽车。该数据集共有 60,000 张彩色图像和 10 个标签。现在让我们进入编码部分。5 `! q- d/ @# ~3 Q) }6 W' S) u( L9 N
    / L0 g) x& L, p- f9 j$ t
    实施
    ; N* I5 k. N  l% g  L% r, b( `
    4 Y6 |- z. E( g, L7 `! N0 E- C  R* X# importing necessary libraries2 i5 `  {$ h; B: C
    import numpy as np
    - ^4 y* L2 Q% B9 w' m  B! jimport matplotlib.pyplot as plt
    ) \/ |- F- g/ d: J5 O%matplotlib inline
    ( @" _6 q( n$ [; O, O3 ^' L# To convert to categorical data& ~& A0 M6 y7 H/ L; V' [
    from tensorflow.keras.utils import to_categorical0 A; k* r5 \# x9 y/ Q4 K* R( B
    #libraries for building model) U, i, [1 h- x$ V3 k+ j
    from tensorflow.keras.models import Sequential
    % [' V9 U5 ^- H  K+ Pfrom tensorflow.keras.layers import Dense, Conv2D, MaxPool2D, Dropout,Flatten
    0 T* F8 J- A8 [0 {# Wfrom tensorflow.keras.datasets import cifar106 E2 M! D1 X- y$ |# \
    # M# C2 _/ V1 |
    #loading the data
    # F2 B1 v& i6 Q6 ^5 s* Z) ^9 g3 X(X_train, y_train), (X_test, y_test) = cifar10.load_data()
    0 ]( k% p8 Q- W/ J
    . |9 b5 o: U, }8 G2 y探索性数据分析3 e/ B/ ?8 v4 ^4 t7 [0 [1 t5 R$ s
    #shape of the dataset
    , D) x3 ]- z0 p+ }) q% cprint(X_train.shape)! F" n7 D  q* o
    print(y_train.shape)+ ]8 K1 |' n) t
    print(X_test.shape)+ j; Y7 i9 a! p5 u% z
    print(y_test.shape)
    5 Q) M- A0 v" s: ?3 P; A& v8 S& x# M2 N9 n, c

    : U; u! \, v) H  r; v! H6 x我们的训练数据有 50,000 张图像,测试数据有 10,000 张图像,大小为 32*32 和 3 个通道,即 RGB(红、绿、蓝)
    & W6 n1 ~& Q9 h) ?#checking the labels
    8 s" J+ M+ a" U! b! `% |' xnp.unique(y_train)
      D0 t: m* d( F# m/ T* v1 N
    ! o  e5 N6 r# ~4 w5 y0 F
    ' G2 m* u! b7 q  Z#first image of training data0 z& X$ _  s1 n8 ?$ n! {  o2 D
    plt.subplot(121)
    3 D& C. V2 f# _) J& |/ U$ zplt.imshow(X_train[0])7 ~+ d$ D" T- C- {: L) t5 v8 v) y' p
    plt.title("Label : {}".format(y_train[0]))
    + v/ p3 s) k$ V#first image of test data( F7 E) v* q$ y# g0 @' Z
    plt.subplot(122)9 o6 W7 H8 @5 f) |
    plt.imshow(X_test[0])
    2 t+ \4 l% L$ y/ b& V9 Xplt.title("Label : {}".format(y_test[0]));
    9 f- K  N3 d6 \
    % o2 i+ F: F9 ?9 K- ?* e, X/ P# `. U" ~; L& @
    #visualizing the first 20 images in the dataset$ f) L  j* G6 a! i6 U* U2 [
    for i in range(20):
    ) s/ y; G7 o( L9 A/ R* T$ D4 i$ H    #subplot
    2 \5 G/ h3 Y" [    plt.subplot(5, 5, i+1)
    ' i9 Z' u% P' Q; O& \, }    # plotting pixel data+ G, \+ @& m$ p' h( h$ L
        plt.imshow(X_train, cmap=plt.get_cmap('gray'))
    4 Z# I: U3 Q! W+ l0 p8 k# show the figure7 H0 d) V' W& J% m8 i
    plt.show()
    ) ]- M9 Q9 d" X4 m+ A$ n+ ]/ |: @
    ! w7 }: v9 H  ?" U5 P" d, U: O" E
    ( o$ a5 U) S  Z预处理数据

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

      h" k1 k1 n0 W% q" Z
    # Scale the data to lie between 0 to 1# [: H% a7 @- b3 H$ T
    X_train = X_train/2550 Y. |3 y2 h$ @3 Q0 }
    X_test = X_test/255. P% w7 }( O7 l# L3 P
    print(X_train): n, @# Q: K0 H" n! e% q1 r+ L5 ~2 [( z
    3 L* M( i. V* Y7 j/ L( P
    : P. ~( @4 _% }2 i3 K
    #reshaping the train and test lables to 1D
    + X$ L1 t! M; H3 j& Ay_train = y_train.reshape(-1,)
    9 T3 o* R- b+ E% B* C* _# k/ A3 ky_test = y_test.reshape(-1,)+ n2 `) S; Z7 X9 `' N# d9 g: R
    ! z- r7 P2 j$ S* x% D! q% V! X
    我们在上图中可以看到,图像的像素值已经进行了缩放,其数值在 0 到 1 之间,并且标签也进行了重塑。数据已准备好建模,现在让我们构建 CNN 模型。& o6 k; j, R' w& o% |2 Q7 b9 \. k
    模型搭建

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


    % F+ \; C  C: W' l* Q; cmodel=Sequential()
    - F5 D( S- r# W; B; T#adding the first Convolution layer
    , Y9 o& u* \: x4 k1 F9 _! \model.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))4 Z5 l2 X5 w- O  V, D1 D3 b
    #adding Max pooling layer
    , H" i. p. \) y. d: V% amodel.add(MaxPool2D(2,2)), K/ X# |$ w% x0 x+ m' @! u
    #adding another Convolution layer$ l4 i+ l' h& M+ w
    model.add(Conv2D(64,(3,3),activation='relu'))
    % C  f9 T8 Y' d# o( F) gmodel.add(MaxPool2D(2,2))
    , |) E$ [4 }0 o/ c" imodel.add(Flatten())- |9 f; T: D# p8 K% [. s
    #adding dense layer6 i+ h- z- `- Y/ T% z; {$ K* L6 t
    model.add(Dense(216,activation='relu'))
    2 I+ `( I1 R3 K( l$ |#adding output layer) J9 t1 a8 L* K. P+ T2 O
    model.add(Dense(10,activation='softmax'))5 t0 N" M0 y3 E& c: j! n- c+ o- K4 j6 n
    7 c9 Z' t/ |6 {: s+ F) ~$ e. l
    我们添加了第一个带有 32 个大小为 (3*3) 的过滤器的卷积层,使用的激活函数是 Relu,并为模型提供输入形状。$ V8 Q/ l" p4 v5 R2 U& l9 T
    5 ?6 E8 @* l1 O- n
    接下来添加了大小为 (2*2)的Max Pooling 层。最大池化有助于减少维度。CNN 组件的解释请参考:https://www.analyticsvidhya.com/blog/2021/08/beginners-guide-to-convolutional-neural-network-with-implementation-in-python/% `& H& x9 c& f
    7 }4 G' e  G% p  z
    然后我们又添加了一个卷积层, 其中包含 64 个大小为(3*3) 的过滤器 和一个大小为 (2*2)的 最大池化层
    1 A  D: @% _- {1 w7 `0 J+ C! L8 U1 t
    在下一步中,我们将层展平以将它们传递到 Dense 层,并添加了一个包含 216 个神经元的Dense 层。4 |0 I) K5 O) }. x: S
    * m9 Q5 j, c  o: r' N3 O+ X
    最后,输出层添加了一个 softmax 激活函数,因为我们有 10 个标签。
    ( n9 ?5 N( g+ t4 _$ B; }1 S  \7 r" a( h* x: W- V
    第 2 步:编译模型
    * I/ e: j/ M2 d. v" Ymodel.compile(optimizer='rmsprop',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
    ( E) x1 |5 o2 ?; O
    ! l% S8 D' {% v% ~: J* B第 3 步:拟合模型model.fit(X_train,y_train,epochs=10)
    5 p) W; f- w7 f) A  }, O( Y( O' K2 h0 A0 ]% ^
      |9 ^, S$ E/ k  |8 W
    如上图所示,我们的准确率为 89%,损失为 0.31。让我们看看测试数据的准确性。
    8 ]4 O% _7 ^) g; O8 Z第 4 步:评估模型model.evaluate(X_test,y_test)1 l5 W7 e1 V8 ?; J0 c

    ) T  y+ m$ ~7 k6 `; j* Z; w7 c: H0 x' {! c$ {
    测试数据的准确率为 69%,与训练数据相比非常低,这意味着我们的模型过度拟合。" K4 W  A3 b* |1 G- {0 d5 M4 p
    第 5 步:进行预测. q( _, Q$ J+ x+ j
    pred=model.predict(X_test)
      i  g7 [! G9 [8 f4 t#printing the first element from predicted data
    ! x$ T; W: f: v: H+ ^print(pred[0]); f, x! g5 j' V+ z
    #printing the index of
    5 ]2 J. h6 _. w9 i5 ]5 r' t% Dprint('Index:',np.argmax(pred[0]))  u$ ~4 T. P! D6 k% a
    ) E, t; n: w$ d  F; Y+ A
    2 P8 E& B& C7 |) p! ^' v5 t

    ) `* D6 M, j: C5 v& G% n. f3 I

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

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

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

    y_classes = [np.argmax(element) for element in pred]
    4 r# M, h1 `0 xprint('Predicted_values:',y_classes[:10])& D. U, D- E, [2 ^7 M5 I; L
    print('Actual_values:',y_test[:10])
    0 V+ f0 A7 O/ F% o% ]' b6 C' B) Z. F: L; y3 \0 |6 T" O! _; y

    . [' p( \8 X7 S+ Q8 N

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

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


    * ]  g7 \5 X3 gmodel4=Sequential()
    & Q4 l/ _+ B; H, K" L4 ?" R5 O& H#adding the first Convolution layer) j, `2 C+ I& w' U; x
    model4.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))! ^: U1 S6 B; _7 i+ g) A) T
    #adding Max pooling layer, C! P2 v+ d4 s# H" O+ @, b
    model4.add(MaxPool2D(2,2))) N6 o( F; G4 g8 f% f
    #adding dropout; h" Y1 \: n  Q
    model4.add(Dropout(0.2))  q" W# L1 M# Z
    #adding another Convolution layer
    - |' O& P9 B& j6 Q5 gmodel4.add(Conv2D(64,(3,3),activation='relu'))) G3 E8 l& @5 J
    model4.add(MaxPool2D(2,2)): c8 t7 F) Q7 u: C2 E4 Q
    #adding dropout7 Z1 b8 V' P3 v- H* ^
    model4.add(Dropout(0.2))
    : F4 o" F$ W; i: e8 j+ omodel4.add(Flatten())
    4 _' [% Z$ w2 l; p; Y  {9 K#adding dense layer
    & k: ?7 |0 s3 Q2 C1 A. }* P& smodel4.add(Dense(216,activation='relu'))
    ( y0 _  @% j! ~- P) K. b9 ?' o$ j( T#adding dropout  o* |: y" {+ n8 Q
    model4.add(Dropout(0.2))
    ' }+ l8 l% @3 {6 Q9 n# ^, B. n#adding output layer* J, L1 V7 A$ g7 _8 C
    model4.add(Dense(10,activation='softmax'))8 ?7 B- B, N  Y
    model4.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
    + v' D5 ^% b: f; A, i- gmodel4.fit(X_train,y_train,epochs=10)5 Z! H6 v# Z5 G6 h) c8 x

    . K) K9 ]) g$ b. F  O9 T, y' D+ i& g+ {) [# r
    model4.evaluate(X_test,y_test). @+ ~/ u9 E: d  e) p. d1 i' i
    ! h% _$ T+ ?# s: Q
    通过这个模型,我们得到了76%的训练准确率(低于第一个模型),但我们得到了72%的测试准确率,这意味着过拟合的问题在一定程度上得到了解决。  r& n9 _- d! M$ F
    4 [5 `  s5 M. C- _# j
    尾注* E: N' A& |1 |$ U* G4 w2 d' p5 b5 x6 K0 h
    这就是我们在 Python 中实现 CNN 的方式。这里使用的数据集是一个简单的数据集,可用于学习目的,但一定要尝试在更大和更复杂的数据集上实现 CNN。这也将有助于发现更多挑战和解决方案。
    5 M+ V4 Z" v. i4 z5 M
    # O. y2 h* B1 T) P, n7 p. p% v- B" }1 m1 M0 p8 t( [: O
    # [7 r; }' l, N! d; q
    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 20:17 , Processed in 0.403697 second(s), 50 queries .

    回顶部