QQ登录

只需要一步,快速开始

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

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

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

1178

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-29 17:31 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
                                                       使用卷积神经网络开发图像分类模型# q; v& I$ W) q$ J) n! w: R
    简介4 B; H0 L( Z& F4 L$ k

    . b7 s% a- k' L# G+ m9 B4 q这篇文章是关于卷积网络、它的工作和组件: 在本文中,我们将使用卷积神经网络执行图像分类,并详细了解所有步骤。因此,如果你对此不熟悉,请继续阅读。" o( b: G) H% K1 {3 @6 f- b! Q1 m
    / l) L' |, a1 p! f$ X, f; P
    简而言之,CNN 是一种深度学习算法,也是适用于图像和视频的神经网络类型之一。我们可以从 CNN 中实现各种功能,其中一些是图像分类、图像识别、目标检测、人脸识别等等。7 x  \1 _& }! r2 r) n
    ) Y# g& S- ~9 R8 b) a
    今天,我们将对CIFAR10 数据集执行图像分类,它是 Tensorflow 库的一部分。它由各种物体的图像组成,如船舶、青蛙、飞机、狗、汽车。该数据集共有 60,000 张彩色图像和 10 个标签。现在让我们进入编码部分。
    " S2 t- @5 C' K4 z" F1 }3 ~  G: U
    ) V8 O2 e# ?0 Q5 @( p" u! w' t实施. [+ f, f- O' c$ @, ]
    . V1 `& F3 U! W/ i
    # importing necessary libraries
    0 H- F) ^: H# d; L- rimport numpy as np
    4 {5 A: e, C) R% vimport matplotlib.pyplot as plt/ s, l- h' r2 g3 K$ s6 L
    %matplotlib inline
    ' y" L3 g: Z9 [3 \& t4 i5 P, |# To convert to categorical data
    * h% s  U& b4 O  S$ }% dfrom tensorflow.keras.utils import to_categorical
    0 F* D: o+ N" ^7 k#libraries for building model
    5 S5 u* S, T( X" kfrom tensorflow.keras.models import Sequential
    * l5 H$ h# ^8 w7 Nfrom tensorflow.keras.layers import Dense, Conv2D, MaxPool2D, Dropout,Flatten
    2 o& u6 [, Z! i) }! {from tensorflow.keras.datasets import cifar10
    1 \* i4 y1 q; ^! A6 g
    ' T, u1 K* f4 B- a#loading the data) B3 N6 a/ Y1 i
    (X_train, y_train), (X_test, y_test) = cifar10.load_data()1 R! u0 n6 r# Y9 C5 ]

    . M' s. J$ V% [( G/ L探索性数据分析* ]; W- ]" G' B" x. I/ X
    #shape of the dataset6 @1 p/ D' a( W' k  X* n- Q4 T
    print(X_train.shape)' Q/ L) Z" x6 y
    print(y_train.shape)
      U( T! G8 m1 M# |; r/ Y2 \* bprint(X_test.shape)
    4 }! P% w2 P& sprint(y_test.shape)
    8 b. B4 W* B7 @+ X. [7 O' z5 }( v9 |) `9 C3 ]/ D

    ! F+ |' _- y+ U7 J) w7 E8 h我们的训练数据有 50,000 张图像,测试数据有 10,000 张图像,大小为 32*32 和 3 个通道,即 RGB(红、绿、蓝)
    : N$ }4 q* `/ O" K5 m+ @5 S#checking the labels
    6 X2 A4 f* E3 h5 u* |" z) Rnp.unique(y_train)
    $ F5 P; N+ o( a1 w* z: K
    ! y9 L* G* _# N8 ~9 R& k( Q
    / O, {  X) c$ V2 ?. m8 P, e#first image of training data
    ) y8 e# o) [( Y6 Vplt.subplot(121)
    - `' t( t5 O3 V) i2 H$ vplt.imshow(X_train[0])
    7 v: }  ~7 I5 V  mplt.title("Label : {}".format(y_train[0]))
    8 z0 o3 @7 U3 a/ T- r#first image of test data
    , A, `3 q1 R% e# T% nplt.subplot(122)
    ( F# u6 ?, ?( j& yplt.imshow(X_test[0])
    ; ~* k/ Q* E6 N; j- eplt.title("Label : {}".format(y_test[0]));. r& Z. h- y2 V
    % H+ O# w/ h. R% `1 d9 Q
    $ x6 c$ d6 N0 C. f+ ~. X
    #visualizing the first 20 images in the dataset, ~0 b! g% O9 \% a4 P# I
    for i in range(20):
    7 n9 H3 J2 K; e    #subplot
    # e, L* f- J0 O0 ?7 |    plt.subplot(5, 5, i+1)
    + |0 b2 s6 t1 q( b( _8 [$ x    # plotting pixel data; R7 [* {" [5 a
        plt.imshow(X_train, cmap=plt.get_cmap('gray'))
    & N0 ^: i4 L3 A# I# show the figure
    8 Q  j3 X8 h. q9 d$ x: w" A8 q4 Lplt.show()
    & j9 `$ w  K+ W  A6 S, V' M5 T7 W, n* V: ^  k9 O
    ; K4 `+ b3 W: u9 d) Q4 O) B  d7 D9 R
    预处理数据

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

    " v! B+ `8 M2 }: A0 L3 z$ G
    # Scale the data to lie between 0 to 1
    - n3 ^4 X: M: j( Q. G1 NX_train = X_train/255
    # w) T% B. f8 K$ U# z6 S5 VX_test = X_test/255
    ; x/ g( D  p% H( cprint(X_train)
    % G7 D" N  B, J/ }$ }+ l! n& z7 w( l1 Q( f3 b, o
    9 k* @" a% R  H! c1 N
    #reshaping the train and test lables to 1D  p+ \& V% F0 d5 G; `
    y_train = y_train.reshape(-1,), c+ W" d4 C9 k) o0 b' }& ?
    y_test = y_test.reshape(-1,)4 ~8 d# Q9 _9 ^# S, p7 |, X$ K

    ( L- w' W; f3 @5 Y0 J我们在上图中可以看到,图像的像素值已经进行了缩放,其数值在 0 到 1 之间,并且标签也进行了重塑。数据已准备好建模,现在让我们构建 CNN 模型。
    6 [' C+ h4 Z1 Z) [; |. m模型搭建

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


    4 O- Z9 J3 r3 V9 K' B% x$ fmodel=Sequential()
    0 \* x7 P5 c9 ^$ S; p- O#adding the first Convolution layer  j! W" _- w0 v( k  J. g
    model.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))
    $ z3 e; {( q3 s! X& e" U+ D#adding Max pooling layer
    # t6 ]( k: v/ ~0 g* F" ^2 x$ J3 smodel.add(MaxPool2D(2,2))0 C0 ?2 ~3 M: K- }* z6 A
    #adding another Convolution layer9 J2 d* b) X# G9 [2 a
    model.add(Conv2D(64,(3,3),activation='relu'))
    , z2 H# w  S! N: smodel.add(MaxPool2D(2,2))
    4 {7 z) }  B' r# `. H  w" J* qmodel.add(Flatten())4 O5 e+ v# I, H4 U- d; T& l
    #adding dense layer
    / E4 ~7 e8 c" z1 L" n9 omodel.add(Dense(216,activation='relu')); m/ C0 ]# {+ {3 R: N3 i$ A
    #adding output layer
    & f! A5 O; U! k" }# Zmodel.add(Dense(10,activation='softmax'))1 G& a! Z# s$ u8 I$ R1 T( u5 R/ f

    ' ]& }6 y; f" ?8 C我们添加了第一个带有 32 个大小为 (3*3) 的过滤器的卷积层,使用的激活函数是 Relu,并为模型提供输入形状。& k! b. {. m  j

    * G; w; u1 ^' h接下来添加了大小为 (2*2)的Max Pooling 层。最大池化有助于减少维度。CNN 组件的解释请参考:https://www.analyticsvidhya.com/blog/2021/08/beginners-guide-to-convolutional-neural-network-with-implementation-in-python/, i$ |) W4 A1 f! m! ]
    - p* U3 M" C8 @
    然后我们又添加了一个卷积层, 其中包含 64 个大小为(3*3) 的过滤器 和一个大小为 (2*2)的 最大池化层
    " j9 l- K, K6 u6 A: m, Q% U; @6 K" p$ W% ^
    在下一步中,我们将层展平以将它们传递到 Dense 层,并添加了一个包含 216 个神经元的Dense 层。
    * M" u' `) f. u7 z5 E8 Z3 l" s
    $ U3 }% n+ D/ P- y5 t! q最后,输出层添加了一个 softmax 激活函数,因为我们有 10 个标签。6 E( O6 E" S7 v6 B1 z' m! b9 x% y5 r
    ) d! K6 p+ U0 d+ B
    第 2 步:编译模型9 E/ }; q  t/ b% ?; _% a9 u# @8 p
    model.compile(optimizer='rmsprop',loss='sparse_categorical_crossentropy',metrics=['accuracy'])& S8 j: A5 u; w0 p

    ; Y: x2 w, a; M0 D) ~+ L0 K第 3 步:拟合模型model.fit(X_train,y_train,epochs=10)
    % ~0 S8 U  {, e# H! S% w5 C. e& G

    1 s7 b( ^: S9 Y0 M如上图所示,我们的准确率为 89%,损失为 0.31。让我们看看测试数据的准确性。
      n9 ]" g/ [5 {第 4 步:评估模型model.evaluate(X_test,y_test)+ j2 w0 a: t1 Y( i" ^9 o
    7 i- I7 @9 C: i1 T

    * {1 X  G' ?# w6 P/ o测试数据的准确率为 69%,与训练数据相比非常低,这意味着我们的模型过度拟合。; e. Q% p& K0 S- M; j
    第 5 步:进行预测
    - d' z# B! W6 a9 T7 Vpred=model.predict(X_test), p" {, t# Z0 K
    #printing the first element from predicted data
    1 y! {( U: a2 W6 p6 yprint(pred[0])
    2 t- @8 r* C% d7 ~#printing the index of 9 r/ P3 ^- q- \
    print('Index:',np.argmax(pred[0]))" z4 i* }# x8 c2 b

    8 X3 J8 f2 j2 }* u9 t4 V. T; v3 [$ r$ \0 \4 N

    & _5 g9 ^' R* h) t, I9 U8 F

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

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

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

    y_classes = [np.argmax(element) for element in pred]
    4 ^" A& R' X2 W+ R- ~print('Predicted_values:',y_classes[:10])
    ) y4 V( a+ A& ~" L& h. k4 P0 Cprint('Actual_values:',y_test[:10])# `- M, X3 @3 A8 s
    0 i1 f; b: x$ u
    # d9 _" m% W) n4 s+ \  a9 c

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

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


    8 {; L3 r) z0 K6 z: V# j; ~model4=Sequential()# B: G/ ~- c- l1 B1 K
    #adding the first Convolution layer+ {' r( ~/ Z0 A, g' F
    model4.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))+ j" K. c. H5 z; M. Z
    #adding Max pooling layer: g' {- v/ L. B5 i, ~
    model4.add(MaxPool2D(2,2))
    : V8 U6 ?# n! j2 F9 c- @' m! Q#adding dropout- J( A* x& p( _
    model4.add(Dropout(0.2))0 ~9 `: ]: B8 M4 @, h9 Z
    #adding another Convolution layer/ u+ Q" j5 c( W/ x/ F! Y
    model4.add(Conv2D(64,(3,3),activation='relu'))
    . M( F+ l. Z- u! l7 z7 H0 ?- ]; @model4.add(MaxPool2D(2,2))
      l% i5 ]0 A  Z5 }1 x& x#adding dropout
    ' @4 O" l' ]  }4 vmodel4.add(Dropout(0.2))
    2 b6 C8 H- d! B$ ^. qmodel4.add(Flatten())9 G+ ]1 j; J' m& h3 g. Y
    #adding dense layer% r9 o' A/ |( @3 U! S# {
    model4.add(Dense(216,activation='relu'))
    7 `6 ^, O# V8 V" r. V5 q( [#adding dropout
    0 E$ D9 L5 }: I7 H# Rmodel4.add(Dropout(0.2))
    $ O% O  O! b5 v( h. ]#adding output layer9 p, L8 O  Z/ P! S9 L
    model4.add(Dense(10,activation='softmax'))5 C. c4 X+ q  B) `$ n
    model4.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])" u  ]! v$ j0 o- D3 A( R1 y
    model4.fit(X_train,y_train,epochs=10)# T' Q7 H9 T2 s3 q' K  d/ V2 i1 B

    7 i0 q: l" N1 a$ _
    & J: n5 s  i: Z5 ?# Wmodel4.evaluate(X_test,y_test)  W; W( Y( e: r% V& S% [% \0 p. C: ]

    , w* ~9 G9 E# P9 ?, l$ j通过这个模型,我们得到了76%的训练准确率(低于第一个模型),但我们得到了72%的测试准确率,这意味着过拟合的问题在一定程度上得到了解决。
    , f* p" i  k  U5 W4 ^  a. M$ V$ P' D
    尾注
    3 {' t0 h. o- r这就是我们在 Python 中实现 CNN 的方式。这里使用的数据集是一个简单的数据集,可用于学习目的,但一定要尝试在更大和更复杂的数据集上实现 CNN。这也将有助于发现更多挑战和解决方案。
    9 G7 [% @& J: J
    - e0 j7 ^% k5 r5 Y, V6 J. q0 V' t' A* f% s& c

    5 d1 D% r, `" J) Q2 S/ V1 A0 b& P
    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-19 09:21 , Processed in 0.443620 second(s), 50 queries .

    回顶部