QQ登录

只需要一步,快速开始

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

    # i' x4 Z) u+ O8 t6 J0 @Python深度学习之初窥神经网络% _4 H# ]5 c2 \7 ]! P- @/ ?5 @6 o
    本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。& I5 \5 k0 ^6 `, z

    ( B9 \; ], v/ r, h本文目录:9 n( P- `. |3 o, _

    4 O; L' u0 w: _文章目录/ c4 k) t  P! O7 X5 u

    3 ]; B$ A* I) ^% E3 i' h6 jDeep Learning with Python
    : y5 C: [2 }5 I初窥神经网络
    # t4 Z) V: ]7 K2 I导入MNIST数据集' I2 @$ k" X  l8 i6 @5 L
    网络构建
    , `5 h  |& X) s4 M; b$ `4 [2 ?* s编译. y4 w: X4 {# F/ j# k( t
    预处理
    ( p% X8 C; c3 b6 }( n图形处理
    % R6 g; T* S  Z标签处理6 M" P7 R8 _( S" F
    训练网络
    " c- g9 N1 v1 D/ j: x神经网络的数据表示, C0 w/ c5 W9 Q: y" d1 T6 r
    认识张量. u; g! Y( T- M$ o" c, V
    标量 (0D Tensors)1 A( P" |: s/ m+ D6 F6 I; x
    向量 (1D Tensors)2 u6 W. L5 w0 Y- O. h, k
    矩阵 (2D Tensors)
    2 [- M0 B0 Z! X$ m: Q7 D高阶张量$ O9 j( x- f2 t
    张量的三要素5 V1 g' Z1 |' s$ g
    Numpy张量操作
    7 h3 T6 r9 W2 k/ `- @张量切片:" {) B/ W. n; C4 Z$ I# V8 a
    数据批量
    # [- G2 |+ c, `: G常见数据张量表示5 m! Z, V  W1 s
    神经网络的“齿轮”: 张量运算
    $ d5 L0 @% ]+ @5 @+ ?4 v逐元素操作(Element-wise)
    * Z9 n/ W# u& J* \广播(Broadcasting)
      t# z! D  K, e3 Z张量点积(dot)* j& g) x4 h% d: T2 p8 s( |7 c
    张量变形(reshaping)* i# `1 @: ~0 @9 G( f) ]! A! X
    神经网络的“引擎”: 基于梯度的优化5 M" y& L9 R+ I, b/ [6 m
    导数(derivative)) m, N% ~& B* L/ _! P
    梯度(gradient)$ h* N: b0 \5 B  g% Y1 g; Q2 p
    随机梯度下降(Stochastic gradient descent)) w& H* b/ g0 o2 A
    反向传播算法:链式求导
    0 i- \: s6 C8 d. a4 _; Q% h# h本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。  S, n/ R- x) Z4 V' ?2 y
    1 r% f) x3 Q! e, C- Y
    初窥神经网络. P& J+ e4 F& D, e! A9 |9 S0 F' E

      C4 i0 `4 q2 V学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。
    2 [( ^7 x% m8 f+ D8 X
    1 R% s! w: i9 z* i7 I  b0 X3 l* cMNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。
    - Q  Q, y0 }' H" N) E3 ?/ W8 Z: ?/ z
    导入MNIST数据集
    9 O8 l$ m4 s! j# X/ L/ _
    + C2 z4 ]8 o( C7 y# Loading the MNIST dataset in Keras
    2 H* D, h0 T  z" G! q6 f  hfrom tensorflow.keras.datasets import mnist6 q6 }! ?9 m: V% Z6 E1 |& c/ M
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data()9 s& j5 i9 \; n9 @
    1* ~! {+ u2 i! l4 l1 `, G
    2
    # ?) n4 |6 J* G) z: p  t3
    $ T5 P7 A' M, N: \0 m/ O! S看一下训练集:8 |* l* }6 T" k% I* {* `
    9 L" p' S) o! |) G; G! o
    print(train_images.shape)
    & p/ J1 @( ^9 N8 V& F8 j7 _7 ?print(train_labels.shape)& Q: C2 Y/ C$ c, A2 r
    train_labels5 y' m- W1 Z- J4 ^$ E7 g
    1
    ! W3 D) ^0 m: _6 z) z2
    1 @: `) v# Z! F0 S3
    1 z0 F8 c! U$ ]2 w输出:5 l# Q( s' e. s% j$ ~1 A

    # V# W7 E# c6 q$ w0 h+ f(60000, 28, 28)& g( T! u0 c+ ^# z" x( u# @
    (60000,): i- B5 |$ Z# g/ L/ s& t2 v

    * O6 X/ j7 g" b7 P" R! Q, R! G- Barray([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
    , Z7 w+ [$ [; Q& ^' u7 \7 C8 A. O1
    8 `3 e# y2 k" w/ X2
    ; t' ~! U! J, Q' h6 m5 D3
    + Q& I& e+ d. A  t4
    + l$ e" z5 j) q& V. b这是测试集:! X0 U/ ?( k# Q& r8 u9 R, t9 S* @7 @. J

    ! P' I& a. C( a5 B1 d+ m  Hprint(test_images.shape)
    6 [2 w, {: s- Y8 mprint(test_labels.shape)7 _5 U1 K# n* }6 n+ H* h5 J6 b
    test_labels$ {; }0 a& x1 k+ t
    1$ c" g, Y) m' S" _" E
    2
    0 k; f. U& F6 p3
    ' t" D. P! ^% C1 e输出:
      b6 x& j& Y& m* P
    1 F" P" f" M+ E, I" x(10000, 28, 28)
    " l+ E: L1 {% B(10000,)/ s! m( e4 q6 d4 s/ P2 J

      V) v" z5 v0 X2 }array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)
    4 m$ _7 g* o5 c) `1
    $ J7 v2 |' t7 }9 n6 E! H2% ?  m2 |/ p' ]% M+ E2 \
    3
    $ v) {( C( ^* ?! j' Q. E4
    + d! f$ d7 `( N! L6 r. L网络构建
    4 v% f7 W7 Y' o
      x# m+ z+ k" `& A( F" ?我们来构建一个用来学习 MNIST 集的神经网络:: D3 o7 W: h7 S) _8 x3 F

    , P$ }3 x, @* F9 o" I: pfrom tensorflow.keras import models# f6 e8 [6 \" J. u
    from tensorflow.keras import layers
    9 L0 ?/ p! p- [! h0 E! o; \% D/ w- Q7 A3 t2 x: }6 D( q
    network = models.Sequential()
    2 a  o9 @. q/ g( d; P$ s6 ]# Jnetwork.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))
    3 ]6 E0 Y) F: l, y/ k8 D) Z2 Xnetwork.add(layers.Dense(10, activation='softmax'))* [3 X! L8 k9 @. c  \) W& ^
    1
    " O, P: L% l0 t5 [7 V2
    $ ]- J+ M. H; K5 u8 h8 b33 y: t- i! B' d, n( F4 K! ]" l
    4
    2 H4 U+ A% c7 y: a1 R* L* O5
    8 T1 b: v1 n  j8 ~: X6. U" l2 y0 o4 {* c# {- q
    神经网络是一个个「层」组成的。
    ( R; X7 @- z& B$ h一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。  A2 a! \+ w: h1 ]2 @- k% T/ B
    - r- C1 s& }/ R/ T$ i
    这样一系列的「层」组合起来,像流水线一样对数据进行处理。! v" ]  d; U1 i3 k1 M
    层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。5 ~! H% ]7 b; v# u; R) i& A: G
    4 ]4 x4 |  Z0 E' }' K
    我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。
    + n0 Q$ t' }/ u: _9 ^, w
    4 w0 i+ \, d5 s/ d数据到了最后一层(第二层),是一个 10路 的 softmax 层。, O( i4 e5 D1 x
    这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。
    3 M$ ?/ n, @- w6 [事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!! t6 f% f1 \( s# X8 |

    : L& H( Q( F, s3 L编译
    + L- {8 X, |$ T6 k% O1 @, e& W. [4 i  Y3 P4 J2 H
    接下来,我们要 编译 这个网络,这个步骤需要给3个参数:
    & }2 r  k- L: z( \7 [
    0 ?9 S0 n/ \; z; \" S+ D9 Q损失函数:评价你这网络表现的好不好的函数
    7 g' p9 v" O* e2 m/ i6 l优化器:怎么更新(优化)你这个网络6 D- o$ W. ~' \- s6 U4 z, H
    训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度
    " ]" B+ F9 ^& u) Enetwork.compile(loss="categorical_crossentropy",6 z! V, b0 `& Z0 H
                    optimizer='rmsprop',
    % H9 h/ g$ M- q0 ]                metrics=['accuracy'])4 a4 F* _" M; s) U  F: s+ H
    19 V! r7 T! N* E8 N4 e; s& J
    2
    0 t) a" _& R' A2 ?- V3- b: }8 ?, N4 J( U
    预处理
    " t. z) {( L# v: @
    0 K- t5 [: H# ?* y# W1 B图形处理8 S- T( |2 @( }# `- w5 H7 p

    0 t6 @! p* V2 A) l  w5 l我们还需要处理一下图形数据,把它变成我们的网络认识的样子。
    ) x) [6 J( f2 u$ C6 ]4 O* n
    # Y( w# _) H. ?& v1 e: b" z( A% cMNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。
    5 V/ }; ?& _# Q! d而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。( l, s3 a/ K9 }$ v' I# C7 m

    3 Z, y$ f- i8 d: b+ j. i/ N' Wtrain_images = train_images.reshape((60000, 28 * 28))
    ; q" t1 _+ B# B2 r5 M) {. Z  ]train_images = train_images.astype('float32') / 255
    : U1 R9 v) o0 k4 j. u. u/ ^
      V& h9 i: [8 Q, V  W" m( ?test_images = test_images.reshape((10000, 28 * 28))
    ! _1 {3 t) i* c" l) ^' C& Etest_images = test_images.astype('float32') / 255
    2 K/ ]) Y8 Q# J, ?6 C6 m' c1
    , h" @% {) l0 ^4 l5 ~2/ Z" S  \+ c$ o  L+ I" ]; a
    3
    # p5 E/ S9 c$ z9 u/ D  {4
    1 o7 i7 D/ n1 H- V5- E& a( C2 x* H' y  K+ j
    标签处理4 @) d4 ?3 [0 x
    " _' t1 ?$ E- w7 ~
    同样,标签也是需要处理一下的。/ m$ D- b7 v8 Y6 F4 G( L
    & `& Q& g$ w9 P
    from tensorflow.keras.utils import to_categorical
    - C, B- e( |* H: s- ^' F" @/ ?% Q: k# X3 i' R* f. g
    train_labels = to_categorical(train_labels)& f$ Q7 y, C( L3 p5 l7 \# Q
    test_labels = to_categorical(test_labels)
    2 {& A% Z$ T- b/ E$ ~4 |1' S8 e+ T; X* W* t( d( \3 u
    2
    4 |. E! A$ R2 [3 l2 Z: I3
    % C3 ~/ l6 p% t' i: y4  O8 P, |  g1 @1 V: X) T: E
    训练网络
    9 N# y7 T  f" I1 K9 W  ]: y, ~9 [8 I6 P5 D& C
    network.fit(train_images, train_labels, epochs=5, batch_size=128)
    - Y) f8 Y1 x- F* J' C* ?; O/ }8 ~1
    6 R9 k/ W. A' r  r( i输出:
    5 S/ s& C, _# _9 G2 O  h
    2 W* j- W$ s# E9 d% Z) STrain on 60000 samples5 `% X, L. ~2 q, W8 B/ s- ]
    Epoch 1/5
    5 O. B+ X0 f) b' p, @) z* J- ?9 p$ D60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254, S9 _, D5 f! g' r0 s
    Epoch 2/51 l5 b  y, E+ L5 H$ x
    60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693' Q4 c6 Q# Z3 U/ x% t
    Epoch 3/5
    * M) K" m- L5 V9 }60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800; S- ^$ ?7 r7 ]
    Epoch 4/53 d3 x0 f  E6 F, e+ S7 Q/ L
    60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848
    ! k8 R4 r  w8 P8 q2 z+ v9 v# Z* sEpoch 5/5- \( D6 [: @, C
    60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888
    " ?, n/ {% h% ]' ^# P; q2 p( j9 ?9 u, P9 C2 m3 u8 s
    <tensorflow.python.keras.callbacks.History at 0x13a7892d0>, Z0 D$ h. s1 n1 L2 x
    1
    2 o! f. b5 l; y" T6 k2 G6 z' e2
    * }( Z7 ~0 _9 V* [3
    ! X, X- V& W- N# d! L4
    ' e9 g7 K' o' T" g5
    1 l4 y' h* ~5 X- Y: S  ]5 s6& p  I  O2 W+ o1 R/ t4 P  i
    7) X. ]% {' S. }( p* ^: K# C
    8" {: C# Q  f( L1 R5 H. p
    9
      i+ u$ ^1 a) p10
    5 T* m9 E4 y7 W  d, \- Z114 S0 ?, h" A, @& ?5 i; g
    12
    0 A2 L% }7 e$ J# q; k, R13
    # i. p6 W& k! @可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。
    7 t$ \) F' _" F- ]! [" L$ Q- Z
    # y* `, R" I" X- h再用测试集去试试:
    / A# Z- f' X/ J# ]) I
    8 L$ @4 v! L8 {! Z% |, w* dtest_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/322867 C6 P! k- B: u1 B; P
    print('test_acc:', test_acc)8 u8 k. M# T9 p: x" m
    16 l: K! w; a  |; ]$ c& ~
    2$ I/ C8 F* X! E* X3 e4 w
    输出:) [) U( e4 ^( ?% m3 T5 s8 d

    3 ^/ i1 q! Y7 P. X4 K* W10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789
    6 ^5 d$ V. O8 k* J$ q8 F/ btest_acc: 0.9789
      D& Z2 {- r5 W& F1
    1 M( S8 c* }0 u$ y7 O2
    3 _7 u$ A8 Z# i. E我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。; T9 @0 ?$ t* @/ c$ w* I# R. A

    6 _$ k2 A8 [! y! L5 }神经网络的数据表示& M# E/ U2 i( C: ^
    # k* V8 t1 M5 N8 S: ~  F% N) A) @
    Tensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。. }5 Q6 d2 ?% m, s, \% q
    ; ?  @( q5 Q* \5 ~1 W
    我们常把「张量的维度」说成「轴」。
    ( S. w3 I/ a0 p, [* v2 {/ m$ F' [% K
    $ F3 l& F  [0 y& @$ Z. V# ^认识张量
    * _0 [: k; ]! f5 o
    6 k3 J0 y# E! D% g0 J& L标量 (0D Tensors)* y5 A1 {2 ]$ L- c( i4 f

    4 U7 e9 F+ k2 R! H0 {& N6 ]2 ?, AScalars,标量是 0 维的张量(0个轴),包含一个数。
    2 m# Z. A) u% z1 {: v! e& G& S- V6 R  i4 ?4 |! I% ~  o
    标量在 numpy 中可以用 float32 或 float64 表示。
    ' [. S8 A9 }8 W: D$ }8 N; _, T  `* U: C' `
    import numpy as np
    , t7 d  J7 Q& z: [& u' Q/ P! Q3 \( D7 S8 I5 @: E
    x = np.array(12)
    ; v6 H9 z! |/ y! X. ix
    - }" H' t. O) q1 j- ]19 S" |1 ~9 m7 @: v+ m: W
    2
    - p4 v, g5 d  a% G+ y38 j- V  W0 v" O! A  s: v
    4* y- ~' P5 _1 z( C
    输出:! A+ n. f$ C% l) ]6 E) S

    5 O$ q+ ]8 z) C# j: R! {array(12)3 m( @- n; H8 M( j7 [$ W
    12 \4 w) W9 N9 |9 N+ O
    x.ndim    # 轴数(维数)+ r" C8 h5 z0 h2 {& c
    1' h. B0 i3 F: n" i3 M7 X: l
    输出:
    & M$ F' [7 ?* c; D
    $ l( }! ^/ R; O7 N: ]# S- T* k% g1
    " C% y; \4 ]3 t- V  _& C& W1
    7 E: m, U0 A; `, T" p0 m* j  h向量 (1D Tensors)6 M& o/ D  }' {$ Z1 }: e5 U  Q
    * T7 s5 H6 `% R/ e8 D
    Vectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。
    # K- }: T; d& p1 E: N" I) {
    + ^- N3 b& l, f* |9 J" Ex = np.array([1, 2, 3, 4, 5])# ]. d# V7 o0 Q/ l* u
    x
    9 F$ J( ~. u  I+ ~/ W+ A  A1% F' |+ t' n) f
    2# X- s" e3 t! Q9 u1 P; z& k
    输出:" k3 s* _7 ]) N, h) i1 [
    + K4 d& t, Y2 _1 O5 I
    array([1, 2, 3, 4, 5])* h+ L' ^9 B6 q) ]1 `5 @
    1
    6 J0 K1 R; }7 G  l. o) v' Cx.ndim
    : l* U  |0 w+ G  l9 `1
    7 w& c% ?, H/ N/ D" F; ^! F# y输出:
    , k2 k* P$ o, z# b. Z! \( L- d
    ; f; x9 ]% d0 D. Q/ k6 C1
      A" Z& z6 F# ~: Y1$ Q6 ^' B6 R6 Y
    我们把这样有5个元素的向量叫做“5维向量”。6 R0 Z: S6 I. |# ~- \
    但注意5D向量可不是5D张量!9 i: t5 q3 }0 e) `; Y/ l4 P

    # z' v) y, k/ W5 j5D向量:只有1个轴,在这个轴上有5个维度。3 j# `5 k. o4 b4 P
    5D张量:有5个轴,在每个轴上可以有任意维度。
    6 J# s! E1 U# L6 j& b3 D  w* G这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。2 }2 x5 [. t9 ^, E8 y- c
    # \4 y, ^- |% N3 e
    所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。
    ; b, t7 k+ Z1 j0 |
    5 Q0 ]% K+ R9 q) Q矩阵 (2D Tensors)
    ) u' F+ Q; Z: i3 j* t
    / n  `& S8 Q3 @7 R5 QMatrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。
      i$ P; p+ J0 K2 t* Y. O
    2 c, _, [+ a4 Z8 N+ e& xx = np.array([[5, 78, 2, 34, 0],
    / h: F6 w$ D' q- Z( n) ^              [6, 79, 3, 35, 1],
    & H' v+ u) m; h- n1 E              [7, 80, 4, 36, 2]])
    ' P& k# p. M: Yx
    9 E4 A/ }& r3 z0 g6 J; ^' m% M0 Y14 A# q; S# Z# p5 q
    2
      @$ j. U9 m2 o' T& F3
    4 c% r! H: W: z  }& E  p- f4) z/ I5 h4 W) m' S
    输出:; b0 ]* X5 |9 _" n

    , R" a+ g" o6 [( A0 W! C7 K: Rarray([[ 5, 78,  2, 34,  0],
    # n/ ?/ J5 Y# V       [ 6, 79,  3, 35,  1],1 ?% [2 N0 s. m  Q
           [ 7, 80,  4, 36,  2]])$ [* \5 e8 H2 t" ]
    14 c! }3 a' U3 p) _5 t9 ?* x
    21 k( r+ R# G2 w1 r- q( l
    3
    & z0 O  J% t* S% F, I/ V2 Bx.ndim5 O( b- L- t/ E4 A5 t/ T# G9 M
    1: S# M) ^3 X( s& }1 Y
    输出:! [! ~% W* `7 N. t% ]( S
    2 \; x$ o5 w  T# s$ `) j, ?; w. X
    2
    + d0 Y" ?2 y; x0 }* s2 V1
    6 A/ a# g$ E1 f- b) a8 f( X0 o高阶张量. |0 q7 \+ A; J2 c7 e  ]6 y
    4 {# o8 _4 O/ k! E
    你搞个装矩阵的 array 就得到了3阶张量。5 D% v2 [" X# T6 U0 m
    : z* o2 I% e0 W/ r' o+ y8 p
    再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。
    9 l( U7 u+ [# [& P) k$ S7 q6 d
    & {9 P' U' W2 a) m( zx = np.array([[[5, 78, 2, 34, 0],
    ! O" Y0 \* T2 V$ w9 H               [6, 79, 3, 35, 1],. \/ @$ B% s* p0 f
                   [7, 80, 4, 36, 2]],  J. Z+ F2 M3 q! T# N2 v) y" I4 h
                  [[5, 78, 2, 34, 0],. N* g& z) V# u5 H0 Q, e2 u( W
                   [6, 79, 3, 35, 1],
    5 f& J1 W2 d: q; |% T7 ~: j6 e               [7, 80, 4, 36, 2]],
    ( `( s3 V) J2 P9 _, C( V              [[5, 78, 2, 34, 0],3 Q* H- ?. d# C
                   [6, 79, 3, 35, 1],  L8 q4 Y, P) j
                   [7, 80, 4, 36, 2]]])
    * B6 i# Q9 U& i: j, vx.ndim" r# `" H2 E9 n& _
    1% e1 k8 f6 m, o# |! x6 X, u6 L
    2/ e; O4 \5 l4 X. {
    3
    9 f. y3 h5 M9 _( V- X5 W% h4
    % _5 H8 |7 o$ N  z9 j5
    3 c0 \. t* q% b/ P( u1 l$ A6
    & _5 `3 a3 y: b) O) J- J7) s) d# N* x. Y9 P0 {
    80 M/ \, w' o9 a+ N
    9
    , N( R+ e) E4 X" w7 `# T103 V; r; r. q' W. H
    输出:1 G* e  ~0 m* k9 {6 Z
    % [+ P) z8 E% u( L
    3  f+ _# X7 {; [
    1+ w( d5 \4 o, ?. c
    深度学习里,我们一般就用0~4阶的张量。
    2 [& U/ f2 y$ H  P6 D  |; |/ E& l
      o9 V5 r" ~( j% c6 m( x) [张量的三要素3 r9 U% f) y' r- S" c
    0 f1 [7 Z, {' ^  n8 a
    阶数(轴的个数):3,5,…6 u, q4 `1 q( ?; o3 Y" x$ v. o) Z+ ]. k
    形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…/ |9 ]0 c, h' ~8 R0 o. _
    数据类型:float32,uint8,…
    ! L  V0 R" `7 p* n4 F0 N我们来看看 MNIST 里的张量数据:
    # A. A1 Q( ^; x2 D5 E
    + N* t4 q2 r, `from tensorflow.keras.datasets import mnist
    & c: D) Y* Z" [2 ~8 s(train_images, train_labels), (test_images, test_labels) = mnist.load_data(), _0 ~5 ]( A5 J5 ~: w/ V
    6 L; `5 x/ a) j/ ~/ B, D
    print(train_images.ndim)
    ( i1 S3 n$ c0 g# |" m- o! ]print(train_images.shape)- R- X1 q  T! [' `0 G# m& A1 L# ^
    print(train_images.dtype)
    ) W8 z& X3 y8 o- v$ v/ J12 g0 K$ p% [% S' P2 W
    2
    : Y) b" N4 U2 L0 p# ]. x* v37 I5 E/ s1 P, W9 k1 n
    4
    . i0 F4 p$ ~. }2 u; v54 w6 N9 o* |7 {& ~& i' c. |
    6
    ( L4 Z( k. Y0 _" ?& q5 v1 z  U输出:
    " X% g" E* S! m  S7 v1 y& ]; ~9 k: r2 ^3 v. m, P9 i+ r
    3
    0 K+ F* l0 \6 t9 t: V( Y9 x! Q(60000, 28, 28)
    ) n; J8 U9 m: o* euint8
    & m) _; d9 t  v# V) j1
    # W' c. w$ }+ H' F+ z* b4 Q$ ^8 N( w, p2
    6 z: E+ u% Q" [" G$ c4 V+ o7 u: {35 z* S7 p2 P: S9 p
    所以 train_images 是个8位无符号整数的3阶张量。
    . @) [2 c& h2 U1 L% u& u4 Q7 a6 N) N* o" ^3 X
    打印个里面的图片看看:, c. e0 W7 y, c3 i, e

    / M0 k7 j9 F  t. }. _1 N5 ~digit = train_images[0]
    " R2 o/ g( @( C; Q5 Z$ z- k- g# a* ~5 a; M* |& j
    import matplotlib.pyplot as plt9 N  U: N) T( _0 [7 J

    6 O/ T7 o7 n# z. t: k: bprint("image:")) Z. x9 m* q( g# T) y3 x; q! w; E$ }
    plt.imshow(digit, cmap=plt.cm.binary)7 p4 E7 I, u7 Z+ P+ S
    plt.show()5 ~) j1 W! u8 `/ W( H! m
    print("label: ", train_labels[0])# T7 j) p, O; I& ^: K
    1
    7 B+ ^" I, o) ~: J$ I2
    7 ?) D) F% n) i0 i9 q3
    $ C1 o& l+ x  C2 v3 P4  J1 y7 @* r: c1 w( r4 F& q, |
    5
    6 ^7 ], y! J  g& v63 o: x# H  g- @5 u/ y7 T' h
    7
    6 m4 j5 z7 F3 `8
    , Z# i, ]& A9 }: k3 P. I! B输出:$ `( h2 L  C, H( Q
    % O, S- c" d; X' r+ z% G, \( X3 B/ U
    1.jpg 9 a5 o: H( O% J4 Y' J! K5 i$ l8 H* F
    % P: o$ V5 L4 x2 z
    label:  5
    9 O6 R  T* \' D4 F3 J1
    2 O2 j& U9 V7 R$ vNumpy张量操作
    % ]  q" ?- b6 ~7 U
    9 z+ n# p) G) T张量切片:$ t# N/ t/ b, p8 H( B9 A; {
      T) S$ N8 e2 q- B2 J5 c
    my_slice = train_images[10:100]
    1 v) k9 X$ A! m0 d6 Tprint(my_slice.shape)( [& C9 f/ V! m/ J2 J' x0 t
    1
    3 r- D8 l7 A# K- W, Z2. f- F7 [7 g5 n5 t' T3 I2 ]( U* v7 o
    输出:
    2 ^8 a/ v5 \' T6 J. P- j3 ~ 2.jpg
    " n1 @% M" E; p$ ^9 m7 x* ~1 X' l(90, 28, 28)
    / T( C- t6 C: q; B0 o: {  f16 }3 d2 A5 O$ A6 A, J
    等价于:5 ~/ S- v: t& D1 \0 `) {: E
    2 j9 J# n" C8 i' j& K
    my_slice = train_images[10:100, :, :]. i/ p4 v& `- Z  _' U- f6 |' s
    print(my_slice.shape)" C" y  c# X2 \) B
    12 o2 p9 _3 [! P' i' O
    2' o& b* k6 B5 V: O& B
    输出:% d8 i3 r. F$ b8 F. o1 q
    3.jpg " _. J' x' S6 F8 U+ ]$ c$ T
    (90, 28, 28)
    2 \% C2 F+ M9 c% Y1* x& x" C% s. ^% v+ o, d' v5 t; h
    也等价于
    $ K# Y( L% p1 G. e) H. S6 {, {8 ]% i4 w7 g
    my_slice = train_images[10:100, 0:28, 0:28]% W( P" C7 F) f0 Z7 l/ u4 ~
    print(my_slice.shape), u3 J: C7 X. X6 h
    19 v0 [; j  i/ i
    2* y) S2 S# q* G% G: }
    输出:+ R" {$ `5 q$ ^$ g5 J. g* M
    & q  H: k! V; ?6 M5 o) I0 O1 h. W
    (90, 28, 28)2 m; I$ f1 k5 D" U( t( v( X6 I
    1/ I5 N+ M" a  u0 j1 v, S$ M
    选出 右下角 14x14 的:
    3 Z* g+ R; \# C5 ~0 g% Z* K% d3 R
    0 ]$ f6 W, Z- @1 k; H0 g5 z' xmy_slice = train_images[:, 14:, 14:]
    8 e8 f2 c# J' u" n/ m* p7 ]% dplt.imshow(my_slice[0], cmap=plt.cm.binary)& ?( ^$ E% N/ R1 v. i
    plt.show()
    0 i% U9 e+ B5 p# ]1
    * o$ i% n' X/ z: k( G. ]/ q2
    ; S2 w1 v, F: n3 t3
      p. {* j- U/ A  q" H" m输出:% m: H) }1 j; N6 |" H0 H( z

    6 ^/ v/ {  U0 N6 Q6 s# g% S% k/ [( [0 |. W. {& q# B9 o
    ( d$ T# Y* X  R0 a5 r
    选出 中心处 14x14 的:" K$ H$ q7 W2 h: x8 l% h

    6 z7 u' W! u  jmy_slice = train_images[:, 7:-7, 7:-7]
    1 o2 a7 T. {' O; ?  r; _; zplt.imshow(my_slice[0], cmap=plt.cm.binary)
    5 o; Z8 I& K; vplt.show()
    ) z* l- V  x9 u8 Z! \: n11 e. O* a) |* o% E
    2& v8 e( W) J. C
    3
    5 c2 v( O# {$ _' C) ?输出:
    * \9 g! l2 }; {# W5 B0 {6 {1 c  z( _3 G  m3 W( L7 K* a% h+ K
    & f' ]' `0 o* A6 F% S

    : z2 C2 r7 L3 g' H+ m数据批量
    ! v5 q+ m7 S+ \2 R5 p3 ^, n- @. w7 c- ~& V3 x) S: j3 v
    深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。$ F7 r' Z5 v# d8 j, q# O
    ; a0 O6 z6 j6 C% g
    深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。  X/ B! F6 w+ t0 t! j$ q
    ! y, b4 b2 j3 P6 r8 }, U
    在 MNIST 中,我们的一个批量是 128 个数据:: C% a# L  r' f# C/ k/ }
    / a& j7 T8 x: O- s
    # 第一批
    9 @2 b: _1 M& p- d8 C6 U% _batch = train_images[:128]3 n1 z, a4 Z  ?( `# x7 C/ A
    # 第二批1 y/ [0 m$ o: C5 ^( `* v9 \: y. L
    batch = train_images[128:256]
    . h3 w" w* `5 H- w/ L# 第n批, `3 H2 P0 w* f5 t" a& T( [
    n = 12
    6 i1 L, x1 ^0 [5 D. P3 d" zbatch = train_images[128 * n : 128 * (n+1)]7 Z/ z! R  p3 W- j' D6 R  K% C
    17 \6 E9 r2 p. m( j+ n* n  q
    2+ W& I' n0 g4 ?/ w: [  [
    3
    0 T1 x% [0 Y0 a, v/ J  J4( H2 l  ]* N! P/ O# d. P, U
    5
    % z* U- A( C/ n( [6
      T9 \9 f  F; U6 ]3 w9 q( {7 h' ]75 C& ~5 j% c' Y, e
    所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。
    * V" S5 w9 O- d- }/ m& n% w4 v8 F, P: v2 x0 e6 ]+ I" q! F, P9 P
    常见数据张量表示- h$ P- l: o' ^9 Z& ^% }

    - L/ v1 k9 |) \9 w数据
    8 p4 y/ W9 R* |* t1 U) j
    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-18 07:11 , Processed in 0.399124 second(s), 61 queries .

    回顶部