QQ登录

只需要一步,快速开始

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

    & M! j3 b! H8 y+ f! u- z) M( h; i: XPython深度学习之初窥神经网络+ f5 O" Y0 i0 |. P7 ]: Q+ H9 r
    本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。% P, L  i) k& o0 G# w

    3 U7 O) D% C1 G7 k8 q/ D本文目录:" I. D9 x7 j1 Y, M4 U! C

    . S- S5 r4 ^- Y) k4 }3 x' Z文章目录
    2 E, E9 p7 o, E0 O5 a) ^1 v/ L3 Y$ Z* R0 e6 Y+ i/ l+ a
    Deep Learning with Python3 ]' K. f% l- L% x$ t' r
    初窥神经网络
    + G7 Y! V& l  N& `5 b2 r. z导入MNIST数据集
    9 k3 d' l: h0 \4 ?( V# ~网络构建
    7 O  ^( M" l! T, I3 H编译
    ; p! X/ d( V( z6 E; h预处理% E. H0 h9 v( G! ^& b7 N' D
    图形处理. `; ?9 k9 e. J1 A; z1 C# P  j
    标签处理
    $ P) ]0 L* r6 Q# L) U训练网络
    # l8 Q* G9 i. J; `( F神经网络的数据表示( y( s4 O& E: c8 N' B
    认识张量
    4 o8 P1 _( ~3 @8 P标量 (0D Tensors)
    3 f5 u5 J4 r0 ^# Z& I; P0 d向量 (1D Tensors)
      a% {, c6 T; V5 j1 }矩阵 (2D Tensors)
    # [! h8 K8 I0 R8 r# H# r高阶张量
    + G4 }0 I* l3 e+ g1 [张量的三要素
    2 q2 d; c4 @  @2 ]Numpy张量操作
    7 U, t0 u7 _. W/ a. y张量切片:
    / @1 d3 Z& p0 W1 U9 i2 g数据批量' L& p4 y4 V% M0 ^+ ]
    常见数据张量表示
    0 M2 Q$ e! Z; z! n神经网络的“齿轮”: 张量运算% n1 P2 w. M' W2 Y
    逐元素操作(Element-wise)
    ) M* q5 P. \0 ?" U  }. E# b广播(Broadcasting)
    & Q, A" [+ D8 [0 D  m" O张量点积(dot)$ X: |$ v6 I% E: H( u2 c% H( B
    张量变形(reshaping)6 Q* ~/ ]0 N( }3 V/ s1 G9 N
    神经网络的“引擎”: 基于梯度的优化
    7 R: D( E, A5 m, e6 q  p) q9 e导数(derivative)
    0 M. a+ e6 `; G: v1 m, Y& _. \梯度(gradient)1 s5 `2 a+ |5 u9 B/ }8 Z! q4 S
    随机梯度下降(Stochastic gradient descent)
    3 `8 a+ g! ?4 u# U+ s% f  d) V1 C反向传播算法:链式求导! w- X# U# k  r* d# u% |& Y! u
    本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。
    " P% [3 I7 U% o( J5 t. x
    & x+ k. L4 c$ f8 i" W6 k初窥神经网络
    % [$ v( l* n% h: G& _
    ! Z7 a! w" {( z; Z: N8 _学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。
    + T* V9 E' Q, x" _- U' d! f0 B
    $ C7 q" I8 K) E1 c3 r0 G" nMNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。
    ' E- r: `! O- c2 |1 {6 N, T- X6 r" d6 {8 X7 t8 m! z
    导入MNIST数据集
    7 v7 H  g, Q+ P. i
    0 y( f! r' `+ j) t# H3 O# Loading the MNIST dataset in Keras8 n2 U3 f& c5 s* x- m" d/ P
    from tensorflow.keras.datasets import mnist$ K3 \6 V2 [  k& ^
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data()
    6 T, O" H1 r  m; Q# E11 ]2 t5 x7 l8 I, K0 k
    20 d; x' a& l% g
    3. h9 @. p6 S; a
    看一下训练集:6 X$ _) S3 \& z) \* u5 q8 n' o
    4 ^7 r6 o. g$ B! b7 c$ Z( n
    print(train_images.shape)* ^( Z' w# g2 Y
    print(train_labels.shape)
    % W; }5 @, b" `train_labels" O: I1 s4 b0 j# t9 `
    1
    * x* v3 x" U, U& U1 |2 V$ ]2
    . w. [' G$ C# E1 [: Y3# i3 e1 G" p2 b' @  h  i& t: p
    输出:
    1 L: `8 K9 z+ N  n$ M$ j2 P, h) g( U6 V2 O9 k
    (60000, 28, 28)! P. k" ^: n/ ?
    (60000,)
    " v1 X( Z8 E4 U& ^1 a3 ^% g5 O2 t3 C
    array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
    * g8 `. H7 q7 s- @* v8 s2 i1
    ) g! h% f* K; k( ?" ]2
    ; x. A7 t: k9 |/ k  C3 p1 A3
    1 p( t$ Z3 B. [* x- J2 r' K) N4
    : @0 D7 P+ l5 @8 a; m7 J这是测试集:$ ~* y) O, C, m+ Q, X) L

    , a' \' Y) ~! h; F: X/ l+ yprint(test_images.shape)( ^! a5 x+ [& D# w) I3 U- k
    print(test_labels.shape)( ?7 T5 o. A6 |! S- Y5 a8 M
    test_labels: [( {( o. G  g9 y
    1  L, ~- l: L' O8 y2 M! K" f
    2
    / T) n+ a4 P+ h2 L: @$ J3
    - [6 E$ J: R9 p4 L; x* y输出:
    . ]0 V3 g$ S. v: r  U& D
    1 M+ h  w! Y/ U" S0 y2 _(10000, 28, 28)
    5 D5 v+ L, e5 D" r% v  g4 z% [(10000,)
    : \% @1 H* e* ^/ L1 x  Y! y! w. }. \1 `; Q  V+ |$ q
    array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)3 m1 o9 X( T) A. c6 I2 u5 P3 g5 \0 j
    1, \, S3 e7 ~% \6 _
    2
    7 m+ S1 Q  V$ n: A8 G4 E2 f! b0 x3% m3 t' }& n; v2 k- {
    41 J& T: [8 i, t- A  h5 g9 c: N% ~
    网络构建" B+ _  `- d; }, I

    + S3 v4 X' [5 L0 ~我们来构建一个用来学习 MNIST 集的神经网络:
    + b' I$ z' J/ P. X) A. g& @4 }0 f
    - D6 V3 u- V( ]) O2 M' Tfrom tensorflow.keras import models. H7 n# _. u& y& `
    from tensorflow.keras import layers
    3 w' f: Z+ Q( y6 L4 R/ p1 V# Z1 z% B- l: J4 A9 p
    network = models.Sequential()0 B2 R5 f2 Q. \  x1 Z- x
    network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))
    ) N' U$ Y9 [' ^5 l% }5 lnetwork.add(layers.Dense(10, activation='softmax'))
    . M! j$ |& U- w1 P  \$ o/ l13 s9 V; h4 C. B( K# b
    2  c% r8 A- ~1 L- i  c8 ?; T
    3
    7 X  Q& u6 f+ r- L& x- \! ?4
    * X; d, g0 [9 ]& B7 h5
    " T9 b  d5 C; o9 l* f2 B6
    ) r+ a2 T+ M' p, [5 ~( m2 z: H4 _- a8 u神经网络是一个个「层」组成的。) X5 y9 P9 T. a1 v1 X, E0 O
    一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。, p: W$ G' g& t0 m; A, k
    - f  U9 h* Y6 W# S, r+ T
    这样一系列的「层」组合起来,像流水线一样对数据进行处理。9 y% }: y" Q; j
    层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。
    $ h# U$ M, @- t5 m% k" i) W( O3 ^
    我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。
    7 X& C$ w6 P6 l, U
    $ i" b$ D# V0 U: h: J数据到了最后一层(第二层),是一个 10路 的 softmax 层。2 Q. U+ ~5 d' h; w1 \
    这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。
    : P2 n* q& `3 E4 c* P' m7 O事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!* j' h2 u% D9 u. U. }  a- j
    5 r: P4 Z  ]# M8 K
    编译
    4 g4 h9 O) H# i- R) ~( i/ `
    " _+ g2 C. M. v* T! p7 \, T# g7 y接下来,我们要 编译 这个网络,这个步骤需要给3个参数:
    ! _8 w2 _( e0 B  d. T1 R8 D" W( f
      R: O" ~& B( l( K; t0 u: t' y损失函数:评价你这网络表现的好不好的函数9 f* W" j$ _" E
    优化器:怎么更新(优化)你这个网络, j# q0 {8 E# m5 r: _8 D4 A
    训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度/ t" x* U) }6 r2 X& \7 l9 G
    network.compile(loss="categorical_crossentropy",
    & @( h2 \5 H: j6 C& B1 A; C                optimizer='rmsprop',
    + x7 c& f' o" Z$ w5 F. b                metrics=['accuracy'])" B, ~+ v# K. l* T% G
    1+ ?) R( x+ B( \; m! z7 Y) N
    2  Y7 y+ }; _3 q
    3
    1 m/ ^: V( q$ t% H预处理
    $ i0 n1 |6 E- ?( e  L
    + }2 ]6 P8 {( O* g# X图形处理
    ( g$ J0 U& x. |
    ! w1 l  G2 {& t; Z/ S我们还需要处理一下图形数据,把它变成我们的网络认识的样子。6 D5 c9 M, ~. W% M

    ) I5 P* _7 p" i. ?- q- _7 Y/ xMNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。
    ) ~/ c0 f$ o4 @! {9 E3 V而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。# m1 {' n& O+ Y+ Z
    0 n! k6 S) q# S3 Z6 |" `: m  G
    train_images = train_images.reshape((60000, 28 * 28))5 z' g6 i5 M2 J  |  Y
    train_images = train_images.astype('float32') / 255- D) ?& U# S9 b" @$ K0 J3 y

      t, S3 [2 b3 M" E8 etest_images = test_images.reshape((10000, 28 * 28))
    ( |/ b2 r! G' [8 Xtest_images = test_images.astype('float32') / 255
    9 Y+ B: P9 Z9 Y% W& n& f$ a. W/ v1
    $ l" c6 |, f9 w. U5 ]' }2
    - g) O* x! \  w1 ]2 |' h2 w3
    ' S7 \! C, i1 y/ E0 j4+ W' y. u/ ~8 W5 n/ w  o
    5
    ' H. O9 l* ~% \, @7 c! w1 b标签处理% ?  Z; t, L! X  k0 K5 P+ R8 I, N7 F
    ( N3 w  C% e  _# x" Q
    同样,标签也是需要处理一下的。
    # H4 ~) b9 p! d( I; n: P  @$ p6 w9 U" f; M* W8 q+ [3 [
    from tensorflow.keras.utils import to_categorical' m4 {* y; f, f/ w

    9 d6 J' u2 H! S) Ftrain_labels = to_categorical(train_labels)+ P+ s" Q3 u# E. T# t
    test_labels = to_categorical(test_labels)9 }' v7 n. k, [8 l/ c4 V
    1
    , t; b! W3 T5 x% W7 x- \1 j2! K. e, M. C# B; D4 S' v
    3+ n2 Z7 E: V  K9 Q- F7 _
    4
    $ t6 i: Y; f% O  C  X训练网络  e6 x# k3 W7 j! [. [( A9 q* S9 m

    - E6 o3 X5 ~7 b  unetwork.fit(train_images, train_labels, epochs=5, batch_size=128)% }% u2 Y) |! K9 V. N& J8 K0 d8 \
    15 R0 w( G# f9 \- Y
    输出:! B" P0 H0 ~! K2 M7 |. r; o) u

    & g! ~: L# c- \7 J; \( r: V& iTrain on 60000 samples$ N' E- T* F$ \' O# `, c3 @" ]$ m
    Epoch 1/51 x" H3 R; d5 e+ V* T8 p
    60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254+ J, f$ @* K4 J4 e
    Epoch 2/5
    4 \, N7 Z0 L: P4 e5 d: u* ?60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693
    2 K8 s: o- R0 p8 o' ?1 pEpoch 3/5
    & O6 @# L  |7 C% K/ U8 E& H  A60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.98003 K: V, ], m: l- P8 n7 y
    Epoch 4/5
    6 c( m4 q' s. ~# c60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848
    + K$ F  }& K% W6 s# sEpoch 5/53 G  r' x: M9 F5 P/ |. H
    60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888
    , R) x* s# J  _3 [4 E) W: }6 T9 m/ s$ Z; H1 q
    <tensorflow.python.keras.callbacks.History at 0x13a7892d0>
    * {  E! w1 ?; j- [1; U1 D/ W5 q# F# H9 }0 f9 q, O
    2
      L! F4 u+ n, x9 ?1 S4 z8 {3; ~/ d! Z- R1 c+ t2 V- G% m
    4
    5 J6 z1 |' |  M6 L  ^* b' M51 z& _/ m( `! o% k! t& F
    6
    0 t& R4 D+ Y( y; J% l- Y7
    ( R/ N% x0 P) C# g5 S8 Q8
    / P1 A, _" L+ W9 C+ i9
    # j: ^  ?8 \1 o6 v4 c10( O9 h/ V* f5 Q/ y
    11
    6 V% B4 i1 M2 z  y/ }% [* A7 c+ @12
    4 L; t' A4 r  d" Q  U* B139 I: c3 K6 V9 ~
    可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。6 ^' I- S  c& A: A7 o) _7 y5 r
    0 M6 I7 {. _0 O. I+ ~2 b# _
    再用测试集去试试:
    2 j( Z; ?$ \" P* N  a0 k! z4 x1 y- N" D( R& x9 I/ p$ D" l
    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( d& V9 `$ a3 {. G- Z
    print('test_acc:', test_acc)) e7 X2 B+ a7 n2 m0 l( }
    1
    6 o) w7 D4 C, [. C23 }* y2 K* k' x+ O2 ^! `2 w# P7 H. `
    输出:
    . N( a! s4 Q! l4 [3 J
    0 v. J6 T0 N, D5 o1 i10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789
    / v+ x; {! ]$ y4 K* ntest_acc: 0.9789% A! N0 K% e5 O. E- J/ a0 r: N( m% `
    1' T9 i" L, U: L0 @5 q; i
    2% P- `% [: ^0 m  q
    我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。
    6 r+ F* u9 Y  ?4 `3 }3 N5 i/ o3 P$ ~+ Q* x+ i
    神经网络的数据表示1 G; x" Y% y+ k

    & C' v) ~" X7 A$ N- n( ETensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。
    ( l2 R: A  P0 G  ?7 u1 ^& M
    ! c: L& t* w3 r我们常把「张量的维度」说成「轴」。$ E% b* h, M1 X, U- H

    9 j: `2 _- P( P, W1 Y$ d# Q认识张量
    7 P; H3 Q9 Y; H! A, X3 j, `
    * ~) G/ e( S0 U, ^标量 (0D Tensors)
    5 {7 Q4 d/ R. ^- C/ B6 B
    9 Q5 K3 y( \* h' s' ^& t  uScalars,标量是 0 维的张量(0个轴),包含一个数。
    0 f; [0 E2 Y' z% L6 [( x# Y. b' u  N
    & H) e8 j) L9 U4 ^+ N7 [4 w标量在 numpy 中可以用 float32 或 float64 表示。) F/ V) _* D. x) l9 b$ H

    * A4 P1 ], W2 O, e1 F1 Simport numpy as np
    # I3 Q$ G; e* Q7 E
    0 z# [, \5 l- ?- ]x = np.array(12)
    - d( p: m8 K- G: wx1 y0 X% X3 _2 v; [+ h6 f7 m3 [
    1) H! r7 i' z6 Z9 t, d0 g
    2+ z  r6 _( {# t8 N# f
    3
    / F3 ]6 u* U# T! y7 S, @8 [4+ R" I/ ]  w  `& O( Q. e2 r" P
    输出:5 m1 `5 ?) C1 o7 c  }
    1 l0 g# ^8 s) _# D- s+ O/ z; ?
    array(12)
    + F4 [8 T5 y) k4 L1
    4 O+ S2 Y# ^' W$ cx.ndim    # 轴数(维数)
    , Z2 W/ X1 B% A& }+ b1' f5 Q- p" Z3 t
    输出:+ r2 _" E2 K/ ]7 X1 d, f& a
    3 u0 b; P! a0 \7 K: Y
    1
    , e5 ]3 @8 Q( D* {0 }( A( t9 b! f1
    5 ?1 Y+ X9 k( F( |8 `向量 (1D Tensors). U$ F; i: B. T

    % ~7 }  C1 u, _4 |Vectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。
    " B8 b0 g% q7 x) _% }" l. Q5 i: ^- {
    x = np.array([1, 2, 3, 4, 5]): k( `; m+ ~" Y6 z; u
    x
    7 V; _& N" ~/ L. i5 l  I5 r0 M; @1
    . @5 ^0 A- `. T' S2
    / d$ d! l, k7 ?( s4 v& k% F& A, o输出:
    0 U' s$ I# \# i% R
    ; ?: N/ p9 l; t) {7 barray([1, 2, 3, 4, 5]). \; u+ p. v8 W/ S1 s* z
    1  \( l1 V# f2 U% W/ t, d8 P6 |
    x.ndim
    ) B: ?  h) p# |; V4 i1
    + W' p/ [' A$ v5 H  E- x3 ?; ^  ^输出:* ]9 P- f% M) D6 e) l( f( _5 p

    " X2 r* S6 S" y. ?5 j# G1  O' y/ q9 D8 `. v3 x1 i4 y
    1
    , P4 H! h6 n. e  Y" l6 I2 _+ l我们把这样有5个元素的向量叫做“5维向量”。
    4 {, w9 o1 k2 X  o但注意5D向量可不是5D张量!' x* q& y3 b9 l$ c6 ?
    % I/ ?1 }9 ~: A1 q
    5D向量:只有1个轴,在这个轴上有5个维度。
    ! h7 B- \/ r' V% j5D张量:有5个轴,在每个轴上可以有任意维度。
    * R3 b6 A& x9 q+ I( j这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。* C6 s& p: z0 A: P
    4 ^. I# b5 }; t2 L! ^! _9 T
    所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。" p* Y) Q" S7 n
    7 [. l2 L, q) a! }
    矩阵 (2D Tensors)* `, K( Z9 ?$ J. H
    # r7 U2 P: ?  j) F
    Matrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。
    & v. L  h; q- B; U. `
    - j- x$ ~& [6 X2 w5 \/ e! L1 `x = np.array([[5, 78, 2, 34, 0],
    ) j7 _( H$ I, |6 W4 F              [6, 79, 3, 35, 1],
    1 y3 l  y. A: v' _              [7, 80, 4, 36, 2]])( j; b% e  M3 L) |6 t; a) x
    x$ l: G/ ?  }( o3 y% U9 H7 x
    1
    4 f% W$ {; e) B( s0 A) p# H22 j! h, s; n$ w; F3 l6 Y6 e
    3
    : t; ^8 h# e. }6 V( W, H' O4
    3 e0 N2 S5 I# k% }* r; |7 F9 D输出:0 t  k0 g& S# c8 ]1 ^; X
    - Z! z5 G3 [" v
    array([[ 5, 78,  2, 34,  0],
    % \4 D: X- v% {$ @       [ 6, 79,  3, 35,  1],
      T# B8 w' ]2 v; U# M& k% ?       [ 7, 80,  4, 36,  2]])2 Z7 y+ V/ E9 A) m% R8 s& Q6 O- V
    1
    & O6 ^) z9 X- B  @' j4 }. u/ D; ]2
    ' W& l! U# |6 U# _- b/ Q* S3
    : g. t# i3 a; Vx.ndim2 }) i  l9 h/ n$ W& Z5 i+ h
    1
    8 I1 X5 L2 r1 t2 @输出:5 @. s/ R# O% O

    7 T1 h3 D9 S  g' K9 v2# U6 L- v: y& w# `& o
    1
    + r6 K2 r; L5 b6 j( f高阶张量* L0 p0 |5 R* D4 Q
    " t6 E$ A6 ]" c  {. U, o
    你搞个装矩阵的 array 就得到了3阶张量。
    - n1 h3 ^1 A+ M6 F9 }0 Q, h; p3 k2 k  [" `
    再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。
    0 Z/ k* I. `1 U% p6 O
    ( O& {2 W& _) F& b. j* Zx = np.array([[[5, 78, 2, 34, 0],
    / V# y1 O+ q( U               [6, 79, 3, 35, 1],0 p. N6 j! t+ u' H& U8 v; F
                   [7, 80, 4, 36, 2]],
      Y7 Z8 C. [) r( q& i" ?4 x              [[5, 78, 2, 34, 0],4 p/ _! O- e. B
                   [6, 79, 3, 35, 1],( n  ~2 b4 j9 \& g& p5 ?
                   [7, 80, 4, 36, 2]],6 P1 V6 l( `6 a% [5 {, @! q$ J
                  [[5, 78, 2, 34, 0],
    % Y/ L8 y2 y2 a0 _6 Q               [6, 79, 3, 35, 1],
    ' |  d. ]" x; C0 p               [7, 80, 4, 36, 2]]])
    ' r6 r$ u4 m7 u; `  R. o2 Fx.ndim
    ) R2 J2 w" |  G6 g1! ^4 {5 W# L* G: n6 A
    2
    2 l4 c4 B1 E  w4 X3; v, J3 c. R0 ?5 S" h
    4/ W" `6 e9 |# Z
    5
    # A6 E3 e% i2 _7 }2 k& I69 s+ R, B( H; T* U9 d6 q; u6 X2 a
    7
    " J. L9 i  Q( G1 h' W6 ]' P, m% Y8; G2 r7 ]8 A9 S3 }) I( p: O
    9
    $ x; ~: T' m# C5 o6 N' e104 L7 i: l9 d1 Q' c2 k( R
    输出:
    & v$ K4 w% l% _; R. L( M3 s9 v/ x3 \$ S( C- y
    3
    8 ?; `& c5 B* y/ d3 u15 C7 Q! M/ B8 \- p  ^  E
    深度学习里,我们一般就用0~4阶的张量。
    ) T& D) t) M, l; B! X) U" d' D6 r& f
    张量的三要素" I  X3 @) g  t2 f% j% m
    # Y5 \% a! F& C6 |% Y* p( b
    阶数(轴的个数):3,5,…5 S; g7 A' W8 i' D, w0 l6 ?
    形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…" h4 i7 `! t; p3 P" Z! n* k7 U% K
    数据类型:float32,uint8,…! E1 |1 T4 h6 b5 y
    我们来看看 MNIST 里的张量数据:2 J; Z; O, Z$ X" {8 o

    " m* m2 \9 o: M# Y* tfrom tensorflow.keras.datasets import mnist
    8 b' P2 V  k: `& f, b(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
    * Q+ I' x. Q- f" t3 X! Q% L% s) v7 D3 K- D1 p; [2 ]6 Z
    print(train_images.ndim)
    ' p5 C, }3 z: Z5 m0 U1 w$ o8 Wprint(train_images.shape)0 O& X1 q  t7 h0 S3 w5 r* [
    print(train_images.dtype)$ u' C/ W8 d% _& E- j
    1: [( M; D; G  k8 Z
    2( h& S; D0 P4 E: d) V% R" ~
    3
    5 @$ P+ [8 k# Z9 j4- D) t/ R+ G* F
    51 N/ n, I% }. v9 d5 x' m1 O
    6
    7 G4 C0 R" f4 p2 K! W. o1 w' b输出:! b1 ?2 _; t4 F; c0 N  @
    6 D' l/ Q8 @# T) i3 [) E
    3% e% |; A- y5 b3 t9 h4 R# f
    (60000, 28, 28)
    3 ]  \- G: m: j9 F! ^2 m6 f; e" Luint8
    0 f7 i9 g$ T! n# ^* |# T' o1: B7 r; _/ }6 z. v
    2
    # U1 r( Z4 h( _2 I- k/ q/ `" q3
    + B# I7 {( l, V  d# _6 B+ R所以 train_images 是个8位无符号整数的3阶张量。
    % e- m# b' H* m- v  X4 q* b$ {0 s! i2 @
    打印个里面的图片看看:
    2 G. a, ?& c8 w. A. E' N
    7 p4 Z% W) q+ W) a. Qdigit = train_images[0]- X6 U* N  f# g% U- \
    ! I0 x5 Z5 @1 E: [$ i. d9 ]
    import matplotlib.pyplot as plt5 n7 L% h( W0 i1 O# t, l
    , K0 r, b( W1 i6 j2 R# b
    print("image:")+ ~( K. [0 E1 K+ d/ V, ^: ~
    plt.imshow(digit, cmap=plt.cm.binary)
      t! |' a9 S; T& T# h% \0 Uplt.show()  Q# \' R  D3 T6 |8 N* q
    print("label: ", train_labels[0])3 T- l9 K7 M6 z. [! w. F# _/ N
    1+ ~1 y4 R  S& I7 `6 Y4 l# ^  e, d  j
    2
    2 o! r* c) R+ q* ^6 y3
    * t: m1 N) |$ _) }+ E. G4
    & i6 u4 E  P) c% g- i7 O3 m* C5
    7 ]8 R* y) z( y0 R& U- W6
    ! _# s! [& ]8 f  W5 \7
    2 V! r# Y  ?. Y3 M# o5 l8
    . C. }3 ~& b0 ^  \) r7 Y8 j输出:
    8 T! O6 m8 ~* ^: s! p+ v# `9 }3 q: X7 n
    1.jpg
    2 C0 L; m. p( O. ^& s9 `: a: V
    label:  5- f' G) T& D2 i) h' [  i7 F
    1  [: l6 E% x& J" j$ j! E% v
    Numpy张量操作) k  |. F6 i+ Y/ P$ K
    2 P& Z; Y0 l& p  z
    张量切片:% Z2 H7 s5 a+ Z9 ]

    5 j; C% z# d& H6 s6 kmy_slice = train_images[10:100]
    * \$ d( g- X' s+ D) w* @0 c, hprint(my_slice.shape)
    / O. a7 w: z/ ~, T8 {& P2 R1/ O% X1 f8 o0 [/ ]7 |; C  r
    2, b2 m! v6 _5 j! C
    输出:
    " c) q" E7 j) r, A) T 2.jpg , P6 @, G3 {* {' e1 }! j! w& J  H
    (90, 28, 28)4 r+ n* o! j" z: C5 L* s4 X
    1, r' G. k/ w1 s+ K. X
    等价于:) z; W! }& ]; U- s

    ! R9 S0 |! @8 d! Y0 `2 C. |my_slice = train_images[10:100, :, :]' s# S" Q7 Y( a( p! C' |
    print(my_slice.shape)
    / e1 l( u0 W4 S) o* w' ^1+ E: q0 _3 k3 u# @9 s
    26 T! D; q& J' j) j
    输出:. ?  r# W' a4 b+ K- P8 o7 Y8 L
    3.jpg + g8 p" F+ A2 j  |
    (90, 28, 28)2 H) T/ M" G# o' a* }0 N
    1' ^9 w; H# k7 i" ]9 p; R$ |
    也等价于
    ) l8 V  C1 W5 V3 {+ P6 Y6 @3 D' M+ \% D6 \
    my_slice = train_images[10:100, 0:28, 0:28]: o) U; q$ f# o" O5 M
    print(my_slice.shape)
    ) A: }/ e# i' b7 v( l1
    4 ?+ }+ w% |* Y6 q" r  M2! A, V' B; I) K9 ]' e. Y7 H
    输出:
    & t3 [" |$ z  p3 S2 \
    6 E- R( @# Z! L4 A4 `) O8 q- |7 M(90, 28, 28)
    - h: ]: f2 b5 [2 [1 l  j1/ @& b  H3 u! z' n! x
    选出 右下角 14x14 的:
    1 g3 W* C) X, r2 t, e, ^7 m) \4 M$ ~- p" f2 T
    my_slice = train_images[:, 14:, 14:]8 ]! R9 N5 F2 v. B
    plt.imshow(my_slice[0], cmap=plt.cm.binary)
    9 f( ]+ G2 v+ W( C4 gplt.show()
    3 m# D) `& x3 z% {* ^: R! Q18 {+ V2 |0 L: E2 N
    2
    8 O9 i% ]: f/ i  C. E: L3 [3
    7 C! {5 v- {, M8 V7 Z/ W输出:
    6 Q. s3 G$ i% V! ]: o/ R2 B0 |/ ~6 H9 A+ D, r: f. H) \
    + E" m$ y& w; G: b* E

    + X! U$ {7 `3 [3 T8 W" c  [3 }选出 中心处 14x14 的:
    4 ?5 L) ^+ ]1 h+ `, U1 ?
    ! L) X. V) |7 _4 Omy_slice = train_images[:, 7:-7, 7:-7]$ Q/ q2 |% ~9 f! ?0 H
    plt.imshow(my_slice[0], cmap=plt.cm.binary)& }0 M# m# \  x1 |/ G
    plt.show()
    . i/ Z6 r# C9 ^14 P) V. I; s. s0 t7 E& ?2 B0 h* a' G" X
    26 Q2 n1 k3 F5 i: S$ }
    3
    & t- H6 Z/ \6 B输出:1 L  ]9 R( X/ t2 I) c( r( l
    & G' R6 W# Y; _, a

    7 I9 ], i; c& @
    - n9 F7 N& m" ~: w% w: d数据批量5 ?8 c/ _, U( {. _. Y! e0 V0 k

    2 `6 W- l7 S% E. f深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。- B( H% H; g4 A5 D# g& z

    3 {6 g0 `; l2 j1 {深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。
    1 [" B  k) q; H) o& H7 W$ J
    ! L, l1 ]: g# X" [( S5 y在 MNIST 中,我们的一个批量是 128 个数据:
      r; j# U8 ^/ o0 `. I' ^% o0 w& S' e7 K5 ]+ @& Q) L2 B
    # 第一批
    # }+ U- P3 I$ F- Kbatch = train_images[:128]
    % |' y3 N3 r! t' g6 G: s2 l# 第二批4 k" a/ A  c+ y+ }8 ?. p( U$ S
    batch = train_images[128:256]: |7 m5 ?' u* S' D% G5 |
    # 第n批
    / P) ?- y# f9 d, J. A  _: d) Un = 12
    : ]1 H5 l3 }. s. |batch = train_images[128 * n : 128 * (n+1)]
    # ^6 W1 _: @# h; A9 o& V3 r/ l: {, T6 n1
    * O: J6 m# S4 H$ t( P22 J. {* ~' `8 s; h
    3% X5 V) z' N2 t0 x4 r" r
    4
    - B" q6 Z' x& k$ i/ }7 `5# x! ~$ j( a6 E5 y0 g0 }3 D5 }
    63 q  V% K7 L- U8 l7 ?8 \2 h' U" |
    7
    * m* e& ?3 g3 h1 C: H所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。
    4 \- p; P+ w7 _2 Q0 u( o$ p
    6 s: c2 J: u) `7 V  E常见数据张量表示
    ! o2 o7 L- E+ |& F! U: \
    1 Z3 ?5 A5 H7 u. x& u! {; f8 ?数据* Z3 N1 q/ @) Z. [; N0 V9 q
    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-7-18 09:55 , Processed in 0.383631 second(s), 58 queries .

    回顶部