QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6505|回复: 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

    ; h& g" z" r! p% `' yPython深度学习之初窥神经网络) x; v( A: Z1 c9 C6 y# U, s
    本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。
    % i1 W8 F9 w2 W/ ]7 d* ~+ d
    / p# d" q4 N3 @7 g- W本文目录:  v; H2 G& S# U- v. L0 F0 X8 ^

    - u( A. |0 ]9 O3 T. T3 e6 T2 o文章目录1 m1 Y! q  f5 r0 ~/ ~- P7 D  c
    9 [( O+ J$ ~" W2 Z& j
    Deep Learning with Python
    ) {& C* f/ S" u" b初窥神经网络
    * p9 H  E( k) P$ {' J, o导入MNIST数据集2 M2 p8 L2 p1 v' x4 ?2 E3 M
    网络构建
    8 S8 Z- c/ C) P' q% a1 w6 [$ R: _编译4 r- p: x4 U8 s; T( P
    预处理1 P% r& R5 ?, q, {+ R
    图形处理
    ' k9 I9 u/ u5 ?0 R4 i1 y5 E  I" f: P标签处理
    - j/ l, a5 n( \) r7 D: L训练网络
    % C& a$ z$ S8 Q7 w% e9 U* z神经网络的数据表示
    * Y7 I5 d. O# o( q5 L1 H8 h% m认识张量' _5 \( s6 m6 X$ C& x+ ?
    标量 (0D Tensors)
    4 \. y+ y1 c$ ?, D% F( j向量 (1D Tensors)
    . l0 v6 a/ L8 y, Q矩阵 (2D Tensors)
    6 ~1 |/ Y( u& b& `/ A高阶张量9 s' E1 B3 f% _# E& u
    张量的三要素/ F: b3 y/ \" n% s+ D" K
    Numpy张量操作, e# [5 Y& w( X2 @  y* F
    张量切片:
    0 g2 A+ c0 @' a0 p  k数据批量
    4 t% ~5 N# |& a( k! Y/ M2 O常见数据张量表示* a1 {  x/ U; u# V
    神经网络的“齿轮”: 张量运算( u+ S; L+ r0 g( J- k/ V5 z( g$ V4 d
    逐元素操作(Element-wise)1 S9 s5 ]) h$ K. @# d+ Q
    广播(Broadcasting)8 T( `$ }  k7 S( b) a
    张量点积(dot); C: W( ^" h( x9 g; a/ Q$ u
    张量变形(reshaping)6 S( R: p% ~% [# h: }8 b; l* E
    神经网络的“引擎”: 基于梯度的优化
    ! d+ t. v: n! Z6 q9 m  i* V导数(derivative)% a- t+ w+ g7 w1 r, ?; a: n+ R
    梯度(gradient)
    # m$ v2 C; w' G" O5 z/ }0 c随机梯度下降(Stochastic gradient descent)
    / L& S6 q, d$ ?1 z反向传播算法:链式求导, h+ O0 m  s. a" t  h  ?! ^* L
    本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。2 T! A+ }/ _# C% x7 d2 K

    # S& w. g/ F; M/ f: k& S初窥神经网络
    5 e$ d, A5 _; M9 ]9 d! K' f- [" X+ z& @
    学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。9 O7 i/ ?( ~, H& o: k

    ( E* A  e7 N: `) m5 ^" ~" d, FMNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。
    9 _( @  C* P& J/ N9 i  y/ f" e0 C3 o4 K; ]. I3 S0 E' ^
    导入MNIST数据集
    ( C- F# v- \$ ^/ t5 ^9 S9 l7 r/ W$ P/ G% B
    # Loading the MNIST dataset in Keras* A; _3 C- _4 v! s
    from tensorflow.keras.datasets import mnist
    + M) U7 ~: k9 S' A9 a3 k(train_images, train_labels), (test_images, test_labels) = mnist.load_data()7 w& V# ~3 h( p1 Q: \& c" w
    1' }5 b. S8 Y! R. l, `4 z8 A
    2
    " B0 A. p6 f3 j: r3 w3* n% `0 C; l7 w/ \# Q4 }; `
    看一下训练集:
    8 n6 X! I- i9 y# P5 ^/ J/ E3 q' l- ]" V1 V3 {
    print(train_images.shape)6 V4 C6 O( r! U( r) L
    print(train_labels.shape)
    # ?$ `5 w6 d/ i% f3 H+ Atrain_labels
    1 J  u  j; T- G' j8 n) g) ~11 y) ?: R) B1 D: T
    2* u& H9 E3 g, _1 }$ i* F
    3- n6 R* |8 y! ^' }# H
    输出:* V5 u1 U% `: K0 t; \# F8 C0 h
    0 c3 d* k/ O. K2 }6 R
    (60000, 28, 28)
    ' P0 P3 k- r7 D$ O(60000,)& h% R  j/ i" G- q

    $ K1 K( R. v! d' carray([5, 0, 4, ..., 5, 6, 8], dtype=uint8)5 Q7 }( C; I2 X2 W: `# u" e
    1! g8 v5 r2 L7 p( B7 M
    2
    , n& q" S) Q+ @( O3
    ) k- [" X/ y; q/ R5 E4
    & k# a) Z; o1 ?( q! B这是测试集:% T. r; G4 W! x/ E' [9 _0 d* H

    6 \. l% X& c7 Q( }* ]print(test_images.shape)/ o+ J, R) S0 g  G1 a8 I$ M3 w
    print(test_labels.shape)
      O, q  z4 Q* X) l$ T9 z% G* \test_labels
    * W) U  W5 E& m; {15 |% i4 j/ Q) [+ b( k: _" Z
    2
    " Q! _* b& E8 k" G$ t: r) ]38 X8 W: k  |, p" c' j6 p% K$ a4 z" t
    输出:
    . Y  i& a) M' b% L- T$ }$ q4 k& O* N2 q5 z+ t3 `0 a- O
    (10000, 28, 28)$ u; P1 Y5 u) e
    (10000,)( e; H4 Y/ w- i0 V- T
    + l3 M* V  z- G7 M4 e5 P& V9 s" T2 e
    array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)" o. X" h$ L7 }  I' Y
    1
    ( r4 u* r1 m1 {6 i2" ?& N2 W- h- ~2 {' \4 L3 q: J) _
    34 j; Z) H. ^& z0 O) P% p
    4
      M/ z3 y5 {5 u! k: F# \, |网络构建
    1 M% _# ^$ {, d8 {6 Q! a7 `
    ! b6 H* A2 f7 w) C+ L我们来构建一个用来学习 MNIST 集的神经网络:
    ! Z' P' {6 q! S) Z6 h& d- u7 J( w
    # ]) U0 `/ t& Afrom tensorflow.keras import models; U- E- c+ w* K/ t9 d- ^7 R
    from tensorflow.keras import layers1 g9 M- K; h0 H4 H( p; A

    ( n, a! q5 x' [6 Cnetwork = models.Sequential()6 B' _. z! v& c7 @& Y/ P0 j/ [
    network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))
    1 @; @5 [1 M: f1 N* ~network.add(layers.Dense(10, activation='softmax'))
    * f  m' y8 b" E1 V2 M1
    ) i* N- i/ z) i2
    ' P$ M: z% P- y2 v# H( H3) w/ z5 a9 }* v( {1 W! p
    4
    ' V: E6 }& F3 w7 K5 k: w: U$ H5" V' \4 N5 G" c, Q. W% ~" z# h4 c
    6
    : n$ F$ g3 b  Q神经网络是一个个「层」组成的。
    % L' ]/ {) B! g, d) `一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。
    - P7 ]+ @  e& n; {) T9 Z
    - z5 W1 B2 F3 r. v6 F+ S这样一系列的「层」组合起来,像流水线一样对数据进行处理。# ]( Q. f5 J6 O; V6 Z% O3 K
    层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。
    ; s9 Y/ z, p' }' V" m; x
    , m) S: U0 V8 R& q0 F我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。
      w5 q$ q  Q& C2 v( p& Y* O
    2 J% N1 X7 a0 ]* i$ p0 G2 H数据到了最后一层(第二层),是一个 10路 的 softmax 层。/ H: e1 ]: y; j: y6 X. E6 Z/ u
    这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。2 z* n$ g9 k5 S7 k# g) f" d
    事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!
      r* N  }0 X% |4 [* V0 v" A5 C8 Y" D, a$ ]/ \  C
    编译) S  }! g6 U; b9 @( J! q! O

    ' v* ^% g( _. @8 f2 }接下来,我们要 编译 这个网络,这个步骤需要给3个参数:( X/ `+ r) y4 [$ R/ e, _* c
    # b- S; _# {0 e9 @) y2 F6 \
    损失函数:评价你这网络表现的好不好的函数; q6 w, b0 [' D; t" a9 K1 m
    优化器:怎么更新(优化)你这个网络/ R9 B3 U) z0 L8 }9 _
    训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度& \- s* ~9 y, G, U+ z
    network.compile(loss="categorical_crossentropy",* \0 K7 X8 g+ L
                    optimizer='rmsprop',, l$ r8 i  i% E& x
                    metrics=['accuracy'])/ d: s. t$ @3 _4 X! U" S& x
    11 [- f; j* ~- h) b. R$ n' {
    2
    , Y& }0 J" P, ?3* V, p7 m9 w+ i4 \5 H
    预处理# G# M) f" K# X: m1 |
    ) G2 ?4 f& l8 M& g
    图形处理
    % F0 E$ X; Q4 W) q2 D4 F' \. B! M. m$ a9 E* E1 C
    我们还需要处理一下图形数据,把它变成我们的网络认识的样子。
    $ ?3 O* i9 p+ K- B' n3 y0 Q; n  E- ]9 F0 w4 o
    MNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。
    , v4 ?% p: g4 d* \) B" L而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。
    : h0 t3 R* h% T0 Q
    / Z% H( p1 u" M, o/ M( Ktrain_images = train_images.reshape((60000, 28 * 28))! P/ a+ U% i' C- E0 \0 h
    train_images = train_images.astype('float32') / 255
    ; c! i4 c/ S" B* n' X3 U9 K& @7 t# u1 E$ P  D) m+ l) E
    test_images = test_images.reshape((10000, 28 * 28))9 {( }- K7 m8 k5 L$ L
    test_images = test_images.astype('float32') / 255; p) R/ q; ~8 M5 H3 @' R  Y
    1
    " ^4 R* Z% _' D0 l) J5 f& r1 O7 Q2
      T6 |) c8 \1 Y2 ^4 y2 H& p37 C- R- T* d! ~  E
    4
    1 n) J/ U% Z9 \) [, L9 \5
    % F# w1 t2 x) T3 ~( h+ \# \标签处理
    ( i5 D1 ]/ l) m1 e6 {$ L3 v$ |0 `' j) ?, r
    同样,标签也是需要处理一下的。. I: _' q+ U" e1 R+ Q. f

    # R; h. O& e, t% b. Mfrom tensorflow.keras.utils import to_categorical
    $ F% V! p+ [9 D6 @% v
    5 e  |* @$ m5 {" y1 X4 rtrain_labels = to_categorical(train_labels)
    / q/ u  D% B' Z5 ^7 l4 \5 ?test_labels = to_categorical(test_labels)* j$ I, g1 s1 ~+ i. j/ I
    1! [4 C& P4 H7 z' ?
    2/ n: U3 `5 ~( \$ T3 o4 \) ^0 x
    3# z- M/ S+ ]/ ?
    4
    8 I& K+ k0 e$ E2 W* c: k+ @训练网络
    ; _3 G% e; y$ j3 g( i0 ?( Y" e2 l; ]% o, ^8 g
    network.fit(train_images, train_labels, epochs=5, batch_size=128)& `7 V: E) C9 {
    1) C1 C  e$ W8 k+ |4 z+ R- x
    输出:
    , r- Q5 N5 {. y5 g5 s2 n/ y8 A  k' ~& {! n9 ?5 e) v; B. Y
    Train on 60000 samples" d/ F/ m3 F8 [7 o
    Epoch 1/59 q3 U4 ^$ u! `2 K) d" O8 m
    60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254( [) a4 `2 e  D0 I% u9 h5 [5 r% z
    Epoch 2/5
    2 C$ _( x, p2 u# l# {/ k60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693' [* i9 h; W( m5 t% V, f/ ~
    Epoch 3/52 [5 p: I# V) Z/ Z- `/ s( F
    60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800
    & y+ P+ B/ i+ U0 M# R5 ?Epoch 4/5
    4 q1 I$ q; x' C9 s& J7 l60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848- j+ ^( A8 C' Q! M
    Epoch 5/5
    ; Z" a1 a5 ?8 }. s3 G2 ~60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888
    ( @% e$ E! u) `+ |% F( S/ g, S5 T: }; R4 r: _6 o) k1 V# s
    <tensorflow.python.keras.callbacks.History at 0x13a7892d0>
    6 r+ U; y9 u" v17 T, W4 w/ X0 n
    20 ]7 r5 X+ J4 b, \2 l
    33 u9 @/ h( d( y# j! q9 v' }
    4
    , ~, P# f' x! e" `5( O/ C6 m/ k3 ?! m, w( R% h
    6
    0 `0 ]3 A; o. B' x) |( A7
    # i5 d) v  }# r; }8
    8 _. l2 B2 ?  ~- }9
    ( F6 N4 Y" B# N* f9 S105 u/ k4 \' r* y) ?
    11
    + S8 |" ^7 `2 L12
    ; o( J  `; c% b/ p13
    " `: ~4 B5 U6 @0 L% c可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。& s+ V! q2 ]5 u. r, o) I2 b
    6 Z; l4 Y8 w- I0 s7 e/ J0 s
    再用测试集去试试:; p8 X7 Q% Z5 r& z1 ]* V9 t$ N. f; N
    8 r! d/ N+ T) R: m  z
    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/32286
    ) n* A* M9 Q1 b7 I/ qprint('test_acc:', test_acc)2 Y3 M' {  e5 J
    1  O- @( U, W" x# I4 Z3 T
    2" H  O6 p: F9 a2 b
    输出:
    # w6 A3 \# M$ A* V
    3 }. Z8 M+ p3 a$ t" t10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789
    & n) {+ s: b1 q8 t0 |' Ftest_acc: 0.9789& ~& z5 h( D; k
    15 i2 q) B: ~/ U" ?6 D% D; ^
    2
    % h+ `" y6 J/ I5 O  G9 a& \我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。
    2 u$ M  G( X5 {1 L$ Y. N5 ^  Z$ r( j8 ?4 |4 [* l" Y( X
    神经网络的数据表示
    5 Q1 H: r; z; i6 S$ U; s  @6 [0 G  S  D6 b9 O3 ?
    Tensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。6 E# q+ @1 C. W

    & l6 `) L% r# X% B. Z: C; b/ e我们常把「张量的维度」说成「轴」。( @" B! @4 O" _1 z
    8 Z1 D$ |/ g( H: O5 B2 ]
    认识张量& x: ^4 u& k7 J8 S/ n
    ; U6 z+ v3 j% w; Y
    标量 (0D Tensors)
    " a, C5 G, e0 W# L, L9 y
    ( O4 n/ F/ n( l" }2 xScalars,标量是 0 维的张量(0个轴),包含一个数。
    * P$ R% E  Z1 d$ [# W6 Z8 ~
    9 W$ Y- d+ Z: A. I; W' \标量在 numpy 中可以用 float32 或 float64 表示。7 b. Z8 p" B8 J2 m# i8 ~

    - q7 K$ b2 |( U$ G$ U$ n4 j' ?7 _import numpy as np
    - y7 O1 T+ B, C' h& Q2 R
    ( u6 |1 Y1 B8 e/ Xx = np.array(12)
    $ K& P9 \# |; b+ Ix
      \' Q: ~% D3 K4 h' ?* X$ i) ]& i14 v: I7 ]9 J4 K3 `# m: l! M) q. [% s1 i
    2
    ! X3 Y9 ?* W. d" n9 p3$ [: K3 |$ t( H6 f0 ?2 R5 h
    4
    & B4 Y; b  _% B2 G3 m7 u. |* d输出:
    ' f2 |' I; R/ g, }- [
    6 O' P! r" r/ k( b/ T, varray(12)7 S) o' g* Z& c  _& p% H* G
    1
    $ [* x* i% q. H6 p1 t3 ix.ndim    # 轴数(维数)
    7 X  ^9 A/ U% s4 y' R19 g) U* T% a7 m) G9 w. I
    输出:
    ; e7 A: S1 r) g5 R% U1 e' L
    - g4 ~' p  G6 f8 P, {0 y( X1& K6 t: k6 A# N. \: i+ ~
    10 Q' w( ~) ]+ M8 i6 c9 `* O
    向量 (1D Tensors)
    - G' V% j/ e' |' O
    7 G2 q, ^) O4 \8 C: k0 r5 _Vectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。
    2 }7 t4 U6 B( v5 t: k% P
    5 M8 G; ^, j# x& U( Ux = np.array([1, 2, 3, 4, 5])
    4 o0 t" s$ V3 `! k! v# Gx
    1 t" `' x# S0 n- R2 C1
    . c+ u, ?# Y. w, B7 t$ L28 r7 Y5 K2 L8 I- s! c9 V0 i
    输出:
    7 I: F/ _: ?/ l( [) X4 i- H. I7 z2 j: V
    array([1, 2, 3, 4, 5])
    7 T0 j6 V( R) U$ O+ i- J11 i$ e9 h* V. p
    x.ndim
    ; A; g: ^$ J" J. x" n1, p& J+ P3 E; Q6 o8 ], A% ]
    输出:. u3 e# z2 G! N2 I

    5 d0 s  \$ f( C# ]1
    $ B' ~* ]7 L& g( x- Z( V17 @8 n! [; `4 r
    我们把这样有5个元素的向量叫做“5维向量”。. F/ {, n) V% F3 B1 M' x3 H1 \
    但注意5D向量可不是5D张量!
    9 F9 n& P: r9 D2 w7 q( x* K% H# c/ G# {1 w
    5D向量:只有1个轴,在这个轴上有5个维度。4 `& s- W8 W2 c& n
    5D张量:有5个轴,在每个轴上可以有任意维度。
    + z6 d* ?" {  Z这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。& w% D  Q4 D& w
    ' m, P8 U+ |  [
    所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。
    7 ~) k1 ?. n1 [! _9 B; v
    . \# B8 o' M. G6 z# K- v% [# j矩阵 (2D Tensors)8 _% I7 R2 `- I6 k6 c9 R+ F

    ! N4 ~4 P( ^3 {$ l, b/ _5 fMatrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。, _* H. V% u  y- H6 B% \% \9 r1 R& l

    - B* [( s4 z. ]) ?# Z6 sx = np.array([[5, 78, 2, 34, 0],7 m$ Y. J. Y+ M2 h$ z) S8 S
                  [6, 79, 3, 35, 1],
    5 S# N: y, B* z  r              [7, 80, 4, 36, 2]]); P4 W' S! k( _
    x1 t! @0 C% p# F
    1
    : \. m/ u, T) \3 t  r# j# x2
    # I8 J: L  Y* M! K0 U: V: @3
    , m" X7 ~/ Y: I9 [: r4
    8 @- z+ b7 q" `输出:( Z0 m6 ?: J9 @) k; [% `
    + v! v0 q, N7 X  N/ A. a! a
    array([[ 5, 78,  2, 34,  0],
    4 B/ n7 P  S# F; C0 [  u       [ 6, 79,  3, 35,  1],3 n4 j1 L7 K- q4 }
           [ 7, 80,  4, 36,  2]])
    & s1 H5 W5 V1 |0 ^& L$ L1
    " R% I0 e% u0 N2 T6 W5 i' t$ B2
    9 a9 w$ B; J7 O36 w( G0 L5 p1 L4 M( H( C
    x.ndim7 R/ h: z; p6 m" K: G- p% q$ A
    15 q2 t* L1 m% [8 i+ i/ J/ h
    输出:
    , i8 S4 C: m' l) j, i# P2 N4 c; z" f" l5 n0 n% p$ J& N: }
    2
    ' @8 r; W5 g: m; I16 c4 T- H$ `' W. q! P9 j
    高阶张量
      D0 p( U' E) n7 f' V2 \7 r
    " P8 |- I/ H* H8 ?; ~  i; f你搞个装矩阵的 array 就得到了3阶张量。
    ' ]: {- a  ~+ v4 x+ Z* ?. C4 q: Z  N' h4 j  C: y% ^& X
    再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。6 }  N. R) s6 ]' y+ U
    5 O( `. V2 h  f& b" F# d
    x = np.array([[[5, 78, 2, 34, 0],; U6 n) {/ L, A- Y& ?
                   [6, 79, 3, 35, 1],  D0 }9 M0 u+ f* W1 E
                   [7, 80, 4, 36, 2]],
    5 S6 L. {$ E" y) j( H6 i1 R* e& Q: a              [[5, 78, 2, 34, 0],  n$ r; e1 ^0 f  ^- v
                   [6, 79, 3, 35, 1],. h  ~" s6 ]6 ~$ z, E* Q; z
                   [7, 80, 4, 36, 2]],
    0 M3 q( \+ Q& f+ {$ c" q              [[5, 78, 2, 34, 0],
    5 G* P, `# W/ a; U0 G               [6, 79, 3, 35, 1],
    * v8 |7 Z, `- ?0 u+ ?. O( |' r               [7, 80, 4, 36, 2]]])
    % C2 H* k8 ~3 s( F' ^" j" J3 M* F  {x.ndim6 j8 ~' ?9 C6 }
    1
    - l9 ?: }1 D( z, L2 \- T2 `2
    - U/ q7 k$ R& D3 y+ K3/ k1 b: n9 m# l/ Z1 L5 {& c
    4
    1 P7 l7 S3 |& h5
    : o( G7 {# X; f, V$ _7 c  y% B) h0 t6
    ! u& ]' l9 M" u" u, M1 ^7' C+ l3 f5 x8 V
    8: T! _5 _* S. \1 }/ j7 Z
    9
    7 G# W, _! H' Y2 g10
    0 N) \5 \. \% Z输出:' {5 w8 Q0 {) ]8 ^8 b
    ' U% D' b* B! i3 ^
    3
    8 g( G7 r% q1 d+ x* B) x1: W* I. b+ K: U' E
    深度学习里,我们一般就用0~4阶的张量。0 B9 l0 K" g% Q$ I' p
    : k! `6 Y' U- D: T) r( d, f
    张量的三要素( A" g9 K3 i1 a  {" }4 h. w* ~
    8 L- K# `" A. q4 m& I
    阶数(轴的个数):3,5,…
    - v/ H! d0 R* Q- C$ ~' l+ V" x形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…7 S7 n. @) \" \9 m7 M9 }
    数据类型:float32,uint8,…* m( i1 Q) \6 m8 L
    我们来看看 MNIST 里的张量数据:
    . n$ e" c2 ?3 p
    6 x7 \+ V% D: |8 ^. _; f! B: Hfrom tensorflow.keras.datasets import mnist: C3 Z7 B' ^. x1 N
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data()+ R! g, [1 _0 u9 b; M. t2 Q) K+ P4 @
    , L- t& z3 r, q6 @
    print(train_images.ndim)
    $ @0 w+ i: o, b7 @% U3 M  k. \9 \print(train_images.shape)
    ( w$ s4 q1 u  kprint(train_images.dtype)
    7 T# O1 L( ]3 Q1
    1 ~, Y% _& R* G# U! e8 y( |25 x) P* B6 g/ g5 E$ u
    3
    2 U2 K4 G. i* |+ g2 \3 W4' e9 M& s6 O8 x/ G- _" o$ V
    5: J# q& M+ P( r1 L, d% H
    6
    / X# e8 c$ z% \( ]  l$ a0 E# G* V输出:
    1 W6 q; u9 w9 y! {' ~) F2 E
    , @5 o" Z3 G, V3: a, H# I$ C  s/ _6 O
    (60000, 28, 28)& p3 f# i' R( j
    uint8- v4 q. p$ o+ f' k
    16 C- w1 a7 {! ]4 x, A# K
    2
    6 @- y* }; D1 G3& J" v6 j, u& M' m- `$ m5 V
    所以 train_images 是个8位无符号整数的3阶张量。
    9 f: M+ {& E4 v' ^, E
    , L$ Z" T& e& {  M4 q. {1 f打印个里面的图片看看:
    " X9 R" Z' e6 y3 Q- t5 n# h7 i
    + l* a# @2 |; j4 @; ]- sdigit = train_images[0]
    8 N5 x( h( h# Q4 z$ U  d' j+ d0 n8 Y/ U
    import matplotlib.pyplot as plt
    & S* Q5 K; O9 g' j5 `" G& N& m  l: Q) o7 T/ g+ I
    print("image:")
    / |# }2 j- v5 b, L# mplt.imshow(digit, cmap=plt.cm.binary)* ]' u: z) t8 c- D: ?' s
    plt.show()
    ) t) |8 V4 D! Wprint("label: ", train_labels[0])
    $ y) O' q1 {4 g+ D3 u  Z4 e0 V" A" a$ r/ {1
    5 `. q, Y+ Y) I5 ?9 B3 r2
    ; B2 Q* ?' F& x3  a* }& m$ M5 |( d# m0 I
    4
    ! ?1 K* h" u& }8 E* {( p5
    9 B% }6 p+ ^  {" y" H, G6& |+ Q" J5 E; }1 N+ S! z: X
    7
    ( d( k+ @0 P4 C5 [- {/ T8
    / n  b+ O. B. G9 q3 _# I" N+ G输出:
    $ Q* U7 v1 H% Q9 U. [! X. M, X& ^% W2 M6 `6 p' U  }* n% g# ~
    1.jpg
    : n4 m$ q5 o. E
    ; c( K( e; y+ d5 f3 dlabel:  5; D/ e3 b- c  p0 r1 o
    14 ~! b; J: C1 U* s0 m: Q
    Numpy张量操作6 a, K, W4 O$ ?# N
    / t  Q! u  E/ a8 a0 S
    张量切片:
    ! S" f: k  y: |  f- r: G- G, c
    ! f* ]2 l+ ^) P) S, j0 ymy_slice = train_images[10:100]( P) t) X/ l8 ^
    print(my_slice.shape): X9 u! b: |4 T
    1* G7 Y! W9 i* w. Z( R
    2
    : s5 x$ t$ B) H2 c输出:7 Z  p& `5 j3 v( y
    2.jpg
    9 s" I( z' K2 O(90, 28, 28)$ w+ L) O8 N+ J( P/ W
    1, L- S; y( @5 r' U8 @! p
    等价于:3 d! n1 V7 \% X4 j3 M: `0 |. ~- r

    % }8 r  L) M% P7 R8 o& smy_slice = train_images[10:100, :, :]# c% O' y; ?9 D
    print(my_slice.shape)& Y5 D. Y( ]5 a( G" v/ v
    1
    4 l* k$ w" j8 l27 s% z  l7 E+ b1 M2 |( S
    输出:4 `9 M# D: t& m4 w+ `
    3.jpg
    - B( M7 D% m7 M) r(90, 28, 28)) [- N2 a# W6 W7 [# E
    1; [# T4 I  m+ _/ N# }* Z
    也等价于6 D0 p4 A6 q+ K3 O6 z) C# q
    ) N3 |$ `8 H' l7 m& f# \" W- ^
    my_slice = train_images[10:100, 0:28, 0:28], z. M" s2 N  P5 q; q& b
    print(my_slice.shape)5 t; f" l9 l! A6 @* F, L* I
    1
    8 t% o) H5 p4 x) C" r! I9 v, @2
    % G/ ]- N. C# \输出:
    . Q% T# {9 H& f: \) O; M( j& [! `7 M) x! a" p
    (90, 28, 28)
    + o* A) w8 A$ o( [7 Q; r15 c4 J1 ~% L. s1 I* g% g3 r
    选出 右下角 14x14 的:
    : X' @! B( }; R% d; d3 z- J& z; ]4 M' f: w; V$ }
    my_slice = train_images[:, 14:, 14:]# ?& E3 R$ ^/ U, F2 e1 `
    plt.imshow(my_slice[0], cmap=plt.cm.binary)
    % P! d! Z# f0 Q4 o. Eplt.show(): j9 O  p; b* r- {) u5 Z2 T2 E8 \
    1& B; Y8 g# X& A) f
    2
    6 Y6 k! O% p7 `! \' t6 i  O7 e9 s37 ^1 ]5 C  @6 Q% S
    输出:
    0 Q) H; O  _3 g: t
    " |2 h3 C: |- X; |& v8 |7 G0 n" V, S( S+ P+ m7 m, m6 b, S% L

    1 f6 \6 @/ Q$ B2 ]) @选出 中心处 14x14 的:/ W& ?2 u# {! z
    8 b; X3 z& F6 V/ d: Y" i
    my_slice = train_images[:, 7:-7, 7:-7]4 |8 v' o# R5 @- _
    plt.imshow(my_slice[0], cmap=plt.cm.binary)
    5 G" [  S1 ?4 r. gplt.show()/ z6 m/ X9 ?' v0 B. _  O
    1
    1 z9 _3 M* ^, w! K" A, Q2
      w/ c; I* ]3 f) v% d, f5 n3) ~4 Z) W9 C* x8 G) Z
    输出:5 t# c  d1 U$ r' W7 }! ]

    & s5 i+ M- w% y  }" v" D7 |, S/ F- N) |! c
    & Q, t" D" j. j1 p8 w& u
    数据批量
    3 W. S) s7 K( i& X
    ) g' _1 @- K" C7 [$ n深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。& l/ m" g4 [# q9 n

    8 ~1 }% h5 x! g& q! m深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。
    & b. i8 P# ~" V- s1 Q
    ) }$ l& `% P4 Q3 O0 B" J: R在 MNIST 中,我们的一个批量是 128 个数据:, I( y% s# s1 l; s. v. q
    & Y9 g9 D" @8 w  G
    # 第一批
    6 f4 R8 t) s: s- ^. q" v) Rbatch = train_images[:128]/ Q) ^8 t7 S% a; q% U
    # 第二批
    $ `- o) v1 r; N5 R" Ebatch = train_images[128:256]3 X) T1 q& w1 {4 L! O
    # 第n批
    " y/ E! p5 Y) X+ x7 `. vn = 12  n# _, M+ Q( H  Y
    batch = train_images[128 * n : 128 * (n+1)]
    $ `0 k" l4 `( D9 e10 _- c$ \) i" @. B
    2: ?& c5 R, E( P% m# a
    30 L7 p2 i( [( r, [' D7 ~- d
    4' G0 p; |- ]" n! Q. c# |* f) t
    52 ?! e6 p" u7 h" C1 G' ^
    64 u- b( Q8 P% ]- }
    7
    4 ]  G+ U5 {* q; Q% ]# ^$ T所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。
    : [+ v# q6 k, T" c
    $ @# R$ O8 j9 O1 c& j7 T: p常见数据张量表示
    & l6 a3 }& ?" T2 [  m/ \9 C' `1 @+ T' K
    数据% A. J1 r6 ^6 f
    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-4-19 09:09 , Processed in 0.484017 second(s), 58 queries .

    回顶部