QQ登录

只需要一步,快速开始

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

    + }& f8 U2 Q; C5 \+ APython深度学习之初窥神经网络& o9 C) B" R$ |, w" s0 C
    本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。3 U! u& J  w6 d5 Z: m/ s' P, f

    4 J9 I  q& p. W3 i1 g; Q+ R本文目录:
    . v7 j& X1 j' M4 Y2 f  a/ b& P6 J( V# s9 `/ R
    文章目录
    $ m8 V' g! R6 S# h# T4 q3 M
    4 p0 o' h; p; I# ADeep Learning with Python
    1 O/ }7 Z2 C6 N4 l/ R: D9 E初窥神经网络
    0 q& p2 t  i7 F6 q: K导入MNIST数据集; v" w+ d( ?; R/ R8 g7 w$ ~& W$ l
    网络构建
    + f% ~% m$ ?% \/ H/ R编译4 t: i' ], U/ G" i& U
    预处理  a* U2 K" _1 W$ A% J
    图形处理9 `" Q' {" `! K
    标签处理2 u1 [& H2 i: L2 o" e2 z0 m0 _3 d7 ?
    训练网络
    ' m9 q3 e: E/ o4 X神经网络的数据表示
    6 J5 P- s- G& ^9 a9 `认识张量
    0 r; O6 o6 N: M% b; j标量 (0D Tensors)
    ( Z+ r4 L6 K8 R' c向量 (1D Tensors)) I, N  _7 `- k) M7 Y
    矩阵 (2D Tensors)
    1 O. S- W$ b5 {; D" Q1 H高阶张量+ U" g4 }2 ^( a2 K; G
    张量的三要素
    , X* {9 g: w" S7 ]8 h: t/ }3 o  S  L. ~Numpy张量操作9 i, f* `# R  ]" o
    张量切片:
    , ~6 j& Q% b; G8 |! F数据批量
    ( y) z) A9 k1 v2 Y) |常见数据张量表示
    ' C3 U( }/ K) s" ]神经网络的“齿轮”: 张量运算, S# G  M) a8 h: M( E$ r$ o, |7 L
    逐元素操作(Element-wise)
    # Z7 j  Q) v- L. Z/ \0 T0 j广播(Broadcasting)' H! e$ E: _% P
    张量点积(dot)
    : B3 }+ D1 B( @% d张量变形(reshaping)
    8 I3 I* h: v! ?9 K# G+ S% m1 a神经网络的“引擎”: 基于梯度的优化% |  C( k% {6 ]0 Z
    导数(derivative)
    ! Z9 _9 V+ b0 G8 h2 d8 S梯度(gradient)
    1 \9 @" B3 D$ N9 C, N$ z随机梯度下降(Stochastic gradient descent)1 K( C" l* M% z8 {( Z) @4 Z0 |
    反向传播算法:链式求导
    : \2 @- _: T% D! B本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。. V) H8 t1 C7 R3 \; `  r2 F3 `' v
    ( ]# i' R5 B7 k5 H2 t# r$ f+ A! C
    初窥神经网络( {2 @2 S9 m/ C( ^& d) I

    6 q: j( D% R6 h学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。
    ) i- }' v  U1 o  p
    5 S& _3 `2 p& VMNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。
    5 i- e  l# b6 y) A5 w( Y. D0 V& }# e: F! k- T- Q
    导入MNIST数据集
    " }* S5 h2 o5 p/ R: F) q. s5 p$ Z8 W1 z9 r
    # Loading the MNIST dataset in Keras( U: ?& b8 i' K4 k
    from tensorflow.keras.datasets import mnist, Z- q- L; V, D
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data()
    0 {" e' U8 V7 X# F  Z+ e1 n12 Q! _* c" n& D- q; n
    2
    ( g! p0 h" L2 J: K3
    9 }* S) o$ P1 [* h! W看一下训练集:6 }8 W% y7 K6 m1 D% y) g& Q
    ; `0 j3 Z3 V# s3 l. `5 T
    print(train_images.shape)
    : ]/ R' m' j4 f1 C4 w. Fprint(train_labels.shape)
    ; S6 Z* F5 U7 O1 d4 z# M, Ctrain_labels
    - h: i6 |+ |1 c, C* B4 D2 B) H1
    4 r2 z$ F  t: Q5 B29 z* \4 U# h" m7 ]
    3% D; X5 k& _/ A3 o0 {0 K* B/ S
    输出:
    / i, E5 O$ c6 y! s3 l
    : K, Z5 p" g# o/ l) `(60000, 28, 28)1 ]: I1 {- Y. s( `& o4 q
    (60000,): s( D$ P8 h4 o* g# L- [

    4 C6 r1 Z6 ~# _0 c% \) j' darray([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
    ' }9 P( Q2 R, j- n1
    & D/ M4 l/ L, U- }4 S8 i25 V* N9 q3 M7 f
    3+ l: V3 A+ g1 [0 T- a9 r/ I0 e
    4$ e( A! G, Y# \! i) a
    这是测试集:8 P* L( v; [& h! Y& o* Y
    % c. v5 J% T0 }4 O! B. A
    print(test_images.shape)
    $ n& _) Y( H; o) N  tprint(test_labels.shape)% o- a  o; `1 a
    test_labels
    ( l8 q) S7 Z; N; x1 d1! \$ h- r7 t0 v6 V  i* E
    2
    : r' f/ G; o/ }' \* E33 f( y- c+ x9 k. R# G
    输出:: G9 Y" |1 p) c  n1 t, V

    # G- g" @5 u1 u* F/ _(10000, 28, 28)( _- h- P; T9 S) X
    (10000,)1 N# q6 g5 R: d4 N1 n! H: ?/ m6 B! M

    $ N8 \$ N# k) ^7 Y3 y! F. V3 t4 Barray([7, 2, 1, ..., 4, 5, 6], dtype=uint8)% K2 d% v# T+ B6 ?; t; x
    12 `, m) [/ n# F, r0 s7 l
    2* L2 H+ r4 G7 T' N
    33 ^# i/ O; D$ T/ X6 v5 `
    4% m- m$ F: m) f+ v0 L
    网络构建# \5 y2 w/ o* a) L

    " A( Q/ [2 H% A! p% y; i我们来构建一个用来学习 MNIST 集的神经网络:9 j: j; S% x5 w6 H: G
    8 t3 W9 a: A& U; s2 C
    from tensorflow.keras import models. K* l; [5 s) k* }+ s( l4 ^8 l  ^
    from tensorflow.keras import layers6 c- M! [8 t2 E* I% Y9 c+ H

    + H3 ~" I, j7 m  |+ Vnetwork = models.Sequential()# |' R1 p  T" {/ b8 v& c) ~8 ~
    network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))9 w1 G7 C& I+ g2 Y& o
    network.add(layers.Dense(10, activation='softmax'))8 g; A: i- u3 I" U0 ~/ b6 q
    1! C, G+ y: q$ g
    2
    ! L0 F4 C6 \1 u3/ ?* n7 r: J2 p  c
    4  M3 `: A* e) P) ^  Y$ x8 V
    5
    ! J- D4 d& g: y0 u  k( I5 b+ `6
    4 u* i- z2 S7 k$ t$ t神经网络是一个个「层」组成的。
    3 O9 d& S2 O- F8 X' M1 k一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。
    4 O7 t/ J" @. f/ F3 d$ O* b8 Y% y9 `2 f9 ~/ Z& h: g
    这样一系列的「层」组合起来,像流水线一样对数据进行处理。
    # A5 W5 D4 ^- ~) Z层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。
    ) `1 ]5 Y' {/ j7 P
    ; l) B; ^( L  l+ j. t- d我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。; [2 Y5 M, J1 z# b4 y$ a
    ; G7 I6 e, f6 r4 F4 |8 `
    数据到了最后一层(第二层),是一个 10路 的 softmax 层。
    7 Y6 Z* G- o1 b' \+ u3 y这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。- K) ^$ I6 m. I. d  P
    事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!1 }/ f' T! X7 `! R5 R) i; j  x

    ; R5 o( H; C# D- ?3 r编译
    $ r' U! \6 k/ T# }1 v- L: `. ]3 j
    接下来,我们要 编译 这个网络,这个步骤需要给3个参数:
    4 z1 b% X! E% {1 s9 K1 k$ I" N) F) t
    ( I! Q1 T4 m* V4 g: t8 z损失函数:评价你这网络表现的好不好的函数& l) k7 f0 ~$ [. l% n2 r
    优化器:怎么更新(优化)你这个网络
    ) y2 G% k' B1 ?% H4 p% T6 a. j. a训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度% ]8 ^% [( j; g; \6 }
    network.compile(loss="categorical_crossentropy",
    : c* L# p9 g8 ^9 `' P                optimizer='rmsprop',1 i+ ~5 o1 O: b: I; W# ?
                    metrics=['accuracy'])3 t  X! Z. M/ j5 r" n! ]
    1
    # Q  G# S% A8 A3 f# x( g' }' x2
    0 |: s4 z1 x  k1 P/ t3
    / {0 a1 a: i9 J% ~$ d预处理
    ) U* X1 Z; L) e9 O+ a, c: h' Q
    7 S: `% _; {5 Y+ B$ g2 B. ]图形处理* @% x8 |7 O" @( ~, L* E

    0 e' t1 k) c- Z$ U  ?我们还需要处理一下图形数据,把它变成我们的网络认识的样子。
    9 d! G8 Q  L) H' }  {: L! U3 G' Z- b5 ~- K
    MNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。
    5 p1 t; w$ `6 d  w  W而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。
    ( \5 s- n% I* h4 [& s2 h+ j- b* {4 [- \; d! Q
    train_images = train_images.reshape((60000, 28 * 28))
    6 I6 T; L9 ^0 C" {; c" j5 ~. |train_images = train_images.astype('float32') / 255( v( ~* H1 T4 a
    2 L' t/ ^) K2 w+ V) V1 _2 A5 ]" N
    test_images = test_images.reshape((10000, 28 * 28))
    8 T( @: v$ V7 z3 y7 S( r8 Ltest_images = test_images.astype('float32') / 255
      H$ L1 _* f6 k" a& C6 {4 L14 N$ l' l! L, ]
    2
    - A" a* b8 |/ ^+ x5 ~/ U! F38 D! k+ d* ~! I
    4
    # X( m- u: O$ V# b3 V( A5' E% S8 ^4 z6 A: x
    标签处理
    ( e" u/ K# F# d# I* J" O  X9 q$ S* H( t  V- }3 [
    同样,标签也是需要处理一下的。! o" O% ?* u+ J, J1 z* B

    , U! J6 J$ V0 L& R$ x$ w+ ~: pfrom tensorflow.keras.utils import to_categorical$ r9 ]0 Y0 E; ?( K' n
    & D& v6 i% Y& I! U: `( B
    train_labels = to_categorical(train_labels)
    3 y& |7 |; }7 n7 M2 k* Z- rtest_labels = to_categorical(test_labels)
    - ~0 Q9 v1 G1 u5 }# s3 F; o16 Y& q8 o/ p& Z$ A' q
    20 \  S3 u& Z0 \: L1 d
    3
    ; M) y9 q' n: g, I6 X4# [* K+ i% C* n/ `1 U& L& g5 y* y
    训练网络0 Q7 d4 r  t' ^& M+ z5 O* }

      I$ V& Q# l- C8 {4 knetwork.fit(train_images, train_labels, epochs=5, batch_size=128)
    - g+ t- x0 Y: H* L/ ^4 G/ I1
    3 h( @4 Y) ^- E# m输出:
    * c: A5 Z( I( p6 {/ j
    , X* u: G* b* a+ {9 HTrain on 60000 samples
    % }3 ]" k9 B' {4 {Epoch 1/5
    " W0 A) B# K/ r60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.92547 p2 }0 U& o. \( e2 m
    Epoch 2/5
    0 C/ i- c* |9 O, N2 B60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693; m/ V" Q! X. R% g8 p
    Epoch 3/5) C0 K. U/ N% e, ~; M
    60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800
    4 b; l0 P: k/ }2 wEpoch 4/55 z' H) c5 E; Q! A( C, K
    60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848  n5 H1 g' y/ W7 N! a
    Epoch 5/5" i7 T3 h9 p- ^! ~' J
    60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888
    : D, B5 |, z* }; b& u% j/ E. W$ s7 e4 c6 w' ^8 ~: U: R
    <tensorflow.python.keras.callbacks.History at 0x13a7892d0>
    ( S- v$ a+ M$ n- I1" Z* F. A+ `4 O& t$ H; [/ [
    2
    * ]+ I) s% T: B; c$ s) |3
    / e& _3 c, p$ d# [# O4
    0 F! a' b& s2 \& F( l+ E7 y5& J6 ]; P4 z, S, K3 s. v
    6
    / g+ B  ~  J; I7
    & l6 t4 p& M' g( V! E/ i8
    1 P0 P3 }. R) s" ]! @( c7 [94 V+ G' _" S# M9 _
    10
    / H" z: @5 l4 W. A' q11
    5 z5 @& D: n, \2 I, ?+ y5 W; n! X12' |2 i4 u) j5 v0 u2 }; \9 y
    13% k3 p0 t  }/ x0 T( R4 G
    可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。( G# v) G* T2 ]7 Y7 l

    & L3 a6 V- m* w* S. B+ j. @再用测试集去试试:/ k7 B. ^+ n' ]- M: c
    2 ^* Z9 H& h+ U; c1 J2 v+ a
    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
    % {' j; g1 x: Kprint('test_acc:', test_acc)2 x8 `2 R2 ?. t; X
    1
    4 }; n9 `7 @1 r( q' o8 D9 m2
    - }' N6 ]2 e: t输出:
    % n% {1 E" g( _
    # d+ F! u" X* k: C7 l' n6 t" ]10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789
    3 O0 d" b6 O' i9 |. [( Q8 c# Utest_acc: 0.9789) e9 y/ _3 b7 l
    1
    ' M- z2 [/ W2 }, Q9 r7 g0 B2
    $ Q6 V0 R2 N7 E' A2 w; h' l我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。$ j5 R) }! Z% W7 A' r1 k
    3 @' D1 v- o5 T
    神经网络的数据表示+ a! F9 @4 K& K; k: b' x" r
    1 W, j9 K, s- F8 D) U$ V! e* r
    Tensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。2 J9 Y& N8 j8 b

    " |7 _5 ?4 U' n  J. P我们常把「张量的维度」说成「轴」。4 K4 L% D! h) k1 g
    . \9 @+ G7 u/ A8 C. O7 P' v
    认识张量& K+ |/ }8 _5 Q( X! O* @+ o6 @9 }

    / S$ T* `, L: h9 s标量 (0D Tensors)
    ' h( q- ^3 v1 {0 g* B4 L8 j
    1 Q: z( R& F: i! F: H" ~Scalars,标量是 0 维的张量(0个轴),包含一个数。
    ! [* _- e& v) ?, d4 D7 A* A/ K* M2 z9 i2 R
    标量在 numpy 中可以用 float32 或 float64 表示。. X/ u7 U8 n$ X  B$ p2 b' V

    0 N' s% b8 k# k3 himport numpy as np
    " y  i) [: |+ O3 O/ d  f, o; |) q9 U. [6 |1 s: X: P7 k
    x = np.array(12)  s1 ~0 o* }# u8 U
    x2 ^2 M( j# ^5 k" K- [
    1
    7 N, j+ P) |: _7 U, f2
    ( H3 l0 y6 b* b3
    + g9 {3 z& p* b% ~4! d8 U% i7 S5 ]- }
    输出:
    4 V1 S# N  `, t- o0 S/ |  O$ D3 M9 h9 o) s* z  ^7 p; G
    array(12)5 ^7 {! j: W9 \* J, U
    1
    4 \& W' t# b8 y0 Y) _; Rx.ndim    # 轴数(维数)
    0 S3 c7 {# }$ n0 ]( @. [. D, k/ O. z1& j/ u- e  N, ]" c+ |; M8 W' e
    输出:: k, R9 W' R3 w+ ]

    2 ~5 M6 ~) d9 e! y1% b0 O! U% I5 N9 S
    1+ \7 `1 a* O: {4 ?8 v9 }( b
    向量 (1D Tensors)) B( s2 ^! O6 T1 E" j
    6 X* s9 F3 T" K4 x' n
    Vectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。& ?0 h+ @! Z& G  d+ W
    8 u; o0 v' M- o. U9 k
    x = np.array([1, 2, 3, 4, 5])4 I" J+ \8 L) A! s# w1 l. l5 w" _; N
    x
    3 ?; l: \$ W# I3 S1* t, _, u/ n* m, [
    2# f: z- W4 [; M- S; `; E
    输出:# |: B( q/ P, k$ ~; V
    7 y' _. `" @7 s5 v
    array([1, 2, 3, 4, 5])3 h: c2 y6 s. ?$ q' P* g
    18 J8 c6 q& x) M9 X+ n
    x.ndim9 t/ g7 _$ K( w2 k% G
    11 F! l8 a# M' z3 Q( U
    输出:5 k; M! Y! T% c9 Y
    ' D  d, A4 G! j/ O. H1 y
    1- d6 |, w% L' s, k# i% {% ~7 w
    1* R' i1 N8 t0 A  u, M( p, C
    我们把这样有5个元素的向量叫做“5维向量”。# l( ]4 i' T3 `* N) U5 _
    但注意5D向量可不是5D张量!
    . K0 j2 A- N$ N: O3 C3 A3 `
    4 v8 B, N. d# U+ Y' v4 X5D向量:只有1个轴,在这个轴上有5个维度。
    1 g! J3 w& |( P0 u6 L8 G$ H5D张量:有5个轴,在每个轴上可以有任意维度。4 B, k- a+ w2 [$ y2 y" u
    这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。* B% b  o6 t* _8 a& a

    3 a) L+ Z2 i- d% g, F- d, O  P所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。5 g1 G/ q% \! O. u( w
    3 j, A/ i/ C& {  P+ m
    矩阵 (2D Tensors), O0 P& O* E. I

    , d8 w2 r- X( ]/ D" H9 e  NMatrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。. K8 x6 P4 G& Y
    , Z1 P, ~) W4 m. j; y( h. B, x: a
    x = np.array([[5, 78, 2, 34, 0],
    2 R3 ]+ l. X5 r! t4 S5 B1 {0 b              [6, 79, 3, 35, 1],
    " _5 \. d3 [3 Y# W              [7, 80, 4, 36, 2]])3 z3 ]1 K+ i& i( S% N2 c  Y' l" e
    x3 |% ]' P. Y6 L2 @1 o$ {
    1
    + T6 g  _9 z/ F2& U, i& R3 p" p. ?
    3; u, q( Z& a2 K, l% l/ [
    4
    8 z( h, R' F  d4 ^. C9 m/ T+ |: _( M输出:, ?) v2 Q$ m. |/ V% w
    , n# S& P" o1 g# V* s8 U
    array([[ 5, 78,  2, 34,  0],! q0 L% z' x0 T+ C, P: Q! z
           [ 6, 79,  3, 35,  1],
    # b4 y6 z- ]: g0 j+ u* H       [ 7, 80,  4, 36,  2]])" F3 f; C- L8 H; o' d" ?) [
    1
    " k: @/ Y) c$ _, R  E2# ]  b$ m- p1 y0 }) r+ I
    3
    / n* S# y3 s: rx.ndim: U' b3 U% M* J
    1
    , _" b! {& y  q$ D6 F输出:& v+ j( w3 o$ {" y7 A! i! u, e# S
    1 X/ m, ~8 E, h$ s; q/ T; Q
    22 Q% S0 }) J6 I! N* O3 o$ U! d
    15 |. }; N5 |" H5 N
    高阶张量
    : u/ A( ~' Y6 {* H
    : g# h; B- V7 M: E$ v# K你搞个装矩阵的 array 就得到了3阶张量。* S5 D3 k; q/ S! b1 |
    * }  l, K' P! w8 w8 p* T# U
    再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。+ o8 d4 R. R' D5 a# c
    ' t' }! x# Y* w
    x = np.array([[[5, 78, 2, 34, 0],
    ) v% b6 x1 v  x               [6, 79, 3, 35, 1],0 Q7 O* E3 i: Z' o# Z3 L2 f
                   [7, 80, 4, 36, 2]],; E. K! V: ?5 A$ B3 R6 H% _
                  [[5, 78, 2, 34, 0],
    0 n  @  S  K5 H6 }# n6 n0 z9 ?- ^+ N               [6, 79, 3, 35, 1],7 h( ~. i9 R+ M& W6 `
                   [7, 80, 4, 36, 2]],
    5 k/ k4 o4 I0 ^9 ]/ }              [[5, 78, 2, 34, 0],
    5 T( `% }! I: D' H5 }               [6, 79, 3, 35, 1],7 c. Z) P+ u+ g2 `
                   [7, 80, 4, 36, 2]]])
    $ \, P: w) J' y  l# Xx.ndim3 N/ u. j/ i4 a: H
    1: g# q; f3 F5 K6 N! C
    2  u! ~1 g/ U/ |/ G
    3% ], t/ ^  Q+ k7 L% G$ @
    4
    3 C: }# x2 r( M1 H* @7 i5
    7 @6 q% N  ^0 K  m* U6
    + K- Q- P* z$ e1 ~7
    3 {, s3 n; `+ e6 {5 ?+ u8$ u% J, D7 V( v  ~3 Z8 S1 Q
    9
      V9 Q9 {' D; m; O* R3 w10
    # b# k- }- b- j8 c& M0 n$ k输出:
    * c- A2 A$ F0 }
    , q, L3 g5 \5 v34 o. K5 `7 a+ G) [' y, `& t  V. \
    1: u+ R1 l5 A' y
    深度学习里,我们一般就用0~4阶的张量。* p1 j! V, E6 {# ]: [

    , m3 p$ R4 m& p; k0 J- \6 g张量的三要素! r$ ^; H/ @) d8 A) |1 |
    / t7 k" \& s4 V8 F& h% _1 F
    阶数(轴的个数):3,5,…
    5 J7 u  M# b! [( ~9 \* y' H' e4 ^形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…
    $ U+ k7 Q1 V; R5 J/ N6 }数据类型:float32,uint8,…
    " s7 j* k% ^# H2 S2 K$ R我们来看看 MNIST 里的张量数据:
    0 W* a5 \7 c: h3 t* d
    " l3 T* [) z9 S5 V% dfrom tensorflow.keras.datasets import mnist5 _9 d" a. g) Y( t) J$ s5 f( |
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data()
    3 U; d3 r9 X: [3 `! E" m, F' }& L  r# }+ e8 J& m4 t6 U% p- L
    print(train_images.ndim)
    # `) ?: Q% w9 x) S! pprint(train_images.shape)$ ?1 y9 Y5 E- d1 o! ]" R4 h6 [
    print(train_images.dtype)- ^2 h' Z5 F! r. i) }7 }
    1  [0 X4 J2 I; V7 W( E/ K- U
    2  ^, }# o5 m- X
    3
    7 m' ~' _7 j" A$ u/ K* E49 O5 {  Y  z# b9 D2 H" n
    52 d* g! J: w! j9 W
    65 ?, y! G. B. i7 y* _& [0 p
    输出:: e$ N9 Z* i) D0 `' N
    - P$ l0 L& u' |6 N8 Y8 _) \, }
    3
      n$ c- g0 `  o# [7 a1 o- l(60000, 28, 28), D6 ~! O/ `- W
    uint8' Y6 v- j2 G. [, P4 J5 t
    1. ^: K" m; G: e7 K0 g4 e# L
    2/ i+ u+ g/ ?$ x1 N- k/ m
    3
    6 b7 i- d5 {. [8 J' V* k# f所以 train_images 是个8位无符号整数的3阶张量。
    ) Y. M- n3 G, ?5 Z2 ?$ x( D  c9 p! _" n8 v6 a4 q
    打印个里面的图片看看:
    - ]# ~8 C0 _- x  C: ^3 e  n) m, ^6 ~% t6 t
    digit = train_images[0]
    , r3 q* J) p" ^: z! |  F- N1 }& }
    # d, H) r' G( n8 u' t8 Mimport matplotlib.pyplot as plt# l- ~' X6 y" Q+ S, r  U3 W
    & N2 ^7 j& {: v: P% [
    print("image:")
    / A# E1 ?' m: e  @. a4 A" Hplt.imshow(digit, cmap=plt.cm.binary)
    4 w0 q$ _- V% m/ O% J8 D5 oplt.show()
    $ S& q( f0 H/ |: e2 h; iprint("label: ", train_labels[0])
    ; z: p3 m2 P1 n! E$ h. T4 s; K1
    0 \) z. |- I* Y  Z% z# f5 l2' W7 t/ C+ L5 O. @
    3' r$ o& m" O- `3 K7 w
    44 e" R% u5 T# X1 I
    5
      ^2 X% S0 w5 ^4 X; F6
    8 z4 q  v- n1 s% n; }; \78 q9 d, t. n. j! H' p* n1 q
    83 E& s2 S: i$ Q: b' Z; ]6 w$ a* ?
    输出:+ ^5 I4 N6 z4 P3 m0 |1 B1 Q

    % t/ ^  m/ W, Z) Z0 |: r* I! j 1.jpg $ Q/ q2 S, m/ V! a3 q& s
    8 _1 ]+ C4 C6 p
    label:  5  c2 W% H5 Q0 _- A
    1
    7 [3 b' n5 p# v  QNumpy张量操作3 }* [, B" ~% G( ?$ i0 w

    $ b( G9 C6 d) {5 ]张量切片:
    . b. s5 S4 l# r+ a" U
    5 F& ]8 E0 q6 Z3 V) H5 V" mmy_slice = train_images[10:100]- l' ~$ J, F( K4 @5 _. e
    print(my_slice.shape)' Q9 d$ |7 u! N0 `# \* `
    1
    3 I0 ]; i7 A8 z! Z6 ]2; I6 G2 t' @: Q5 R6 W
    输出:
    ( q9 A7 Q/ [0 s. _- l6 ` 2.jpg
    9 Q, @3 g# O# w& y% {(90, 28, 28)
    5 G( L! g! L! N- z, _( y" p19 J" j" r% d" q4 i7 m- e9 S& V' x6 N
    等价于:
    ; Z4 q  S' ~7 ~/ G
    7 X4 ^4 x3 p# O/ j" K5 J' Amy_slice = train_images[10:100, :, :]! U/ c4 B/ }. c: s, R
    print(my_slice.shape)- _! Q5 |+ G) c' {- |7 F
    1
    8 _  n" p8 d" q3 C, U3 g2' D5 @; C' D" W' E$ D
    输出:4 i: F3 \1 H5 W
    3.jpg
    : q$ c( d2 V7 ^0 v" i(90, 28, 28): z3 O. c; v, \- C3 l# M5 U. L; Q6 k
    1% R. k2 x# J! c& {, n. S
    也等价于" G) Q7 E% B/ [: C
    . Q7 E: C. r: S, d; N
    my_slice = train_images[10:100, 0:28, 0:28]
    , B; Y/ M: _8 X: M+ ^) lprint(my_slice.shape)* {5 W1 X2 x3 U( L8 V" \
    1
    & D  H; A7 _8 _7 T9 g) t$ Q0 |; i2
    % r0 [3 w5 S/ x输出:; o  w5 |  K" C* z

    ' ]3 a" P# O) Z: J+ M5 Q7 K(90, 28, 28)
    " r! J& {: i0 }4 i1- P# m- ?. F6 \0 s8 r0 b
    选出 右下角 14x14 的:, T1 w& L; j/ Z" ]' d/ ~/ d- h: S- y: v
    7 h, e5 v6 t6 H+ P
    my_slice = train_images[:, 14:, 14:]. h0 P: }; y9 `) E; ]8 d
    plt.imshow(my_slice[0], cmap=plt.cm.binary)
    3 D0 ?$ L- t% H( eplt.show()
    $ B' c8 A/ h! `- \" v7 I. U1
    ( C' d6 ^: f( g/ p) U2
    7 q' }+ d) o" y: U" }6 H7 Z1 n% D3  e, N8 e) P, m
    输出:; S8 D2 {, F1 _: M! [

    ' z/ p. v7 _+ l+ i" d7 }2 K9 n) e% y+ o/ ^

      m& r/ x1 [' N. U/ K7 S9 H) u选出 中心处 14x14 的:
    " ~/ n! K1 l( U" ?: n$ W
    ; o5 G  G7 L& c4 ]my_slice = train_images[:, 7:-7, 7:-7]
    ; e; B' c- ^/ B* R) mplt.imshow(my_slice[0], cmap=plt.cm.binary)
    ; Q+ G) B5 i& T. a! P4 D2 v) }% Kplt.show()
    2 q: n/ P) R% o2 _1
    ( A" E+ h; k# t. g% v2( l/ p) \0 C; ?; b$ C' G
    3
    " r* H1 h" \. G  |& M0 \3 V输出:
    0 f6 u, ]- m. b& m; s7 \. O2 I4 p$ x9 g% y6 M, l
    2 ]" N* x  r8 n% Y8 D  @

    5 O: _# m* D. w7 q, L1 Z8 e7 G2 \! T- c& j数据批量) k( p5 A9 u; K! e% N6 K7 Y, _+ f# Z
    / Z3 P9 M" R6 U( I
    深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。% p  M4 V/ g: p* T

    4 ?! \& m0 `; ?/ q2 k深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。
    $ A! o0 m% X' \9 n
    ( U) p6 s2 y# H0 g( P) |+ f0 O' V在 MNIST 中,我们的一个批量是 128 个数据:
    & I# @$ }  L4 x8 I) E8 h- G1 L3 F2 N! o
    # 第一批
    ! c8 q7 ?3 ?" q; u3 dbatch = train_images[:128]
    , z" B# x; a9 A* u+ x# 第二批
    : ]% I8 i( E1 a9 M; G4 R) [batch = train_images[128:256]2 r4 ^8 X+ J4 H% G/ Y; E
    # 第n批
    - S8 y- `4 g/ x" j6 \n = 121 O5 R1 y6 ?. E2 u1 E
    batch = train_images[128 * n : 128 * (n+1)]
    $ @& P+ S! N& H; {5 z9 w4 J! c12 P3 o" b  C& j7 ?7 d
    2
    4 P, p) t* H( \5 H, q( o* [; L$ Y3: f6 X, \. c6 i" `3 K
    44 b; Y/ j  P. |- I7 T1 {4 T
    5
    + t5 H- D# _/ O* F. R3 K2 V( g6. m5 Y5 Q4 N3 ^- _! |4 {7 w+ s
    7
    . Z$ w% ?# J: w所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。
    4 h, j0 X/ g- Q' u0 a9 `" W  ]) Q2 |; U5 o6 Y0 s1 ~
    常见数据张量表示
    ) g/ H) y$ b) J9 I! t0 j" y; [- F, V$ g+ p. o2 r9 m, j
    数据: [) z0 @" N; |, ]+ P( K" p, 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-9-2 11:14 , Processed in 0.445250 second(s), 59 queries .

    回顶部