QQ登录

只需要一步,快速开始

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

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

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

1158

主题

15

听众

1万

积分

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

    [LV.7]常住居民III

    自我介绍
    数学中国浅夏
    跳转到指定楼层
    1#
    发表于 2021-10-29 17:31 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
                                                       使用卷积神经网络开发图像分类模型
    1 r; v- X% h- ]( L$ I1 w简介
    6 ]1 ~7 i1 i: P) s; R) |1 z: i0 _1 G3 O; A1 b
    这篇文章是关于卷积网络、它的工作和组件: 在本文中,我们将使用卷积神经网络执行图像分类,并详细了解所有步骤。因此,如果你对此不熟悉,请继续阅读。
    ) ~0 U9 q$ c6 t# w) ]' J8 }" _: A
    简而言之,CNN 是一种深度学习算法,也是适用于图像和视频的神经网络类型之一。我们可以从 CNN 中实现各种功能,其中一些是图像分类、图像识别、目标检测、人脸识别等等。  K7 n) Z  ^: V, F, s

    9 l  M: \* ]: X7 M6 S* a' u$ m4 p今天,我们将对CIFAR10 数据集执行图像分类,它是 Tensorflow 库的一部分。它由各种物体的图像组成,如船舶、青蛙、飞机、狗、汽车。该数据集共有 60,000 张彩色图像和 10 个标签。现在让我们进入编码部分。# B! O% ]6 h% L5 W4 L
    ) D7 ^4 \- O3 J; u
    实施8 z, r$ ^7 |0 F! _1 X

    4 t, |% O5 z8 F  n4 k6 m& S# importing necessary libraries( @$ q$ G3 h) U) z+ p* `5 H) M7 N+ i# u
    import numpy as np
    8 g* Q: O) }0 I/ Z9 Kimport matplotlib.pyplot as plt" ]5 K4 b) w3 ?  F9 ]: j  f% _
    %matplotlib inline+ N. _$ g# O+ E3 |8 j
    # To convert to categorical data  L) M/ l2 F4 B; |  u
    from tensorflow.keras.utils import to_categorical
    6 Y5 ~  _! t# A) R1 r6 Y0 L#libraries for building model
    5 s' m, Z, u5 U. ~! ?3 {. Rfrom tensorflow.keras.models import Sequential' d- U: a; y3 o5 t8 a
    from tensorflow.keras.layers import Dense, Conv2D, MaxPool2D, Dropout,Flatten7 O0 b) [2 j8 L& A5 ?& w
    from tensorflow.keras.datasets import cifar104 d* s0 I2 j; C) Y
    ; w2 U6 }  t1 [: h6 a
    #loading the data
    - }$ O8 m0 J8 f5 m& z  _: X) w(X_train, y_train), (X_test, y_test) = cifar10.load_data(): L$ W% b: O! g& U8 k  L, h

    : B! m3 d8 s) C* k- q, M探索性数据分析$ R7 {9 c0 U2 W) {4 s' J
    #shape of the dataset
    , Q3 u5 W& s# r4 I) _print(X_train.shape)
    4 H  S# K# S: F& }; ]4 Uprint(y_train.shape)
    7 w5 S. W1 N0 ~" f) E- `& v$ _print(X_test.shape)
    ) j2 i+ T. A4 u4 S- xprint(y_test.shape)
    ) r4 \$ f9 C3 [4 G
    1 R, b( ~4 {5 y' l" H% }' w" V' q+ \5 N* l, f; m1 |
    我们的训练数据有 50,000 张图像,测试数据有 10,000 张图像,大小为 32*32 和 3 个通道,即 RGB(红、绿、蓝)
    9 @' c+ T" n) n. L# m#checking the labels 5 P- M6 ~9 @+ O
    np.unique(y_train)
    0 e2 z- N  Y- Z. ~: Z- e$ V7 d5 B3 _
    # A- X+ n8 Z( E
    #first image of training data
    . O; O, r+ |% ~: l  W# a* nplt.subplot(121)
    7 h+ M1 T" x' W$ b9 A6 A  gplt.imshow(X_train[0])5 S" D  f8 c3 _2 j4 x2 J
    plt.title("Label : {}".format(y_train[0]))# i0 D% e1 d* ?: {- Q* d% q. z4 i
    #first image of test data
    & {. T$ K; e" yplt.subplot(122)
    0 n4 z- h- }# m. Z  d/ U9 v  oplt.imshow(X_test[0])
    $ y! t/ K! {# z0 M" ^- Q, gplt.title("Label : {}".format(y_test[0]));. n9 ~4 R5 Q; Y. y

    4 J% D8 I6 C+ r% ~
    7 ^5 U9 f) j. M" O#visualizing the first 20 images in the dataset
    3 ]; `9 m/ Y* n. N3 M4 q$ l# Ufor i in range(20):2 C' b4 k3 U/ j$ d3 P1 |
        #subplot
    - p$ P* J$ S: b# l2 ~    plt.subplot(5, 5, i+1)9 Z7 E, k6 ?% \* [1 X
        # plotting pixel data
    # S. w: u+ Z9 [+ T3 b    plt.imshow(X_train, cmap=plt.get_cmap('gray'))" F: L7 K! I- X; q! C2 k
    # show the figure
    ( y+ N( b& C. l2 vplt.show()
    0 K7 l9 H+ C$ |  p: n
    6 I; |* H$ v. ?1 Y. q7 U: z& v; T0 y/ Y0 V& a
    预处理数据

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

    2 v8 X( w) }! K) o
    # Scale the data to lie between 0 to 18 i1 x) B9 a" }% V1 l( e
    X_train = X_train/255
    ) n; K0 v  ]6 O* a2 d2 b& y! XX_test = X_test/2550 @  ^- a6 T5 C% `% [( R+ ^+ K
    print(X_train)6 _% r5 K* a7 @" P' i% _
    8 _3 `  o" r& l; u

    ( ~$ `2 E+ W' f; `- w# [#reshaping the train and test lables to 1D* \1 U! A) X( B) w# p, v  W
    y_train = y_train.reshape(-1,)
    " w% p& B% W6 S4 my_test = y_test.reshape(-1,)
    . n3 s1 x$ q2 `& o1 d' Y
    2 g3 y5 T8 C- H我们在上图中可以看到,图像的像素值已经进行了缩放,其数值在 0 到 1 之间,并且标签也进行了重塑。数据已准备好建模,现在让我们构建 CNN 模型。
    1 O  F! B$ H# ]模型搭建

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


    " _, f, H8 c- ]4 L+ p4 U/ e% G% u7 Gmodel=Sequential(), m) c' V+ Y) F2 O7 a
    #adding the first Convolution layer
    9 A) L5 L& g9 Y$ \+ l% Smodel.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))
      u1 H  Q# t! \$ s* ?#adding Max pooling layer! X8 y" w9 d3 d- s' O$ f
    model.add(MaxPool2D(2,2)). m1 L* u6 Z6 t7 x0 D  Y
    #adding another Convolution layer: O( Y! ]4 H; F& r% e7 D7 m
    model.add(Conv2D(64,(3,3),activation='relu'))
    2 P9 P! `( ?0 J  a3 K$ q& Zmodel.add(MaxPool2D(2,2))
    " n# H+ s0 f- }: ]model.add(Flatten())
    ! J" E& J; }+ j4 @  Y5 D* L( k#adding dense layer
    6 B3 e$ a5 U" h9 P7 ]model.add(Dense(216,activation='relu'))
    * O8 ]6 `. s  |/ x3 W- \# ?& N#adding output layer
    # `& e7 \3 E3 g. bmodel.add(Dense(10,activation='softmax'))3 @$ p# L1 [) D1 N+ J# U
    4 x  T; V, h" Y% D7 W, q- s; ?
    我们添加了第一个带有 32 个大小为 (3*3) 的过滤器的卷积层,使用的激活函数是 Relu,并为模型提供输入形状。
    ' ^, l' B3 w: R" ~2 s
    . S; `' ?  z/ W' m( l接下来添加了大小为 (2*2)的Max Pooling 层。最大池化有助于减少维度。CNN 组件的解释请参考:https://www.analyticsvidhya.com/blog/2021/08/beginners-guide-to-convolutional-neural-network-with-implementation-in-python/
    ' |7 |5 d. ?: e" M& p* g$ }" \* C- w
    2 R( A- a9 o8 X1 s/ E1 o然后我们又添加了一个卷积层, 其中包含 64 个大小为(3*3) 的过滤器 和一个大小为 (2*2)的 最大池化层- l3 t  x8 H5 r6 p; x

    " Y9 p' N  R4 r& a( R在下一步中,我们将层展平以将它们传递到 Dense 层,并添加了一个包含 216 个神经元的Dense 层。: ], V5 L: I* @$ x; W- w
    $ ^& N7 B$ [, O. r( a
    最后,输出层添加了一个 softmax 激活函数,因为我们有 10 个标签。# U! k, J0 }# s5 L
    + Y2 R2 z( Z2 v2 T" P: v$ j
    第 2 步:编译模型
    3 W; s; K' w, x( |7 h1 ^  Hmodel.compile(optimizer='rmsprop',loss='sparse_categorical_crossentropy',metrics=['accuracy'])0 Y, E/ l4 |" S5 w+ s

    + Z8 w+ b' \; ^" C  ^第 3 步:拟合模型model.fit(X_train,y_train,epochs=10)( A6 D5 X9 W6 i

    ) c' W- A) _$ i: v/ L
    " H( Y' ?0 M3 l# F, X" J2 l如上图所示,我们的准确率为 89%,损失为 0.31。让我们看看测试数据的准确性。
      ^/ ]$ j6 o4 J. C* |' d' G第 4 步:评估模型model.evaluate(X_test,y_test)5 r7 ~9 L$ x6 M8 a! L+ o

    + R/ O+ L2 n2 j. _- T) v
    + h4 n* m  m/ B/ F2 U8 t测试数据的准确率为 69%,与训练数据相比非常低,这意味着我们的模型过度拟合。9 Q6 ?* n1 s- r4 L  u7 s
    第 5 步:进行预测
    0 l5 k5 X+ Q7 f" Opred=model.predict(X_test)
    ' S* N6 X  e- l' E+ e4 f3 _) X#printing the first element from predicted data3 c4 f" a& `+ C+ z$ }2 A4 }& }
    print(pred[0]): {, |8 `, q6 j0 `
    #printing the index of
    9 G$ {9 l1 m7 X( A( R+ ^  mprint('Index:',np.argmax(pred[0]))
    $ N8 j% Z- n3 `3 y4 J
    & J5 t6 p* A9 ?" E/ q, O" H( s1 [% H% K
    1 o) ]# P: c" z

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

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

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

    y_classes = [np.argmax(element) for element in pred]. T% h- J, t/ s0 C: ^& ?1 I9 P; J
    print('Predicted_values:',y_classes[:10])1 l7 _4 ?/ R% f$ a
    print('Actual_values:',y_test[:10])
    0 V$ j4 ~6 o( X- d6 N# h; K) @- }: k8 @. W0 B/ B

    9 r# ?# X# a2 h/ E# e% z; C: ~/ F

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

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


    0 g9 E' v8 k. ~" O: x, c# ^model4=Sequential(), n0 D" f0 u# v8 q# e
    #adding the first Convolution layer
    9 C' e3 h! r) Y/ K- u% \model4.add(Conv2D(32,(3,3),activation='relu',input_shape=(32,32,3)))
    - R5 l4 M* w& F5 g#adding Max pooling layer: H% @7 k0 L3 |
    model4.add(MaxPool2D(2,2))
    ! B# W( x8 Q$ e9 g8 L2 |#adding dropout
    8 ^& _6 x) ^* l( v  L$ Nmodel4.add(Dropout(0.2))$ F$ |% y1 I. X+ a+ D4 d0 S; M2 h
    #adding another Convolution layer
    5 U0 r3 H1 H/ i. \model4.add(Conv2D(64,(3,3),activation='relu'))* k. T# @; `& ~& N" |9 b
    model4.add(MaxPool2D(2,2))
    8 N6 l7 c9 \* A' X3 }9 H% e& o) @6 @#adding dropout
    3 \' ^5 E9 N( z$ S0 jmodel4.add(Dropout(0.2))6 J9 M( M/ W; N! S" k( S! A4 S
    model4.add(Flatten())
    - v$ |$ o4 U& r  p# e  i#adding dense layer+ g" a5 T) p/ P. c0 m" @
    model4.add(Dense(216,activation='relu'))
    1 h( ]- P4 H& ~#adding dropout
    " G  v# W$ j/ B' G1 r1 b: m) i* kmodel4.add(Dropout(0.2))
    , j* S" \0 Z1 S6 W& R#adding output layer
    : O1 o! w' [! }, n2 `) D" ?" j0 A5 T- ]model4.add(Dense(10,activation='softmax'))$ A" g6 H9 J- x2 I6 J" X; d
    model4.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])3 y' h/ ]& L' U( J6 T
    model4.fit(X_train,y_train,epochs=10)
    $ A' B' ^5 k% h0 W: }8 @; F/ V& T9 G% C$ K3 }7 I
    ) c- S& N' ^$ c" }
    model4.evaluate(X_test,y_test)6 t" X5 ^( B. w

    3 |/ u# f4 U, |9 M' M4 s7 F& o通过这个模型,我们得到了76%的训练准确率(低于第一个模型),但我们得到了72%的测试准确率,这意味着过拟合的问题在一定程度上得到了解决。: C4 f5 O, ^6 h- `

    : @: C" I2 O( a) p" L) x尾注
    3 J2 ?) g$ ^$ F1 p6 ^& V% l6 ]这就是我们在 Python 中实现 CNN 的方式。这里使用的数据集是一个简单的数据集,可用于学习目的,但一定要尝试在更大和更复杂的数据集上实现 CNN。这也将有助于发现更多挑战和解决方案。+ H  ~9 b" M; x" ?: Y
    " u8 ~/ V  v" i; g
    5 _9 H6 C& m6 g2 @/ c3 t% G

    % j, o+ r% O4 c) \* T) _* |6 ]
    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, 2024-4-26 20:17 , Processed in 0.328016 second(s), 50 queries .

    回顶部