QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6511|回复: 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
    : e$ D: E; V1 i7 c' `; T
    Python深度学习之初窥神经网络4 i- W3 J- j: e# U1 j. s
    本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。
    & m7 P1 z$ l; ~- l' G' t& x8 ^+ B# X6 d
    本文目录:* n- E9 q4 s3 c

    ' Z7 Q3 b! T: `: p/ {文章目录2 A+ P  W! e, I/ @  s
    ( k) X: T' a( d. d9 Y
    Deep Learning with Python& I6 Y$ n7 b; v
    初窥神经网络: O& A, l4 m. s! T, {6 O3 [  _
    导入MNIST数据集, f. s/ J  A" K$ e, {
    网络构建0 O; @; I7 w. e7 @( ~6 V+ K0 a1 F
    编译
    0 Y1 |( S9 \' r5 B* \3 U  \$ E预处理3 M, |4 a) X( R7 B
    图形处理9 G& ~3 w9 O) e
    标签处理2 ?5 u! z6 e% B7 {3 B, Y
    训练网络' B# z9 h: H3 ?% `
    神经网络的数据表示
    - N9 @/ u- I3 _% g* f认识张量. x& s: u3 ]: _) M# `& L
    标量 (0D Tensors)* F# T$ @; y9 j( D. ^9 b
    向量 (1D Tensors). L1 ?/ ?8 o5 N; a0 H$ k
    矩阵 (2D Tensors)
    2 D! t5 {/ u8 _' H* ]& H高阶张量
    , a- D1 x0 F* ^, i张量的三要素  T0 t4 l7 I: E; j" q+ \
    Numpy张量操作
    + y2 c$ m# h5 u* |# ?! U; o9 M) d6 ?张量切片:
    $ b) t$ l1 Q, l# {) C8 [数据批量& d  ^1 _- c3 R+ C& Z
    常见数据张量表示4 e5 u+ Y& O) s6 Y8 x9 i9 _; x
    神经网络的“齿轮”: 张量运算
    8 U6 x9 \) q; W( I. P逐元素操作(Element-wise)
    7 S" O& i: K* C  e4 l7 r广播(Broadcasting)
    & L9 I2 ]4 x2 F% F) ]' R1 e% T张量点积(dot)
    , m( Z" Z6 l% p张量变形(reshaping)
    6 H! Q/ }9 {1 r8 M- q神经网络的“引擎”: 基于梯度的优化
    : q: T$ r) l" Q) A, ]2 t0 v导数(derivative)
    8 p# H3 s! j$ \! Q9 }9 k9 t梯度(gradient)
    ' g6 i/ L! F+ f, \: c. [0 X4 r随机梯度下降(Stochastic gradient descent): T( g; w2 J$ |( o: H! w
    反向传播算法:链式求导* p( {, u1 Q9 o: {: a- S1 ^
    本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。
    9 l' o& ]* I) Q4 Q8 F! g& B  h6 S3 \0 `
    初窥神经网络3 q9 c" P* R/ }$ m4 R5 M
    & U8 \2 w5 `. t! b4 M& Y
    学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。* n/ Q2 L/ j( p5 G3 F9 }( s+ U+ q
    $ W, b/ N  z6 s
    MNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。
    " H8 C6 Y+ J' o+ w
      Q. B. s/ P* G# \0 h6 s导入MNIST数据集' M2 Y  o1 v( S9 p# k+ T

    0 e6 V) _" Z, |9 {' Z6 Y# Loading the MNIST dataset in Keras
    5 u: v& T5 n+ Q2 e- |from tensorflow.keras.datasets import mnist
    ( g% F: o+ X5 R+ j& W! P5 H3 N(train_images, train_labels), (test_images, test_labels) = mnist.load_data()4 X+ h$ A& D4 P  h- a! p8 L) s" {
    1+ ]  W+ Z3 r% B) Q- `& k' }0 Q8 c
    2
    ( z! c* D% a0 h: l( i3
    0 @3 T. D/ g% Q3 ^- W+ ^, B看一下训练集:
    7 g! O* w# J' @; X- Z  ^
    % y8 K, o! S* A2 ^6 uprint(train_images.shape)
    ' i( V8 R' f) R1 Aprint(train_labels.shape)
      K* ]: G& I7 z3 {train_labels, D2 B% j% |& r* n/ V4 h
    1
    * b( a0 j5 y0 \4 h2
    $ v) A! q' C) A# o: y, ?; k3& _. s- n/ R, c: b% r; \
    输出:, l. ], A8 d  r! V3 b; X1 P& T' H% f

    : ]) q9 [, {8 Q2 M, ^4 {' [(60000, 28, 28)8 V* I* k3 W* f7 r3 p0 X) M6 N
    (60000,)" M6 s( ^7 u  v0 V
    " P6 X( r- [  \; M! H6 e7 Q4 y5 j
    array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
    % N1 G9 U8 \- \1! U& f. w1 \7 _. }" B6 e! Z* p6 M
    2
    . Z/ j2 v5 e0 [9 s& n35 F$ u6 o- r/ i" z: x, a! x
    4
    # x; w: J% i# h. D这是测试集:
    & u4 m7 A3 e+ N8 v; u/ i, J  P8 K& `/ [/ f
    print(test_images.shape)
    3 Y7 q, Q# k: ?8 yprint(test_labels.shape): S* a+ m3 Z  u+ k
    test_labels9 m  A, G! e+ C3 u, Y
    17 K1 P1 C# u1 R4 ]$ \
    2$ o0 V) s: m, D6 G9 _8 e/ J
    3
    - t, P$ }2 N/ V" E- Q, W输出:: A' V" R& D9 F* g* X$ J; f

    / A1 f8 p) y6 `+ a(10000, 28, 28)
    4 K9 D7 L% H  B5 M(10000,)& U7 b0 J# v0 Q5 d1 g+ [
    % c/ e9 y/ E/ r% x. Y2 p) A
    array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)/ I  }; H" b8 t* J4 J# W
    10 _. W: R5 g# K$ z7 m* Y0 r
    2
    . m7 T- W% N" D& \3: S; y$ v- w7 R$ M3 r
    4; d5 x8 n/ ^" ?, b2 m
    网络构建
    7 Z- e+ U4 j' P  g2 f, r8 o) p9 \; @' X$ w: t) C! @7 _0 L3 v2 N
    我们来构建一个用来学习 MNIST 集的神经网络:
    # E  P9 s+ m7 w3 T" X
    0 W- P; |' |: Z5 @2 E- _from tensorflow.keras import models
    9 |+ T- _/ o" nfrom tensorflow.keras import layers  p) k% a6 @! K+ V

    " |# O# `# k! f+ `  s* fnetwork = models.Sequential(); S' a- S6 ?4 ?9 L
    network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))
    , z) u+ U  y, E& jnetwork.add(layers.Dense(10, activation='softmax'))* P: ?5 a2 N* ^  W3 v; J2 \3 m
    1- f: {4 E/ s: P, B% i
    2
    , Q0 y$ T' X+ x+ q) L3# `. Z) W1 J# o! Q& F5 a; t# D) o
    41 }0 D5 b9 R3 X; C* m- U
    52 ~( t6 e; h0 v+ H- t
    6
    # g4 d: M3 t  Y$ Z神经网络是一个个「层」组成的。
    4 B" B/ y7 w* a' u+ R一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。
    6 c; c3 K. F1 R+ `
    + m7 \. R0 t* V5 o! r  P7 O/ T这样一系列的「层」组合起来,像流水线一样对数据进行处理。# C! s  C1 \7 D" H4 r4 x
    层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。
    7 w2 j' b' y% k5 H+ V' X+ v5 H0 Q8 h' d+ W8 s; R* c/ e, Y  X
    我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。
    6 A" R, X2 `  ]2 |: u4 |
    ( I( s4 }) O( F. w( r$ g% N* r/ o数据到了最后一层(第二层),是一个 10路 的 softmax 层。; \: _7 K! C. g" j6 A3 _
    这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。* E/ Y; U1 q: ^- }. T
    事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!( y  F5 r3 S. G9 _9 r8 b+ |
      U% h! z/ I% p: n* \6 x- V2 H
    编译
    # x1 x- {, D. @5 f5 v8 @1 |
    & q% U/ m6 q( {- {& K接下来,我们要 编译 这个网络,这个步骤需要给3个参数:. E5 t9 f" l9 H1 @; D1 D

    5 J$ e1 |# z5 N, K' e2 ^: s损失函数:评价你这网络表现的好不好的函数
    0 [! g( {! m8 w7 V- y9 x) q; T. V优化器:怎么更新(优化)你这个网络8 ]% ~3 I2 r$ {. E3 m, g; n9 l. p1 `
    训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度8 a% c' d2 u  q3 C0 o; F) O
    network.compile(loss="categorical_crossentropy",' `& X# u1 q+ \& S
                    optimizer='rmsprop',
    9 \3 R9 U7 K2 x                metrics=['accuracy'])
    1 ?5 _7 F) B6 U! I- o1
    # }6 k% R4 N6 L3 P" S# X& G$ T2
    3 G3 m7 ?" A, w3  h! Q1 d$ _2 }4 q# Y
    预处理8 ~  v8 z) t2 E# b! ?3 P

    , G& H7 q& L! l( J图形处理
    . M  ?- O6 t& p% i" ~8 `) D& Y. N9 b
    我们还需要处理一下图形数据,把它变成我们的网络认识的样子。  h$ p6 F6 m0 W; G- O- V1 Q

    / m! l. Y+ \. ]MNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。2 Z# |$ j' e7 e" S8 J' d: Z& {# L
    而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。
    # h; X/ i4 _3 C2 W# V
    4 ^7 c: c' l5 }7 C6 ]% C" Vtrain_images = train_images.reshape((60000, 28 * 28))5 _$ z, _/ I& ^
    train_images = train_images.astype('float32') / 2557 I4 M  B; J5 Y' H

    ( Y3 O7 @. V) r) F! k! a4 Vtest_images = test_images.reshape((10000, 28 * 28))
    0 b! F# J& C' H& [1 V2 Ntest_images = test_images.astype('float32') / 255
    ! M* B; U, G) R; I* N9 U12 o" ?8 `# q0 E5 s* p! g/ j
    2
    2 |4 X( P7 n5 N$ N+ y, h3# D; ?: i9 l/ h: ?
    4
    9 v& u0 F2 v/ m6 H6 E3 K! f7 k% }* ^7 x5. x# o1 T4 P5 b( v% E
    标签处理2 w; \. W$ _, P, H; r
    $ X$ x& A9 o' N& C8 u
    同样,标签也是需要处理一下的。
    ; U1 \5 O7 a# P, h9 t) \$ j( Y$ [+ q; _2 Y9 [. e
    from tensorflow.keras.utils import to_categorical( v: o2 E) W  g5 y$ Q
    % w- `# B8 F1 w6 ]
    train_labels = to_categorical(train_labels)' e. D* D  g; I* Z% w
    test_labels = to_categorical(test_labels)
      e: |7 h) v2 b1( S! y/ ?+ N5 d0 M' n
    2
    / k' t- I9 U, z* y+ G3
    + c0 Y; Z% s% f, w! H: D4
    ) V( D! k) i4 E训练网络5 H, ~' t5 ^8 T  Q

    ( A, ~8 q. k* i4 \0 ]/ {network.fit(train_images, train_labels, epochs=5, batch_size=128)
    + Y; X; ~5 I4 `( r( C* S1+ v, s: j% P& s8 R: v0 B4 d" P, _
    输出:0 I: u1 Q3 a+ l

    & Q7 j1 B) p- g( k3 r" ATrain on 60000 samples
    0 S$ P- \2 q4 ]* X% q. E  QEpoch 1/5
    - d: d; T( z% [! E2 t* B60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.92546 w7 |- f/ `: E  N
    Epoch 2/5
    2 P" u1 a4 _; Y& c* {' u/ C# K60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693
    & I5 z- \* B1 S. a* AEpoch 3/5
    * N2 D/ e& t. h& ^4 e0 j60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.98008 S3 _+ p  Z3 ^+ y9 B" y
    Epoch 4/50 s% o) W& v7 f/ P4 x. _
    60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848
    ' ~6 R( s/ L; C/ eEpoch 5/5+ U1 ]3 K! o7 o3 w8 M1 U
    60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888
    # @6 ~7 d, r) M5 I! G; K0 t9 U4 T$ M0 y- Q; j. h8 ~+ j" q
    <tensorflow.python.keras.callbacks.History at 0x13a7892d0>$ W* f5 k8 t7 w
    10 l2 I/ c: y- T7 X9 q8 {$ |% u+ w
    21 m3 O8 N) z- I/ h' B
    3# Q8 [* Q; Q- F3 }/ p
    4: }" V' n# C  d( B3 Z7 `: O
    5
    3 G7 K( D! i( x% S6 m1 Z6
    / F" r' I& k" ]7
    . C. {! m! B6 q4 Q- o# v9 A8
    8 F$ [' Q+ Y- b2 e) D9 i9
    % V; B" L0 K" A4 Y! I10! j0 ~8 P2 S' Y" x; S0 S
    11
    * D7 J! w! y) p  ]- J12- k+ e( F0 l" X  y( W- e0 s
    13
    ( R8 D7 E8 a, X. b可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。" T& R9 I4 S8 z& Y- o7 y

    " L- q2 q: z/ s7 o& p再用测试集去试试:
    5 U9 _2 ^6 b9 ?( n7 @; F
    , N$ K5 ~" }7 z4 V8 U3 t7 P% @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
    " D8 `3 y3 [4 R+ `) A) wprint('test_acc:', test_acc)1 }, q( ~- w: e1 o6 V
    1, K7 m/ y0 K, w; m! K# c
    2
    " h, y2 K" a# ^1 U输出:
    + |- @, `3 m+ E( P3 Z- d8 T! ~/ E7 T2 q4 \( u+ G4 f, Z9 S
    10000/1 - 0s - loss: 0.0362 - accuracy: 0.97898 P# r- M  n6 v& {7 s
    test_acc: 0.97892 L2 s3 c- w/ S
    1
    8 y: X( |, o  T% f" g2
    , Y! H' K5 m% c* x0 `( f7 c我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。
    # \! k" v, F5 {
    7 N' X' v. I$ r# Z& k# }神经网络的数据表示
    0 F& x9 {& J  }: h# O& a/ F$ w
    6 a8 C8 Q7 U5 o/ ]4 _& a4 G" `. iTensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。/ I9 h# d" K- y6 H# l0 t4 J' q
    5 A5 w5 E: S- m* r! L
    我们常把「张量的维度」说成「轴」。" w: ]2 F, g8 o" n7 Z

    0 Y+ O. ?6 D% H0 @+ H认识张量
    ( \$ t3 {9 N5 [' D0 P5 ]& F& t' I8 m" d: ~8 S4 h- \
    标量 (0D Tensors)3 W2 @3 i( k& x4 N- I$ z& o$ F

    2 r8 F# y7 F' }" }Scalars,标量是 0 维的张量(0个轴),包含一个数。  m" S( s0 ]6 N& b

      L% g9 D0 J  m标量在 numpy 中可以用 float32 或 float64 表示。0 a' ^# q* ~' I

    ! j& a) m( H$ Eimport numpy as np
    1 I% p0 \5 {, j: v8 D: \/ ?$ _; j$ }" [, }% x8 x9 l+ N/ h: X
    x = np.array(12)
    8 H4 P' A! C5 {* jx. M* p1 b; U& E1 h- A9 v, [
    1( |  b! v. R$ e' n
    27 y; M: {0 Z* W3 F, k' A( A
    3
    ( o* r7 Y1 o( u1 R) v4" e6 B* c% i. j' @+ D( F& j' b
    输出:3 r5 }$ M/ z4 h& ^
    : z. G8 m# u, S& M1 [
    array(12). Q7 {1 e# {$ I
    1
    6 W: i! B/ C2 t1 V& ]- B  lx.ndim    # 轴数(维数)* Y; }) s; N( v9 J2 C7 ]
    19 x3 C/ l2 {, \, u' \, P5 o
    输出:
    ' C) n7 u* {: z7 e' s2 f7 ]- W! j0 Q; |: }
    1/ z- W4 ?) i0 r
    1. T8 h2 ]. X7 m* H* d
    向量 (1D Tensors)5 v& k  K0 \# y. u
    * i# [4 h9 I, Z) z1 i  N; Z4 c
    Vectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。
    ( L$ \  F& M7 H) |# L0 |+ X8 P/ u) C6 i
    x = np.array([1, 2, 3, 4, 5])
    , J! b* x# P3 V/ k" T/ Jx8 L7 u6 `# o0 n" ~# i, c8 p
    1
    ! Q, X! C( A4 J2: b9 x/ X! d9 v- F* y; K
    输出:
    ( x" A7 _2 W" H' t3 N" S% ?
    - ]: K; B! E  o5 Y* Marray([1, 2, 3, 4, 5])
    + I$ n+ z8 E$ A0 T  r3 x6 D8 g/ \1
    $ m6 T+ B, i  r! C3 s& d2 Tx.ndim
    " S+ i4 q9 \$ Q3 ?; f4 H7 k. A13 Y* Q2 Q' d( s- }4 ~; E; O2 g) _+ H, U
    输出:4 z) z6 J" ]" l! V* t7 m# h
    ! g" N2 }  Z) S6 N, @' [- A
    1# C/ Y9 K9 c; T+ `, ]$ [
    1
    4 b6 H; F7 M" z& J- j+ {我们把这样有5个元素的向量叫做“5维向量”。
    ) m, m) _: }* g* G" D但注意5D向量可不是5D张量!
    . A1 u, f, R0 v) L" s- b- X0 m' \0 L" }  m: v" r8 Q8 F
    5D向量:只有1个轴,在这个轴上有5个维度。/ ~0 @& m/ g7 ]4 ?1 |, X& l- p2 T
    5D张量:有5个轴,在每个轴上可以有任意维度。' S4 X7 O2 P  }9 _
    这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。
    ) [2 T) P  F$ [( \' z. }
    ( V- @+ C* |, R# O6 M& b所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。
    8 k, `. R' j3 C4 z
      c) ^. ?& w3 x0 [5 \. W矩阵 (2D Tensors)
    $ _% ?) ~2 T* t5 M$ v4 D# c: M  ~
    Matrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。" S; Z8 E! H& i- W$ w
    7 F& }6 o  v. F! H4 J, @$ M- J
    x = np.array([[5, 78, 2, 34, 0],
    8 i! h( j2 g6 E7 ]& |7 c              [6, 79, 3, 35, 1],
    0 ^0 @$ T) m3 y              [7, 80, 4, 36, 2]])
    9 q! Z# {) Y  L) A6 A& z: R( e# }x
    $ T$ t: g8 f! ~  i1% n! B& f8 e8 Z- v  t' [
    2
      g4 y( O- b* `7 C& C4 t' R3
    " M6 f1 q8 H6 r4 J& _" J4
    " ^2 ^) C# f' l* J. ?! C2 I输出:/ o9 f/ S* _: j9 P4 u

    / R7 p5 w, b6 V* G& Harray([[ 5, 78,  2, 34,  0],1 k1 G5 H: e8 q
           [ 6, 79,  3, 35,  1],
    , ?  G+ ?- N! A5 P       [ 7, 80,  4, 36,  2]])
    ; |0 a, \+ \% W" \1
    5 @* r3 n2 A4 m+ Z  K( _2! ~8 z7 Y; \9 o, ~, l5 d
    3
    8 ^+ J" Q1 V. Y- @. ax.ndim
    " P. Z1 q; m' X! k! |5 v' |$ _18 t+ P! S0 H' o; v' p- j) t3 H( p
    输出:3 ?# x& r1 a4 M$ W7 A

    2 _2 w9 W6 |1 U3 n2$ n7 B: r  `* q7 q
    18 }/ X) n) C3 e4 D6 d! e
    高阶张量
    6 d8 v& n" T! {3 \3 _0 W; Z1 D' r3 C; Z) U9 T, r& j3 [2 H
    你搞个装矩阵的 array 就得到了3阶张量。2 M' |  |' Z/ `2 A

    ; s( p$ N  H: z  S, q: \再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。& U0 P: q7 G# V  \

    0 v" c; t1 M9 O2 l1 \4 Q# p6 a4 Yx = np.array([[[5, 78, 2, 34, 0],
    ! T2 M% o! _0 S0 n- Z+ P6 f; \               [6, 79, 3, 35, 1],
    , ]1 p9 s! B( y               [7, 80, 4, 36, 2]],3 ]5 t1 s" q0 f8 L' b
                  [[5, 78, 2, 34, 0],/ F  p4 i  n) J' i' S0 W
                   [6, 79, 3, 35, 1],/ l9 Q+ k0 x5 }8 k3 v
                   [7, 80, 4, 36, 2]],: U& m/ s- N5 @, Z) r# g4 f
                  [[5, 78, 2, 34, 0],
    ) W8 {! w$ `$ X, t- L               [6, 79, 3, 35, 1],4 z4 H- d1 g+ S" X4 `" S6 _$ t
                   [7, 80, 4, 36, 2]]])
    " C" k- U5 x. k) F( u6 J6 d( Qx.ndim$ n9 c9 [- e; T/ Q
    1( G* b' Z0 t1 Z# B2 t$ q! S1 a
    2
    : X- p5 M  i; u# M# t3% X" \" M3 q1 V5 U4 Y' G1 ?
    4
    0 l0 J; [! c, x7 r& }53 F5 Q, f8 r; U+ D$ t
    6
    * G# E+ q, ]8 o3 B7- |$ R/ t9 u5 J0 Q* o
    84 h7 w9 y+ k9 h, s
    99 o" x* ]+ I" k: h8 {. j+ @
    10. e, G; X% Q& k8 l
    输出:, Y& j# {6 K6 a) |

    , g/ _' J3 Z* s8 g* p! ], s3  V( Q4 D9 w- P( A
    1, l+ t4 ~3 P# D" F! T- H
    深度学习里,我们一般就用0~4阶的张量。* g' F, `$ D1 T( P

    , Y3 Y, Q9 ?2 k张量的三要素" @  J. J+ d5 P

    / Z' P; _3 V, h阶数(轴的个数):3,5,…) i: P6 I; T2 n8 ^; i) f3 ~+ r4 N
    形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…. t* p. n' A) {% ]) n9 o- r
    数据类型:float32,uint8,…
    + \$ C4 {* o# o  v我们来看看 MNIST 里的张量数据:
      `3 v. D3 R) \& F
    2 t  M: r# W/ S  wfrom tensorflow.keras.datasets import mnist  k# ^3 }8 J9 g
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data()
    ) I+ v" F) V0 W/ o! ]2 j$ z. X4 i3 X- N3 _
    print(train_images.ndim): Z9 x( U( R$ Z9 }4 O
    print(train_images.shape)
    2 Z4 O' P8 ^# f* w" q: tprint(train_images.dtype)+ t5 h) S  ~' D# a/ _" c, J
    1
    ( w, s, s6 m2 R$ p; q& g7 s2
    + e! X+ K) G  }+ D- M) g3( k+ N/ k( Q$ u$ M, C
    4
    2 P2 i1 P3 n( M, o6 J! }2 o5) G6 V4 A1 r5 I# N/ F/ `
    6* I6 N) e5 ?) H% ^* R/ |# w
    输出:! s+ X" j" A7 R, M

    , n- F5 q5 A! }( _4 }3
    - x7 h6 G4 t0 D- G3 V! O) g3 {(60000, 28, 28)
    7 k- l7 q% C/ M9 i3 g# Muint8
    ! g% e' {+ l9 @1$ O9 ]0 z  H- b1 d8 G
    2
    2 e5 L$ x; ?' U3' M$ q8 n! }2 e7 p: K! ]
    所以 train_images 是个8位无符号整数的3阶张量。! l+ B! [; @* O6 O; B
    9 U& J; F* g% r7 I) |; G5 l
    打印个里面的图片看看:* Q. [$ V! |. I0 S/ H8 ]8 U9 \
    + U  l( }* [' W8 }8 ^
    digit = train_images[0]
    5 o$ b7 B  Q! p+ t) M$ ?4 p, J$ W1 g# i/ j+ G
    import matplotlib.pyplot as plt
    4 y# ]" B& t# B/ `+ ^4 t4 n& x
    $ m3 G7 x" f! T- M% F5 _% Cprint("image:")
    ' G% K# x8 C! x4 Cplt.imshow(digit, cmap=plt.cm.binary)6 J% U1 Z3 L3 C0 n+ C. e
    plt.show()
    . i6 q5 C6 d: s3 ~4 E5 Y1 hprint("label: ", train_labels[0])
    8 P" j; w9 b/ |; @+ \: O, X. V1: @9 S2 p9 F' L8 `, c5 ]/ C
    2
    . i7 L/ K5 X, C; _3
    & b) U7 l+ p9 w# b4$ U- d/ s4 F2 H; L2 b/ w
    5
    2 l% `' {# T2 G8 _: r9 _65 H( i1 M7 X% e  x; q) l
    7# G! n, |7 ^) J- i0 ?( j
    8. ~9 C; n* A1 i  m
    输出:$ w: E" ^; ^$ ]1 L

    4 }4 Z# S6 ^/ M 1.jpg 2 z5 Z: c/ p* i8 B6 H( j7 {1 c0 O! Q/ ^

    ( }. }2 p6 n; j! r2 ?label:  5$ L( o. w% Q5 b  n' i
    1
    8 f# H) F. V' uNumpy张量操作
    % f5 {* b. `5 b8 A& s' w/ r( Y6 M4 X9 O9 j
    张量切片:
    3 s' T$ E& X% A/ @8 j, \3 p5 u4 E1 }! d; h
    my_slice = train_images[10:100]# m6 X4 S. B/ A1 j; E  A
    print(my_slice.shape)6 k1 N; O3 n* i
    1% A2 [8 p6 O* n& b) l! o( x" o0 v- B& {
    29 g# }5 @( c/ J. o' v
    输出:
    - n: W. i, y+ u$ E; p 2.jpg
    ) r) `0 @3 a/ z6 n(90, 28, 28)
    , W. i" a6 e* w  ~; Y13 V1 O3 }% ^" Y, O  {
    等价于:
    . \4 N4 g0 v+ L4 d
    * s! `/ M# `( m1 G3 J0 Wmy_slice = train_images[10:100, :, :]" ~& X3 V( c7 I0 `
    print(my_slice.shape)
    5 V" t# f; u6 q. Y12 L8 x$ y1 P8 m: B
    28 J# i/ a9 H5 K% Y9 r
    输出:
    ! z; ^3 X: i' N, ]; D 3.jpg
    ; X  Z+ |0 ]( \* t( j& \3 ~(90, 28, 28)
    / q4 w4 F$ @* W4 d1( B5 V2 B: ~( n- i- u0 f6 I
    也等价于
    - ^6 ?4 ?; J. i, q1 ?' o* L. T
    7 u" y1 E7 t! @' s. Imy_slice = train_images[10:100, 0:28, 0:28]$ [$ Q0 {5 A' ?7 W
    print(my_slice.shape)  R- H" {4 D; i0 b" V, k
    10 c2 s# V9 _5 K. h1 K, q
    2
    " l* B- f( ]& W5 X输出:. B. A0 d2 h3 T1 S" k+ q

    - O8 X( o. T7 A' d% `5 e(90, 28, 28)
    , D# G9 N  @$ O12 [7 t3 {' N3 Y( \4 W6 P
    选出 右下角 14x14 的:% s( P5 ^) V0 w

    3 ~: ~6 B6 R6 p( a" _my_slice = train_images[:, 14:, 14:]
    ' c' ?' @0 @6 k" Lplt.imshow(my_slice[0], cmap=plt.cm.binary)
    , {6 ^* c8 w7 O. A7 ?plt.show()
    ! {4 E  v& x7 s( l1! F2 [& K6 J* n* ?9 s- }! I. R
    2
    9 l, b( i( a  I: i3
    2 k: r# E: b/ p! v* j0 R, R输出:4 \# e* O- V8 T  O' }
    5 g# V) Y. S2 j( n2 F$ q; t
    4 S- K6 u; }' h2 E5 e3 }3 b% k# l

    % \. ]! S7 O$ Q# o: b选出 中心处 14x14 的:
    ) ]' r* Y/ c6 Q/ Z# c* D
    3 {- b; y( c( u* j+ Xmy_slice = train_images[:, 7:-7, 7:-7]
    # }2 K: M& w+ h% {plt.imshow(my_slice[0], cmap=plt.cm.binary)
    % W6 _) f; G$ T. F5 Pplt.show()$ b: D' m" L3 u% K. J8 E7 i! [
    13 `  H: D: C5 P
    21 \+ N; d2 G1 h9 Z" H6 L
    3
    * g( {' A# v( ~3 O) @输出:$ w6 h, `+ i" ~# t$ }! ?9 d& B
    ; C4 @7 h0 y/ ^, k; s8 |: [  z4 O: V

    % K" g- x3 r$ r! r+ N
    ( O- g) O4 H- m( J, ?数据批量
    ( u* L* t9 q+ \4 F6 w- ?( m
    # X/ @9 \( S6 k& ]深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。  `4 q. R+ b' s) E
    - {7 g8 X4 B3 s# Y6 o$ |% H/ c
    深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。1 z/ e0 w- ?0 O/ s9 U
    7 E7 r" G4 |7 x' h. K# w& k) c' b
    在 MNIST 中,我们的一个批量是 128 个数据:8 Q9 [4 N. K* z& l& s4 c; j

    . O) b0 ^$ w6 k; [7 X5 ]% X& r# 第一批
    2 z2 O5 }  A1 o0 i$ S2 Hbatch = train_images[:128]$ P2 ?% ]4 u" H+ x% ~& m
    # 第二批$ z0 m' P2 A( y7 P  G* {
    batch = train_images[128:256]
    , ^* P2 N; M! @4 T# 第n批! w9 G: s4 D0 s# ]- s& J* O3 W
    n = 12
    , S  v! W, Y, N& _batch = train_images[128 * n : 128 * (n+1)]
    ( E; k1 h# B) e4 V1) H2 j0 l) T/ [/ C. J8 c
    2
    & f' D: S$ p0 h) n# w; _8 G. `. c3
    % \: K- z7 d& s0 Z# z+ e5 `  v4
    # w) Y+ R3 u7 ]6 o7 g53 T5 g+ ]1 _% d( I  p/ S
    6
    9 n8 w8 I4 a0 N9 I. j5 _0 g7) F- C1 W- c) t( F2 B5 _
    所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。. C! t; k; e- c3 ]

    & p8 |: l/ E1 r* a! J. }* n常见数据张量表示* @0 j+ z( }" ~$ E% G8 u) N* H
    2 a- }2 n# E7 P* S4 L
    数据  U0 }# t( F# a% ^! A  L
    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-20 22:23 , Processed in 0.412757 second(s), 58 queries .

    回顶部