QQ登录

只需要一步,快速开始

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

Python深度学习之初窥神经网络

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

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组: 2018美赛大象算法课程

    群组: 2018美赛护航培训课程

    群组: 2019年 数学中国站长建

    群组: 2019年数据分析师课程

    群组: 2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2020-5-12 11:55 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    ! g, T) v4 z( Y* _$ @( K( M, _
    Python深度学习之初窥神经网络
    9 K3 L2 }1 l: H# ?本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。. u8 \2 U8 e" j
    4 P4 Y. V( C% ~7 O2 \
    本文目录:
      Q; X" W+ G! a- z# ^% P4 G. n! b" d
    ! Z/ f$ j  u* ^4 e" S) M" f文章目录
    0 r6 ~7 r5 x# [( e: F  r6 T3 K6 H+ W+ n
    Deep Learning with Python6 K7 m) W$ w/ H( a) w  T' G
    初窥神经网络/ H# e! l  l( k6 z5 S" Z
    导入MNIST数据集
    # S5 K7 A  O7 B! b4 h4 E! {网络构建) }; b) Z3 A6 g( [7 R% ^
    编译
    8 J; Z; K1 O5 L' _' P  Q' U( l$ _( o预处理3 _4 R' ?5 k5 v! a0 b% o
    图形处理
    6 C5 ^4 U/ _3 l: h1 q" }标签处理
    " p  h$ G1 p% s4 O0 j- p训练网络
    ( M; m/ r* ]* H$ C6 u神经网络的数据表示
    - U& `. N/ P2 T: @1 D* {6 s! j认识张量
    3 g0 l. f! c- h) O4 S; d标量 (0D Tensors)
    * I. m, {% o/ F9 K8 t( r# {向量 (1D Tensors)& {( C9 I$ s% f6 I( w
    矩阵 (2D Tensors)
    . Y: F& p( l$ S高阶张量8 L: B" A  r6 {. y
    张量的三要素! H& r& A) J( X0 r' j7 R8 u7 V& L
    Numpy张量操作
    3 \0 N- p! M6 x1 ~张量切片:
    4 o5 b0 z# ~! f; e- V$ N  Y数据批量$ K% o7 k1 Q& a+ A- P: S; Y! C! G6 m
    常见数据张量表示8 A1 @. m/ N0 E
    神经网络的“齿轮”: 张量运算
    1 {9 c5 Z9 ^6 F$ R/ }: v逐元素操作(Element-wise). Z, r7 y7 C# ?: U" R! o9 i
    广播(Broadcasting)
    ! w' D1 w, j+ b张量点积(dot)2 y, g1 h3 s0 [# [! @" u3 R  X
    张量变形(reshaping)
    + @% ^8 {7 L" a* P# K神经网络的“引擎”: 基于梯度的优化
    $ {/ k8 U* M, h: L导数(derivative)8 ^/ z" N% B  G$ L4 k3 }' @7 O
    梯度(gradient)
    1 L" @+ r" C/ x8 J( w0 D随机梯度下降(Stochastic gradient descent)
    - m: |. }5 a# p, w" h5 x4 X反向传播算法:链式求导
    # m! f$ F( ~! U8 X本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。; h  B8 B% T" a% Q
    ) b9 X/ h( L" C
    初窥神经网络
    8 l) t; ^9 v: c* S* S6 x  h, N6 p* m) e* z8 v9 i1 ~
    学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。4 L8 l2 u& ^/ p4 l/ w2 |
    ( V; q/ F+ ?3 h, F+ T% ?/ M: ^# g
    MNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。
    9 z1 J' Z* s1 {4 S( h
    " y" Q( A3 U! o4 D: A3 n导入MNIST数据集
      J0 l# _, E6 s+ t' W+ A# {  X+ o# _
    # Loading the MNIST dataset in Keras0 [% ^& ?/ ^$ G8 \
    from tensorflow.keras.datasets import mnist
    0 @- I+ ~8 v0 U(train_images, train_labels), (test_images, test_labels) = mnist.load_data()& ]$ e+ h! h/ Q) V& s" [0 O
    1
    ) ]2 `9 y1 v. O" v# `5 J2# o; X4 ?& C( `5 e
    3
    - @- G7 T, [+ b" P, D看一下训练集:: \& Q* g! N0 u+ F% P- i( q: F

      M7 v7 k/ b4 _$ |- D' J% Tprint(train_images.shape)
    1 E4 ]  c# q9 e! k* C, |2 K6 ?print(train_labels.shape)
    ; I) w% W6 K$ B9 {( ?# p# otrain_labels
    " P- q; i+ w: C/ H/ q' O1
    7 l$ I$ M5 c$ G" t/ P2 j  ~2& r8 G* B) k- j1 M: ^7 o4 _! E% {
    34 {  j5 \% b  Q
    输出:
    , s0 W8 C) {4 c# p7 m
    ( B" p& N8 o- T, T(60000, 28, 28)) s/ P9 ]$ h3 c; M
    (60000,)  s' y4 f( a' g( t
    3 m8 o1 D- ?. R
    array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)( [) w/ \. k9 V  g! ?) U% w$ I
    1: L$ d( r8 ^; C& Z2 x9 ^6 L. r
    2
    0 m3 A- u6 O* C, W! f/ A3
    ) L9 V& M. C' d. f9 w/ _) j3 P4& {! {6 ?  E) M
    这是测试集:
    6 l) _* n/ y8 r& ?- P: T
    ! m5 O8 E7 b( z( D" @print(test_images.shape)9 n) @4 c. |/ b, N( i4 e2 r  k
    print(test_labels.shape)3 `% c0 z5 D: W* Y$ S& b
    test_labels
    2 |' i: d, m+ F$ Z& T$ X$ m15 s) {6 H# L6 }& f
    25 K% ]* U1 _! F7 c1 a$ q. `! ~
    3$ F: p( I; d& [
    输出:
    " l# `+ {; m6 v. l
    : K5 v( p4 D' Y0 c  Q(10000, 28, 28)- X6 A) b- ]- M" ]
    (10000,)+ w) X. Y' }. t3 L) k$ E0 ~9 ^
    ; y4 e2 k- [5 ^/ h7 }0 z( i
    array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)! `* n, V4 ^- ~" u. P7 |8 M; u& m
    15 H. W1 g, ^7 L" |% M
    2
    $ y/ t( m  C, M/ K( O5 @# ^% |3
    6 J9 O# [+ J2 S- P4/ ^9 P- R& g2 R% U
    网络构建0 }1 B' l6 R8 X; K5 \

    . d& [9 B) e* T9 t) G+ {我们来构建一个用来学习 MNIST 集的神经网络:
    5 ^& c+ w% n) d( a; |6 _; \+ T, F6 G. a2 V6 Y6 n
    from tensorflow.keras import models
      w' w2 E7 Q# b: Z- o* {, s, Jfrom tensorflow.keras import layers9 O' @* v$ _6 d9 h* z7 Q5 T2 Z" j
    7 i1 D- @# \2 V5 o
    network = models.Sequential()+ H2 b/ F) S8 w/ P
    network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))
    6 j4 y1 x. ~% U  {& s- d3 z$ \6 wnetwork.add(layers.Dense(10, activation='softmax'))
    ; c; O" Y' h4 D/ K5 [9 Z1
    % N" T  o( |' ~2 t' g3 z; {* H, t25 _# F4 ]5 }2 u2 m% M( U4 r
    3* W! d- T* X: u) @# r
    4
    # S# o& V+ _* j8 n5
      D- z. \0 H  w- i/ Y1 J6
    6 W5 U& x% Q7 N/ ~# m神经网络是一个个「层」组成的。% Y. q4 i' Y9 G5 b) q
    一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。
    ' _1 J  j. Q3 @! F) |6 C' m3 r
    5 z! @' f( t* k2 \0 ]- T这样一系列的「层」组合起来,像流水线一样对数据进行处理。
    ; u  k$ \" |; y. F% ?层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。- Y) r: ?& P! {- c4 H& [

    4 E" u$ ^( Z, N8 V% ~我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。3 e6 y7 C% w# O' I' Z

    6 R8 \: m- j; y0 j2 b数据到了最后一层(第二层),是一个 10路 的 softmax 层。
    " @# F2 O5 v3 s4 T& |这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。) g" W+ j0 v$ j0 L1 B
    事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!
    . D& `$ P; o5 Y
    3 b9 \# ^- Y" j7 r% u* E编译
    " k9 [6 j1 x, D7 \' w
    7 {9 H* u6 t/ V; H! }) A% \+ C& a接下来,我们要 编译 这个网络,这个步骤需要给3个参数:
    6 z+ b4 w- _* n5 X6 E  h' h5 T/ m1 v
    损失函数:评价你这网络表现的好不好的函数
    ; B5 P1 j8 a3 B% ]; K6 e) \9 f优化器:怎么更新(优化)你这个网络
    & p; a- K, u& M4 I训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度4 j! z9 V% |4 ]# W
    network.compile(loss="categorical_crossentropy",
    0 Y- l& d; f; j% U/ w7 ?                optimizer='rmsprop',
    9 M# t5 {! _0 n) ^, t                metrics=['accuracy'])1 }3 U/ d) J; L0 V7 `! l
    1
    ' |1 S' F1 W& H' g4 K: ]4 e2) p, E1 ?0 d* r+ W  Z; b
    3% O( I$ W9 S0 R. j3 Q+ ^
    预处理6 l+ F9 @% S1 _/ ^5 N% G
    # G- W; p9 m( ]! j
    图形处理2 T  S3 j7 C( W* j% T

    ( J1 F0 C* u1 b6 l我们还需要处理一下图形数据,把它变成我们的网络认识的样子。/ P) z0 T; G3 {9 M

    # q9 o5 u; Y3 C- d# |MNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。
    # T' L! n6 m0 N7 g而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。
    - K& c( o  u: R
    $ I& I4 k2 y8 A0 a+ x0 e! \train_images = train_images.reshape((60000, 28 * 28))3 h/ p2 H8 d( s& L, M' ^' M
    train_images = train_images.astype('float32') / 255
    + C; n& m  O8 P* R$ ^. Z! g
    % y8 G# y* O, wtest_images = test_images.reshape((10000, 28 * 28)): y* g; W( d9 z0 H
    test_images = test_images.astype('float32') / 255
    ( q7 G4 D- J2 F' I  X1: H/ d7 V3 n$ ~4 T! c5 U, O8 x
    2& @4 ~% L9 S- ]6 ?5 _. q/ V
    3
    . [: v$ N# Z" d0 x3 |! O2 F$ W* H) y4
    * R* Z( l7 Q! W5
    + L) J5 S3 Q& ]* q$ r标签处理8 o2 Y9 {8 T/ Q$ X6 D
    6 v' H) b- ^- m& ^: C; n3 Q$ }
    同样,标签也是需要处理一下的。3 d( \" E+ K0 [, o) R

    1 l- h- r) j7 Dfrom tensorflow.keras.utils import to_categorical
    ! t* q: W8 q/ L! O, |
    8 h- U# \, j# }$ e; j; ltrain_labels = to_categorical(train_labels)2 T3 L7 W, u0 j2 t0 C
    test_labels = to_categorical(test_labels)
    ' U  G* T0 C" X* |4 v% h$ N- l1' X* M) j! t. ?/ t' i! |
    26 \2 {: G- t3 N% ~6 O* V* Z3 g9 [
    3
    2 H- x6 S7 v- k: A) R5 F47 U$ b% {! o$ z/ w
    训练网络
    ! }+ e1 k2 i7 ^9 ~* s
      O, T8 X3 i: S1 C1 K8 V3 Vnetwork.fit(train_images, train_labels, epochs=5, batch_size=128)- Q8 f4 C  s8 ^$ U
    11 G% x8 o+ P% H4 r
    输出:4 H4 W* E( i0 O# r5 c: ]

    3 H0 w7 l- V9 M' Z; aTrain on 60000 samples
    6 y6 ]1 I; q* m. Y5 I% V# qEpoch 1/5" X) E6 q' H* E* W, W
    60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254
      `8 ~2 Q. {# |+ D* l& i3 v4 zEpoch 2/5: h  ~7 }. V+ `. i9 r
    60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693
    ' Z* t* \  S# d) w- w/ }Epoch 3/5
      N# O& x- g; z7 Z9 y( d$ @' ]60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800
    : X, Y( f4 x. v5 CEpoch 4/5
    . k5 v8 a1 Q3 O& q60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848. X8 G. z1 ?& O2 D3 |
    Epoch 5/5
    ; l. A: N! _2 ^0 b7 ~60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888, \) x+ |2 W& L7 G0 }

    . e: i2 `7 M: y<tensorflow.python.keras.callbacks.History at 0x13a7892d0>! z& n& m3 x* J2 u
    16 W! w. y% e8 |' s# k/ e: Z
    20 E7 r' V3 n0 s% s' f
    34 Y$ q6 h1 y# w8 {2 t/ N$ Q
    4- X  R2 H# d9 U' g/ T
    5
    ) t  C" W' J( Z5 R0 t! W- z5 J7 I6& J* K& \9 e- |3 S( @8 }' S* ?" j
    79 [( ?+ Y! L( H' i/ [
    8
    6 ^+ H& Y7 ^8 B! d. h9
    - u% k5 S  y2 [. Y6 b10  r+ z" ^9 J! v
    11
    $ O# T& ^) T+ T4 f) @1 B) l" i12
    * ]+ ]1 w' f& T% |13! |* o& t  I" y  F/ |6 n6 H
    可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。  _, M, w/ M; M2 y) \% h, @9 P# V
    # v% u5 `$ m, t5 ~8 W
    再用测试集去试试:2 B+ B' X$ g- T; v& I4 g1 U0 N
    ( ?+ }0 w$ N2 g% G2 i  o
    test_loss, test_acc = network.evaluate(test_images, test_labels, verbose=2)    # verbose=2 to avoid a looooong progress bar that fills the screen with '='. https://github.com/tensorflow/tensorflow/issues/322862 ]* Q& G$ z5 i2 m$ ]
    print('test_acc:', test_acc). @  K* P+ k/ \% Z
    1
    : j; t6 p6 l+ [- k# U2
    $ _" R$ [7 _. j% P/ T% D输出:8 C! G7 ^2 S* G0 t& C& k- Z: q
      I' H7 a& |$ F/ a. J
    10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789( m9 [. J4 j# I( i- T' r
    test_acc: 0.9789
    ( _9 u& Z% Q  l3 \1
    8 H* {1 I6 O1 Y1 B2* Q$ Z# E% e5 d2 v! i
    我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。
    ( u; E+ c: u& U* \/ M, M
    ) U. K  }, a$ ?9 O! E神经网络的数据表示
    ! ?0 z$ m" s& K  N( c; ]* t% V0 e. M1 I$ t
    Tensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。
    $ |3 F, D1 q7 Q9 t; K! Y
    + a0 l$ m8 l0 j' S7 f& |( l! z我们常把「张量的维度」说成「轴」。
    ! s7 s+ `( Y( i5 A# l* V% v9 l
    ) D9 O+ M( B# N& l6 I3 J认识张量
    8 ?& B2 H2 \, h, z& A0 Z, U8 k" R% Z. ]
    标量 (0D Tensors)
    7 B0 `, V( Q+ s# C
    4 s, R/ z  ^3 D0 F4 QScalars,标量是 0 维的张量(0个轴),包含一个数。$ S1 O4 h) j: L" a# c: R
    + k0 s; y- V4 M& N
    标量在 numpy 中可以用 float32 或 float64 表示。
    8 R2 q8 w% w! B/ l) A4 i9 R. \* S7 M8 }& W* {3 l4 ]
    import numpy as np
    : A5 P/ J/ E0 {
    * q  }; B) Z0 G4 ^: W3 x7 Mx = np.array(12)
    0 B2 r5 a0 `% y6 Yx- s; a% d2 f. }" t9 {4 \0 r1 {( P; G
    1
    + l! }5 _% t! q/ b20 I. l5 }. e! J; h
    3
    8 `% ?! R0 O+ n6 ~4* c1 H' _8 [! G5 f
    输出:
    : M. m3 X8 {+ h5 i( S" I% t' k0 e
    array(12)
    1 X/ D% ?& U" w. K3 P9 h1  E/ d6 |% t" }% X0 ~0 _# U
    x.ndim    # 轴数(维数)
    0 w$ Z* E- R3 A) \- o1# S" ?, ^+ X, V5 q
    输出:
    6 z1 f) g; m& E$ H# o
    . t! D# c# r$ N- l0 d1
    ' }3 T, f5 h$ w$ n: _1- N9 c( Z  m2 B! a6 |. B# a
    向量 (1D Tensors)' H: t# ~( l/ Y& H2 o2 ~) i

      I; I, N% D- t8 e, N; }Vectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。' A# u0 r8 k  i+ n4 H- j9 p. ^
    7 U: V1 r2 x$ x! E) x+ j; e! H
    x = np.array([1, 2, 3, 4, 5])
    6 Q# X* ~0 n: W1 Ix/ e. g( e, V4 H& z" s) H
    1
    7 n% B& Q! ~; ^" j2  |' B# s. B% A2 D9 ^- g. U
    输出:+ h/ t! H& H" y; ?& F2 u- e. f

    : v; G. b! d1 b2 A- D( x' C5 c* Q4 Rarray([1, 2, 3, 4, 5])
    * I3 R; X- E5 |) X9 ?! Y" P! N18 i- B8 r% S; y. q* B* x: |" T4 d
    x.ndim
    # P" L. i: t: Z0 o1
    . y1 F6 v. k5 ?  n输出:0 a" t' U0 ^0 H; g  b
    2 g' M/ e( _. K
    1
    5 j2 C/ r1 R1 O1
    2 B1 h) o3 n/ K, K我们把这样有5个元素的向量叫做“5维向量”。+ R$ {- @( g- z2 A8 t/ O
    但注意5D向量可不是5D张量!$ @5 r& b/ f/ L. _0 v& ?+ j
    ( ?; y- G- n" k3 s8 Y- _% |
    5D向量:只有1个轴,在这个轴上有5个维度。
    8 w- e- i6 ]0 f) T  \: a: g5D张量:有5个轴,在每个轴上可以有任意维度。
    * d7 O/ y$ a% y/ L这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。7 C+ ?% u+ `  X: N
    8 E4 i. u1 c% R2 Y
    所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。
    $ u/ O: f$ n$ P2 S, {' S
    9 p( u- o3 |) J6 R$ j8 R9 x2 B矩阵 (2D Tensors)$ h/ P3 n& {2 ?/ l( g; E

    $ u: y8 B% Z0 uMatrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。0 ]5 s- i' O' w  `+ v9 X

    / ^8 C3 F: l" ^x = np.array([[5, 78, 2, 34, 0],$ q: n6 o0 d: d% x  F: u
                  [6, 79, 3, 35, 1],
    + R& w  C# {3 S) y! Z8 J) c              [7, 80, 4, 36, 2]])0 J1 {/ Q3 q( K+ t
    x+ W- x! S+ Q' T- p
    1. s! \6 Y3 ?/ b4 O, R
    2
    5 [( ~0 N: ^# s1 G; w$ r3" ^' h3 R* d1 j5 X; B2 M0 l, k: x
    4  G. B$ y9 A: V( n- J: n
    输出:* s! M+ A! s* {: r& e$ ~' n
    7 k0 q  ?! g; r. {" e/ i, t
    array([[ 5, 78,  2, 34,  0],7 P: X. E( i  u  C% M' f
           [ 6, 79,  3, 35,  1],
      T" f; `5 ?2 F! p( a       [ 7, 80,  4, 36,  2]])& c2 q. K6 _' V9 r, j
    1
    % M1 R9 F! P8 ~8 p2% W, T) w& ~5 k; y8 `
    32 P. P9 {) `0 L) V
    x.ndim
    + O- I: O9 f5 R1/ k/ F+ j+ F3 P) N- C! F) Q& j
    输出:3 j5 F/ m# u0 W
    2 v! N4 w6 ~- z+ C
    2
    0 [6 q* k; e- \3 t% m# j+ {* n1
    9 W7 C7 |. i8 I4 a- b3 Y- h高阶张量* H/ ~. V$ ~) V$ v

    0 [2 O& j: S$ W* V8 B8 s  Y$ J* |你搞个装矩阵的 array 就得到了3阶张量。
      h3 l9 j6 r  Q, ~2 Z- s7 f" b
    ! l. R3 J* ~1 z1 W. Y7 g( L, p再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。/ I& a2 s% M0 i7 z- u
    ) s0 g6 i8 h/ S) Q
    x = np.array([[[5, 78, 2, 34, 0],: N- C  M4 `% Z3 ~" f. H! O  w
                   [6, 79, 3, 35, 1],
    $ `, K/ y& ^+ _! r               [7, 80, 4, 36, 2]],0 ?+ }) U5 u! e% q- M: J6 B# t- x
                  [[5, 78, 2, 34, 0],
    ( j, L# s' N1 l               [6, 79, 3, 35, 1],
    , j/ q6 p+ A& l4 l               [7, 80, 4, 36, 2]],5 y$ ^7 E: B+ F( r2 l; F( S
                  [[5, 78, 2, 34, 0],  f, U) X: \2 G  A
                   [6, 79, 3, 35, 1],
    " i6 r- s: {0 J5 N! ~& p               [7, 80, 4, 36, 2]]])
    9 K% i" S5 k3 o% H8 s; X$ Xx.ndim0 a' J0 S' z9 Z
    1
    ( X+ ^1 w6 D% C) q2- `7 B0 a: w- _" [; e
    3
    $ U3 _2 v% p" P3 J  u! y) x4# q" {$ R3 B( `8 Z* y
    5# Y7 c1 i( C5 E% Z3 t( A/ v; _$ _
    6
    ; F; ~) D7 O) q. a: W: n. V* Q( s74 g- w9 A. P- A: M) u+ e
    8& ^( m3 q4 Z3 ^6 \4 G
    99 n# o; @, s# R9 j; o: |( f( ~
    10
    . r" @- L9 ?/ @& o0 r$ i+ S输出:7 _# ^- ~! Q" b9 T6 d1 p/ U! B
    ) q* L; S$ E- N; D- Q( I
    3
    4 d/ u+ Q' N, F6 w14 S% t- ?/ b: k; y
    深度学习里,我们一般就用0~4阶的张量。# V1 T$ l  M( m8 ^1 H
    ' B" W" i+ W; A9 _
    张量的三要素& x; Y/ ]6 t+ W

      F9 o# {( t: _/ O, r* B6 }阶数(轴的个数):3,5,…
    / A) _1 N5 S4 K# ~# i形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…
    4 j3 N4 K3 c+ q9 V数据类型:float32,uint8,…
    / P7 r/ k$ |! g* N* y  ?/ C* o4 M我们来看看 MNIST 里的张量数据:5 a7 s3 c) w) ], ^6 Y. l( m0 W
    9 E) f- r/ T) \8 D2 d
    from tensorflow.keras.datasets import mnist
    0 }! G1 g: Y8 U4 N% P& x5 Y(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
    6 o' F% W: F& {% j, p* `, E6 j- V
    . F' H3 B) {& y# B. H2 _: l" r2 i/ bprint(train_images.ndim)
    3 F3 r# R# \  ]  j" C; vprint(train_images.shape)
    : ~5 B* V/ z4 }" \" C( @0 Sprint(train_images.dtype)3 [# P' r9 S1 I$ ~% w3 f2 A( `
    1* Z) ^# X9 R' Y6 w
    2& E0 E9 z& Q# p; ~( V0 z
    3
    & `1 ?/ T. J/ X1 f) y4
    : Y/ }1 h, A1 R- L- i, v2 z5% i% O( y* {: O8 x; r
    60 I, o7 M% N7 O" v/ W0 P
    输出:5 D4 W' C) `5 A

    5 r: E. a6 r' c3 x2 i3, d% R9 T  m8 j( p) T" y/ S
    (60000, 28, 28)
    ( J$ N5 n! q  K8 Zuint8
    ) r& U4 f0 ?! W/ N- [% Y1
    8 L! P( O, X; X9 F/ p/ ]2
    % j0 c2 N! l; ]+ [( V36 J  j- `4 ?# U( s1 @. l/ M
    所以 train_images 是个8位无符号整数的3阶张量。
    " q! P1 V% V" [6 _& p9 B
    6 A6 w& n/ L8 y6 t" R打印个里面的图片看看:
    2 u  i& U; l7 p) R- P- j
    7 b$ a. M, l7 o( V- s) Idigit = train_images[0]
    $ X+ H* h/ n+ Q5 r0 o, p8 c. Z0 |0 @! h" e, r2 a6 q+ f
    import matplotlib.pyplot as plt) Z" n/ R" r- i9 E- ^

    & b; V" [% ^) j6 Fprint("image:")
    ' L6 P7 W' e/ t' Zplt.imshow(digit, cmap=plt.cm.binary)
    ' |, c3 z# N0 X" nplt.show()
    ' ^; o& V" }$ M! e1 w# Wprint("label: ", train_labels[0])
    8 R, M0 c6 F% L0 r3 K8 H( ~0 u11 v4 {+ y! O+ T5 x
    22 x6 C) z; U# _" m5 ^* b. S
    30 e  x; ~3 J( ~; v# n
    4
    $ F/ A! J! ~/ W2 F' T& K# R( ^5/ l. X4 N- ?1 j, K( a
    67 O" e8 ^: x- B9 n+ h7 C- a
    76 f! B0 x- _3 d
    84 p& i, H* ]( l: c
    输出:( k; g, F* _+ h2 U/ {% Q
    ; A: L$ g. I# J' s: \
    1.jpg $ T6 w- X7 {5 U7 t( j: \

    1 }# g7 v- ]# k' k; W8 llabel:  5
    / l! `& I1 N, I) z8 s1
    ' M; _$ P3 J" D" _: \Numpy张量操作
    : w9 W- R+ \. w. u- w& t7 Q
    3 R- X2 J1 Z2 W# N$ _$ h/ u张量切片:
    ; o$ O9 o+ ?  G/ [0 _( o  c" `% q' }( f
    my_slice = train_images[10:100]* t7 r8 j& G/ H
    print(my_slice.shape)
    8 `+ q/ H% K$ Y6 E. {1
      `% N8 y- w% T25 I& g: i& {" j# A$ }
    输出:, q( Y" B# U6 c7 q" H8 |! d6 U
    2.jpg
    - @$ i5 d7 q4 G(90, 28, 28)& O0 ~; ?& y/ f4 z
    1" s7 A% C" v8 g. P1 F! G; e1 g  ^' b
    等价于:
    , S! K  Z2 o5 ^, I% W: `7 `) J
    : M7 _+ v) H, V+ k: mmy_slice = train_images[10:100, :, :]
    2 j  T6 `) i2 R- uprint(my_slice.shape)
    9 T! I" e3 ~2 D1. X1 U! l' P% a8 F, k$ y
    2
    3 R1 ?2 f1 w' M输出:: @( W0 E4 {" }0 _, R2 o
    3.jpg 0 B8 u. _: L' l/ E
    (90, 28, 28)  n  d4 v8 r, u6 |
    15 r: _) i0 q/ P7 Q
    也等价于
      @  s5 T# Y1 g' [/ k
    5 }/ Y2 J) {/ b+ |7 W" r# emy_slice = train_images[10:100, 0:28, 0:28]
    * e1 g" `8 [* k3 gprint(my_slice.shape)
    8 |% p9 y# {# P7 A" d, n, z1+ H4 k5 P, I1 v# i- Z3 J9 d$ a' D
    2
    / b  V8 H& o; G% G  m+ s% E输出:
    / ]# ~( O/ ]! }- T: O' g8 U2 }4 f/ f. P1 s$ x0 {. S
    (90, 28, 28)* ^, G% K9 j# |3 p4 T2 x' b
    1! I, p# h: A. X3 v) i- _
    选出 右下角 14x14 的:
    * s! t0 j# k; q9 d- g$ T* m) Q& ~; G4 }
    my_slice = train_images[:, 14:, 14:]
    2 v# R. o& S" w6 @: k. Z- I: iplt.imshow(my_slice[0], cmap=plt.cm.binary)
    : I- z! U, z4 J/ Rplt.show()
    " L6 [# @% p: h12 ]2 i. k0 Z9 K& E! \/ Q5 P, q! i
    2
    9 i# g1 _! W! o/ u% n- \3 m9 L) F3
    $ u+ g, m3 _# v4 ^- e输出:9 O! U9 `' |2 X9 m9 H
    4 h, v% @- v! s9 ~

    3 l5 i3 h# f2 O3 O, W6 F
    , a: v7 _2 K* E  X$ a选出 中心处 14x14 的:( }! g2 E! _* K* L- j; k% t
    4 u; y  h) v# o2 h! O* N
    my_slice = train_images[:, 7:-7, 7:-7]( Q8 u2 l1 I" c  {
    plt.imshow(my_slice[0], cmap=plt.cm.binary)
    8 v: h  _! g' }7 o; cplt.show()
    , c3 @- B/ ^1 ^2 w$ [. X; q3 m1
    5 A  x! n: |5 m& Z/ A2+ l. D$ f& h- D4 Y1 \
    30 U& m. F3 y" z8 X( E' l
    输出:
    - j; I# K+ F  I; z( z/ \. Q! M2 f1 n9 X" D4 c1 y, s  v

    9 K7 x# f6 d4 M; B
    5 w# J) w6 Y: @) \6 P2 g数据批量
    4 D, }) e3 J% O
    - i; D+ J/ G1 H( w3 B0 F深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。
    ( Z% R" y. e3 o
    $ Y( w( k% Z# S* t4 O0 C深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。
    + d2 ]. a: ^* T( M% u0 B, G7 G5 L" Y) |
    在 MNIST 中,我们的一个批量是 128 个数据:! J$ X. c: M8 ?' G
    . @# M& f# r4 S) ~4 m6 L
    # 第一批
    " O7 G+ _, n3 G. O( D7 o* V/ c  tbatch = train_images[:128]3 L  t$ C: o9 P) ~
    # 第二批* m6 k9 @% _3 }% W4 u: `3 Z/ S  D
    batch = train_images[128:256]
    + ]7 i6 n2 B- d2 X4 v( f, D# 第n批
    * V: M5 D% r+ H1 a, @- An = 12/ }% v1 y: s7 I: p9 ?- m6 Z+ t. M
    batch = train_images[128 * n : 128 * (n+1)]
    ! l4 K3 M$ g  ~% W; C% g1
    4 E" F& u' O( D. C7 i2+ Q8 K: @/ `$ n% w5 C. B+ X
    3
    ( z1 o, g6 l$ W6 c6 k. T- _4% y" r) W+ h5 Q* z; G* H: B1 p3 _
    57 A0 z- @: s0 v& d1 i) h
    6! ~" g# W. R- x1 j9 s
    7# Q5 C1 w: Y* {$ u% I* D
    所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。
    6 j: |' K# q* c+ Z
    2 }, V& R* C1 v4 r: n常见数据张量表示+ i; H0 W8 b) K8 t( c# H$ [* l
    & Z+ t$ N& y% P) x
    数据
    " G/ x  ?! a$ r6 v9 Y9 k1 \/ B
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信

    69

    主题

    3

    听众

    661

    积分

    升级  15.25%

  • TA的每日心情
    开心
    2020-9-13 05:34
  • 签到天数: 149 天

    [LV.7]常住居民III

    网络挑战赛参赛者

    群组: 2013认证赛C题讨论群组

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-10-18 03:08 , Processed in 1.642107 second(s), 58 queries .

    回顶部