QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6563|回复: 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
    ( w+ k5 Z3 `; F4 ?
    Python深度学习之初窥神经网络- P: Q5 Z: I: P" K. Q
    本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。
    / y5 k2 C* r0 d6 s; M7 @. G1 O+ R# `
    本文目录:
    $ t/ I" i; H6 h& {, a# s$ n# k2 Z) E2 V
    文章目录
    ) X" ~! a% p: ]% S9 }, k8 u
      w1 y% S! H7 \4 MDeep Learning with Python
    $ N( k( K& ~0 e! p8 Y% R9 S初窥神经网络
    , x+ ]9 K: m& O  T, G导入MNIST数据集
    . u$ H7 L- M; L, C网络构建) R* H8 i6 u$ X2 @
    编译
    9 @: f0 C, s* U- T9 Y) k- L: [预处理
    ) O( j6 O' X( c* }# z图形处理
    . Q1 E. `) k: R7 z* ]标签处理  l4 x5 R% _# F$ \1 o
    训练网络6 Q' S4 `( s! f/ W4 g' g) l
    神经网络的数据表示& K) K8 d. N6 b  ?+ p  O0 s0 ~" C
    认识张量
    . p* M# Y- T7 U5 R2 {5 I标量 (0D Tensors)
    1 {* B" Q$ e8 r2 R向量 (1D Tensors)
    * e7 \0 j$ F" k8 w3 w8 l/ s矩阵 (2D Tensors)
    $ u+ Q' `% v+ Z高阶张量0 l& G% L: p6 Z5 B9 J6 z
    张量的三要素; q0 L5 {8 ?1 |& S, r. C
    Numpy张量操作
    # F/ C4 E2 E/ M9 k: u# t张量切片:, w) ?' R( {- ]- p
    数据批量
    9 X1 z% L) U8 W9 |常见数据张量表示
    . g6 [+ H  `5 W* ?神经网络的“齿轮”: 张量运算' T& x! A' M, \& P' L9 o3 o7 m
    逐元素操作(Element-wise)0 {) v6 ^" ?1 Y) u7 w6 Z. x. U: T. d: o( o
    广播(Broadcasting)& L/ w4 d  X2 T
    张量点积(dot)0 W  Q' t6 x8 F* X0 e! r5 J/ A
    张量变形(reshaping). y# E8 s- l7 J
    神经网络的“引擎”: 基于梯度的优化, H0 F: t* r: h- r
    导数(derivative)1 u4 _* E! r1 M( m# k
    梯度(gradient), S: |# k/ c2 ]6 D) L' P% L
    随机梯度下降(Stochastic gradient descent)
    : a* ^4 q- w. B" T反向传播算法:链式求导" O; p" [, `' K6 _5 N' l
    本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。5 v1 a  l* B3 Y; D( S( c2 P

    4 \6 q* [# m2 W$ a- K* T初窥神经网络& R/ O! N/ b5 U

    ) c0 c( ~! L1 z" j- p6 S9 E) P学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。
    4 {7 `" q+ q/ @, h$ @4 l2 O, b7 p3 h
    MNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。
    8 _6 \9 ^' T8 R3 W
    8 P* M7 b! u; A* I/ f5 S导入MNIST数据集
    2 I+ F, v% V, {7 {% d3 h& n  g$ w9 b6 Q; G) N3 R5 z
    # Loading the MNIST dataset in Keras
    * l  _1 f( W4 |$ ?' B4 [2 f0 afrom tensorflow.keras.datasets import mnist
      [. P2 l/ c0 [! ]! f(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
    ( F! n9 h9 D% Q+ B; h1 ?; z+ ^; k- [1
    # d: \1 }4 ~8 D# T0 [  g- S' D2
    : ]7 ]; M! r4 d35 M# `" z1 f9 @. C' z
    看一下训练集:1 n! e" k  r) K" N3 i

    ' P! G1 M/ I, p" b7 nprint(train_images.shape), y4 M6 \6 S! |
    print(train_labels.shape)# J& d1 [& _* J) z- [. o4 s$ _
    train_labels3 k! ^' b+ _7 k6 Y* A' I
    1) Y' f  e8 Y4 h9 d5 U( O* J' s
    2
    1 A! d! z& ]4 n4 L" M7 I3
    + ]8 Z, x4 [* V* }8 @, `/ w& L% D输出:( V* S+ @$ }- J

    / ~$ b$ {+ G# I(60000, 28, 28)
    8 \- c) F+ O2 f2 ](60000,)/ H% x$ c, N# v# E
    1 J6 m2 L4 M& f% ]/ w! b# w6 z
    array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
    ) N8 D) z9 C6 H+ q1
    # A) t& A# `0 ^9 v  [; D$ k2( f5 U: l( H* V; o
    3
    / q6 X) Z/ q2 o* F4# J- ?, B3 a0 t3 e4 F
    这是测试集:
    * Y! h0 _+ a0 @" v3 Q) k& H. C3 ~
    print(test_images.shape)/ J* [8 J7 x2 m* e
    print(test_labels.shape)7 z2 Y. _# v! k
    test_labels
    * |3 c) L1 S$ p& a11 s. m% \$ @- a% G
    26 b# Q$ `; B# ?( x9 {% ^. v4 U7 b
    3
    , s8 o; I; {9 M: T5 p, }输出:- R  R% e, l7 O9 P$ @/ K
    7 \( I) b, j/ b0 k: [& v6 D. p+ V# v
    (10000, 28, 28)
    / E3 h/ {, F/ y. R8 U- I8 w(10000,)
    " V' B* ^( `+ u3 S( I3 Z0 q' w0 j4 ?6 E- f! P; U6 c. k& F9 B7 e
    array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)' _( U7 P6 B9 a
    1) ~, {1 `  X3 F( |
    2  l+ R4 U, O4 x4 f1 p# H
    3
    , \: a) Q, ?2 f& A: \* i4
    # c) n/ S9 L3 N网络构建
    + [2 N5 k$ _6 b0 \% y2 x4 K* v- b7 L8 E. g1 @; e
    我们来构建一个用来学习 MNIST 集的神经网络:
    6 _' z, S$ {3 c' `/ n5 H) S' ]; E0 k4 V) q8 r& J
    from tensorflow.keras import models2 D' B/ p- w1 w# m8 M8 s) }! b
    from tensorflow.keras import layers
    3 @9 w+ x% x9 C
    $ p9 f, r; F0 A% M% ^! ?network = models.Sequential()) B4 S5 P5 @4 v1 }8 h' V, W
    network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))1 i( l& k5 A2 w. P$ F1 J
    network.add(layers.Dense(10, activation='softmax'))
    6 W3 z2 e$ Z( Y6 l1( f5 ]: O2 \3 m! e8 j6 _. C
    2
    ! F4 k0 u( t4 g3
    5 I8 c8 r' T9 \7 L0 o. y4
    4 f& B  g* \! q! q; K5; D  S) D3 O2 F6 Y, i) Q
    6
    " q) u! ]; f& A  O5 ]神经网络是一个个「层」组成的。
    - E9 P- N$ P7 Z3 Y% q; D一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。+ i# F% k, F' H- y+ }
    ( x, n1 x' F5 g; H; w
    这样一系列的「层」组合起来,像流水线一样对数据进行处理。
    ( S7 M- x0 d1 w/ w6 k3 a层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。
    4 L* E# e- Z* ^7 q) z. X6 k; u' X" ]& Q$ E
    我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。  p! L0 y4 v7 K

    4 C0 B" [& f) d+ q4 }! ^' B数据到了最后一层(第二层),是一个 10路 的 softmax 层。; q, `" L" d! L6 D, G$ d
    这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。2 _8 a+ \% ]- }2 L0 t" B3 C
    事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!  X, _1 r) x, n8 O( i1 }, Z
    ) I, X( B, }" j5 ~* B$ o
    编译( |2 x+ U+ H. ?5 \7 \) {

    . a- o. c5 G  X& T接下来,我们要 编译 这个网络,这个步骤需要给3个参数:
    ; O- y5 @+ V( C5 s1 @4 t6 p( }
      z8 ~+ A: d6 ?0 t4 \! l; `损失函数:评价你这网络表现的好不好的函数
    7 _" k. b2 f# W# U* E0 [* h) v优化器:怎么更新(优化)你这个网络
    ( |5 n$ r2 x4 V5 ~: a5 Z训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度
    # ?6 V5 @1 ]5 K& z3 bnetwork.compile(loss="categorical_crossentropy",) S! J" H9 Y2 a1 N
                    optimizer='rmsprop',
    & w+ N3 {! q; i, l+ C                metrics=['accuracy'])( L- Z! s! g- R2 I. \
    1
    ( r( }1 L, m/ Q, E2
    1 [3 y3 V( E/ ^- m" J# Z, C3; ^8 s2 ~7 K, k5 ~7 ^
    预处理
    3 Y7 i0 T& A) l7 L: \4 l' a" x5 P
    * \( d, m4 D! L0 r: V+ l# Q" b图形处理# P/ u7 ]9 _% j

    0 v1 x7 |9 r! T" k! M5 n我们还需要处理一下图形数据,把它变成我们的网络认识的样子。
    6 _6 O; O3 \) `7 k* [  J
    , f0 d, m  o) @# o9 f3 ^MNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。' J' ]1 D1 X+ d9 V: e- ?6 E, M! L$ z
    而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。
    8 Y: A( r) B5 Q, S; r) g( g* ]$ g" m  M* C+ ^6 ~8 o0 `# K
    train_images = train_images.reshape((60000, 28 * 28))6 j/ s5 G. G4 U
    train_images = train_images.astype('float32') / 255
    . n* [& J% h; o+ j: k( A
      U' c- n/ M/ Z& j' vtest_images = test_images.reshape((10000, 28 * 28))5 ]1 V% P7 l6 P0 q/ Q0 M* v# `
    test_images = test_images.astype('float32') / 255
    4 R2 A! Q% \/ ^2 [4 ]# L1 G# ]7 o1
    3 T' n0 w. h  |2( Z5 ~& ~- Z0 ^- l4 J
    3
    8 x; F- v  X; r: j$ _4/ N( p2 J* v; N! {& F# u1 Q* e
    57 v+ _- x9 {$ j* b
    标签处理
    : Z+ V4 A- X5 T( v0 m% r3 _9 b9 \5 W  j5 m8 z: Q9 X+ T
    同样,标签也是需要处理一下的。
      M* Y( B! a! \' T0 Z; U- |4 M) D5 N3 ^% l" W: A
    from tensorflow.keras.utils import to_categorical
    * K9 v0 z' t0 B1 a- x- |( `6 G
    ; V1 _; `# z7 y# V* y8 u. o( gtrain_labels = to_categorical(train_labels)6 k8 b! n) U* S- P, O
    test_labels = to_categorical(test_labels)
    " i( ?5 L- w5 U# u14 D. p/ R, F$ D% C3 i
    2
    3 A) p4 E0 y; s* e# W+ x& J30 Q2 G3 v+ F$ X; t5 D' j6 U( p0 Q
    4
    7 n- y4 Q' E- R8 M/ w" ~) Y& G" D* q训练网络
    2 [$ H* e" U$ B0 y5 L, s# m# ^; \( I" B- Q' v! }. Z0 }6 C
    network.fit(train_images, train_labels, epochs=5, batch_size=128)) o% r$ H1 S5 x4 `4 v- K
    1
    * l- T# S+ ~$ T7 N输出:6 L! k5 z2 I9 x
    8 `: C+ L0 p( M" \) j' J" M1 B
    Train on 60000 samples3 O* [; f+ r) i: x
    Epoch 1/5
    9 @% `) |" z3 ^) G- W60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254# E, }/ n1 _6 ?
    Epoch 2/5
    ! j6 j% X1 ^; H9 b* [; ^9 G  N60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693
    3 l6 u6 ]' Z- G+ w$ X1 JEpoch 3/5+ Y" g. h! d' h( g
    60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800
    # j- B( \( R& T+ h# A- UEpoch 4/5$ F1 p. {0 [; h4 R$ p' V
    60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848
    * R/ K6 u) u2 i5 Q  V, Q: _7 eEpoch 5/5
    * m. j$ L3 x9 W& s60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.98882 i4 s  o4 E* z% _

    7 ]9 S1 ^/ T# h' G0 V! {  p<tensorflow.python.keras.callbacks.History at 0x13a7892d0>
    & m) c" W- m. P1
    1 i; o5 o! X3 A8 A! H7 x$ m2- c1 Y- @2 G/ X% }
    3/ g3 d8 i% n: v4 L& J$ b
    4
    ' o- c$ {. Y+ q$ d1 l5) |8 u: {  {+ p* {. C
    6& r1 i( J4 I* y! e9 l
    7; w; `' l% i4 c+ f4 q* k
    8
    2 B# c2 s# p% |3 y0 t9
    - c1 a, c" a. i& R0 {" y3 o/ x10& M9 C5 P3 j) O/ G# \/ A$ G
    11% _3 N/ K% N$ A! k
    12
    * k) J+ k; e* a: S0 e13
    ! K* M: E" q8 j9 f5 p9 y) d可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。- l" E& v/ L1 b: K7 m

      L9 m5 T% r( X, y0 h再用测试集去试试:: A: x. Z, ]5 M0 n8 K

    / h) }; Y1 r- s7 }- {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
    & q! V$ S1 Q' b4 R2 \7 y8 E+ S# Gprint('test_acc:', test_acc)
    , i0 m. h4 L- c! |18 G2 X/ [( F0 U
    2
    ) [" h) m0 @# b0 k% g6 u输出:9 g7 v7 t4 H' [; U7 D! b

    , p& ^: H( K, ~, P1 ~, z10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789
    $ x6 B3 g9 t: M$ _. }5 ^, dtest_acc: 0.9789/ B; t. G! M" X2 c5 V
    1
    ) }1 L2 D- P. Z" O7 |( @  |2) T6 [" u( }' C! E+ \
    我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。
    0 ?6 u2 b; Y6 X- {5 I, V' L4 {; U  [3 O' f# f9 a5 `
    神经网络的数据表示' z1 o1 Z, c9 @" O) |3 w6 h( ^

    1 @& |, ?) v5 f3 wTensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。- K8 _5 e; F. G4 I; w" A1 y7 j( d5 s# }

    & ]8 A% J6 _5 `2 J' D: F我们常把「张量的维度」说成「轴」。( c, K8 i5 w3 q
      d( b0 F' h* @# g9 a& l2 l
    认识张量' ]: `4 ]" s2 q( U5 k
    0 d+ O6 p5 Q/ q' S5 s
    标量 (0D Tensors)* P9 g& g0 h5 S$ V, o) p4 V

    8 l! b1 W/ v+ t# C2 ^# }# xScalars,标量是 0 维的张量(0个轴),包含一个数。. l8 T# ^* a$ {4 W5 K" U

    : {2 F( a. K; U标量在 numpy 中可以用 float32 或 float64 表示。+ k$ j+ N3 a9 U) x

    9 P6 n& o0 B& m( V, F+ [* w9 Himport numpy as np) \( T( W& E9 b, j8 S% }1 \
    3 ^0 f$ K$ {' J  W0 S2 x
    x = np.array(12)
    & X/ O; R9 f+ \- Wx- u4 X; f# {9 Q! R0 \0 N* K% S
    1
    2 I3 k- g. X7 q1 b5 D2
    ; k  z& A0 a8 N0 j( w33 Z3 j1 B$ m/ q
    4
    + W1 i, ~8 \- k输出:( u' P- C4 K" J2 n; J+ V
    : S% U0 o9 l% U
    array(12)
    3 m; a# ^& a( y3 L& G( _17 X* s" z! ]5 A+ D0 ^6 X- W3 q
    x.ndim    # 轴数(维数)2 v. Q% J! Q3 H# ]
    1! J4 v5 l* A! s3 [' q# ~: d1 I
    输出:
    6 A! _$ O* x: a3 r
    " P% K, A  d) W4 f$ i1: a: f2 U* |/ H9 k) C. ?
    1
    ) H) C3 z: d. f( x- D  D6 T+ {向量 (1D Tensors)
    6 K8 Z2 W: ?$ h) }3 k! j2 T6 `$ N5 R; S5 L# \
    Vectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。
    " z: W" B# l+ s. U' d* z  n1 K4 ~+ ~0 Q
    x = np.array([1, 2, 3, 4, 5])$ \) j. G5 V% h# D( E
    x4 v3 c( [& F3 W
    1
    ( z7 f0 [& r0 T$ Q27 u% j/ S8 L  n% A5 x& ~8 I
    输出:
    1 Y& B1 E! e& g- C9 b6 i$ s5 e+ @  }8 p
      \/ A: i2 s) g; G7 A" l# D! m5 K: Tarray([1, 2, 3, 4, 5])( P8 \5 O" a6 d
    1
    / O  s$ m! V" ^: nx.ndim# @% p: ^. N+ L6 p) r% Q
    1: v- E( C. G% _- u
    输出:
    # Z% Q% ]1 r# K( p- m1 K/ K
    & `% X2 `" w4 o: J1
    3 ^" `+ `6 v* `$ R$ R1
    * N  B# T) |- {$ U( H5 \& g* J我们把这样有5个元素的向量叫做“5维向量”。. d9 n' X% {2 f% p% Q9 ~
    但注意5D向量可不是5D张量!# w( U7 I6 B4 i+ W( z

    4 F% V7 P( `1 z# n6 |! U5D向量:只有1个轴,在这个轴上有5个维度。1 J, S; A% [8 m
    5D张量:有5个轴,在每个轴上可以有任意维度。3 m4 s7 K5 w, M: A; I
    这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。6 x( g7 I, |7 k3 C/ s: V
    9 _6 w# }  V" @" ~8 W& a0 v
    所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。9 {& Y; V5 X% A# u  j
    $ R% _2 c9 G/ I; q. O
    矩阵 (2D Tensors)
    3 x( s3 R5 A$ ?. M; R
    " ^, E( B9 s2 U& a4 t7 YMatrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。
    , {0 `# R. |3 T  X" R# |$ A2 b1 q3 z1 S  M' Y
    x = np.array([[5, 78, 2, 34, 0],
    9 C4 A# O$ q: U- R; q              [6, 79, 3, 35, 1],  D+ t  ^" S7 c! `0 d
                  [7, 80, 4, 36, 2]])
    . O; z6 A, _" n- p; Y8 wx2 G/ P5 l$ D$ p
    1
    / Z1 D5 l( p5 U: m; `6 G& o2
    4 N, S; X- q4 b3" S" I" I/ f9 a% @, {& M3 @5 z% A
    4
    / }) W$ ]6 ^1 |! F5 U1 P输出:3 K, h/ Y# F6 j$ L; `  ?" T

    : F/ H. h7 O  ~5 @) N& yarray([[ 5, 78,  2, 34,  0],: t5 s' |# R& S% I) P
           [ 6, 79,  3, 35,  1],, V# h) C) _* r2 g0 ~
           [ 7, 80,  4, 36,  2]])2 ~9 _7 b3 D6 I& R/ O, o" E: d
    10 I0 G5 t' }5 ~- h; N
    2
    : O7 y. s8 G9 d* C# h3  n3 o! [# ^" h2 `8 H4 I5 }9 |
    x.ndim6 q7 L! Q; [( I# o* y
    16 T* Z# e# Q. {; ~
    输出:
    ; g7 ?; p# k. r/ L- }/ \# {, {9 ~, l$ X4 A
    2- V5 h; d) g  E+ ]- f+ q
    1% D4 w1 O/ H6 a! J  H: u
    高阶张量* m) a( n# Q" W- Q( N

    # M# o0 r' }7 H) |3 U/ k9 ~3 m/ U你搞个装矩阵的 array 就得到了3阶张量。/ ^( U6 q) _$ [% d

    3 c4 v) m6 f" M8 R# Q% ~& `* P$ E8 [再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。
    3 r9 B$ P* {( z+ j9 N' _* g2 M$ s
    x = np.array([[[5, 78, 2, 34, 0],
    * w$ x6 Z. P+ m( c( X  X0 Z               [6, 79, 3, 35, 1],# ^% S; d% n' d' x; V
                   [7, 80, 4, 36, 2]],
    1 Y3 v& g7 F5 d8 P              [[5, 78, 2, 34, 0],  _  ~1 ?* r8 I* a+ z) X9 o& h3 [
                   [6, 79, 3, 35, 1],9 d3 g' D7 S7 N
                   [7, 80, 4, 36, 2]],% C# _, c' w- ]1 H- }
                  [[5, 78, 2, 34, 0],
    5 ^, W3 |5 B8 J' {2 Z9 s               [6, 79, 3, 35, 1],
    + U/ `% x. k1 r4 E8 B6 U7 x- }% ?               [7, 80, 4, 36, 2]]])' |% C# K7 \5 z2 {# ^+ @3 J+ O
    x.ndim$ r& v3 @. S$ j" `( P$ N$ P
    1
    ( |4 S* O- \# P2
    1 F0 @- v# e, R0 r/ g3
    & q" u4 s& k! {( [8 l! d4# Z' U. B# y$ y8 L2 \+ x3 t4 G
    5
    # O, z6 n3 s9 L! u6
      t9 ?7 c& A! l% E6 x: A70 n$ k* N+ ]* u
    8
    . K. P+ L6 {2 X- x* h! g9
    ) @+ C. b- _' Y. C. r5 @$ p10  B3 d6 N1 Z) ^3 n+ F
    输出:
    6 `# c1 M. G' m- u! H6 p- {( }" n5 Z8 S; m! S) O
    3' |" J2 y. W$ s! p! ^
    1
    . f0 J6 u/ @' E& e$ P! m8 a  w深度学习里,我们一般就用0~4阶的张量。
    2 u+ J6 G( I# s7 t( B
    " `" T0 l# R" a1 m3 ^- @$ u5 L0 p$ P: L张量的三要素
    ' y6 Y8 p& {, d+ D4 p. q
    7 p7 J* u# }* \( R& k- J阶数(轴的个数):3,5,…
    ; U8 J8 q1 R$ C6 g8 Q  ^形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…  u5 y3 B( i6 @( F- d4 H& u
    数据类型:float32,uint8,…5 |, p8 T- `1 a2 ]4 J  U: s* `
    我们来看看 MNIST 里的张量数据:+ T. s) l% V. d5 ~: Y# v* ~& s. B

    & z+ a7 O& e  V6 Pfrom tensorflow.keras.datasets import mnist
    8 J* w- P2 T" ~8 W- {# u( l(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
    - H$ h' M! \% O( V6 V! C3 H; k# |  |& M" {+ Q: j
    print(train_images.ndim)
    6 f  a# q/ h1 Iprint(train_images.shape)
    ) l& ]6 ~! p1 Lprint(train_images.dtype)" o: f( z1 a( _
    1
    # \0 X) T$ ~8 B' T0 B7 C* d4 u2
    + j- y% X8 j4 |$ K% y! @! H3
    / ^; p# |* p- p* L! M$ }3 D48 I, {( E5 [8 W: V1 F: d% V8 u
    5
    9 @+ Z3 }5 O+ }3 Q. A5 }6: V, ?  ?& Z/ a0 I
    输出:6 e, t# P5 g! G) f; ~7 a4 V
    , N6 S# A6 X8 }( }
    3
    ; I( ]$ z  J/ E: K; o" V(60000, 28, 28)
    - r* D! L$ c1 p* M) }uint8
    " e4 S4 I& F8 N! s4 b1
    $ o# _) I0 U: t& ?2
      x2 z+ a  w3 m8 E3+ L: }1 j& T& J8 G- ~+ E; @
    所以 train_images 是个8位无符号整数的3阶张量。8 A5 L; X, X2 H6 w

    2 Q- [2 S" U4 B打印个里面的图片看看:
    & Q6 n0 T0 E1 ^8 u' A9 x9 B+ j* c% l: @9 l+ `
    digit = train_images[0]5 j  L/ X: p" Z+ Y
    1 M* K! u( e! x: m5 [
    import matplotlib.pyplot as plt
    8 O0 {4 g5 @/ d/ R4 z/ _) K9 ]( q7 p8 d3 h
    print("image:")" ]+ E* p( G; ^3 `( O$ n
    plt.imshow(digit, cmap=plt.cm.binary)3 |' C& d6 z* q5 S) o
    plt.show(); m: V! [- e; z( Q8 C. r# ]
    print("label: ", train_labels[0])1 p$ ^6 Q& q# i& V, X
    1
      D9 g0 ~% k% T2
    2 m* o, [# Y5 a: e! o3( f2 P. |. y0 G! f9 u! _; d
    4# J7 d2 M/ b1 V# c5 T& C) x
    5
    * J9 M6 _4 Q( m$ o6
    9 I+ L$ X' O( ]7 w; c, X70 c) P# b# Q$ j+ g3 D* f. D
    8
    ( e$ C/ R: E5 }+ S3 x* i/ G  i) C: p  G输出:: q# K8 ~" F( I8 Y$ y: e

    2 U  u& j( b  C+ }  X% w3 o 1.jpg
    + ~# r& m" p$ x
    . O' ^4 U# X+ f# ?& \3 |7 Olabel:  5
    1 \$ {$ j% L8 Y& _9 P1+ t" V5 e8 ]+ u( Q
    Numpy张量操作
    & I) ^1 _, F6 r3 [& ]
    1 m- M' Y+ F$ D6 J! \$ h张量切片:+ g. ]* C% L3 f' W4 y
    , X' ^, x) A: I: L% @
    my_slice = train_images[10:100]
    + ~2 m; n* I( b$ W8 oprint(my_slice.shape)( Q4 [1 {/ f6 w% z2 q* p  G0 t
    1
    # Y: z! D4 p) T8 r* C' f2 e2- m' K9 ~) M4 A% F+ d6 i' I* d
    输出:/ |) e! J9 q- J% M( k0 [5 \
    2.jpg
    * d9 i1 y# m' h- L8 j) F; B(90, 28, 28)
    9 R' s0 X; ]0 O$ [5 L# _1* C+ E1 U4 B7 x2 I
    等价于:2 n/ }8 J; M3 l+ q7 d/ }$ _

    " V/ g2 C$ R7 X0 u/ }my_slice = train_images[10:100, :, :]
    1 G0 q7 O4 K, o- }- I+ G* Gprint(my_slice.shape)( T, S  t( U" N" W, p- i
    1
    ! {8 P3 W1 u" z8 ~, M! E2% y" C! I$ ]3 t( j! ^* [
    输出:( H- W( e3 ?  [" d1 |& [
    3.jpg : `. m& J. [: [
    (90, 28, 28)* @; U2 Z4 X. x' |
    1
    ( ?& H6 ]6 t+ w也等价于
    9 M1 f. W1 f. Z( m, K
    # c% ^9 n. l* Rmy_slice = train_images[10:100, 0:28, 0:28]3 e; A9 ~5 X. w; F$ |; A
    print(my_slice.shape)
    2 ^( f% g' `# g7 m" i, S1
    - F7 V/ K: }5 S2
    - Y/ v; l. J0 r+ d( t8 Z$ B1 z4 F输出:
    ) Z8 h7 K' i) a0 E6 U) D0 O. E9 i& Z9 _  ?6 E# u  F
    (90, 28, 28)
    . R# \7 P4 z' o) ~+ h9 I9 Z( X1! L; N+ u1 y; g
    选出 右下角 14x14 的:4 s$ {- w2 m: u/ x- n' P4 z1 _  X. g# g

    : Z8 p5 \. T" O. {& qmy_slice = train_images[:, 14:, 14:]7 \5 `# c% M6 g7 L4 A
    plt.imshow(my_slice[0], cmap=plt.cm.binary)* q, T" s# e" a7 N
    plt.show(); P7 K) j; X" O  @% Q
    16 U" v9 A) E- ], m7 V  y
    2. P! \) B! T* m5 M) W! x& X
    3
    9 k! W4 K2 W/ U0 `# l/ ]0 Y) q6 y输出:; `1 ?$ c) b9 f" }+ Y" ]
    : l8 r- Z) ^# E9 t
    2 W1 y, u* S, w
    1 x& k) c; g2 r3 B
    选出 中心处 14x14 的:' T, x6 ~/ n" S9 C' |- ~
    / S3 X& o. T3 q8 c2 K
    my_slice = train_images[:, 7:-7, 7:-7], @- m2 o, L$ g1 d+ P& n+ u
    plt.imshow(my_slice[0], cmap=plt.cm.binary): ^, M: w; i  z- g
    plt.show()( X3 Q& Z, {$ E3 Z
    1
    , V! a) E' |% F' @  h5 c0 @2$ Q& z. J" p: W9 H1 x) k9 D
    3- h7 \# _7 U" G( b* J" B
    输出:
    / G, N0 w8 b7 J% G. W% Y2 _7 W& T: p! @' f

    ' i$ W: \; \  \( E0 `8 j/ Z' n3 R5 r5 Z) A2 F9 i
    数据批量
    3 P4 |( G) |1 i5 `6 H: @
    ) h% O8 E3 l" J5 ~3 \深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。" m  T( b5 M& J  D( z
    ; a9 u( a0 A1 z, [6 [; N8 Q  s6 b
    深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。
    - k! \( K4 v: y! b' ^! N
    ) ^3 Q/ r$ U* n在 MNIST 中,我们的一个批量是 128 个数据:
    - Z7 D$ {0 u- T- S( M+ N5 L
    + X" C: K3 v1 O: F) E# 第一批
    + H0 I3 Z3 s# o  B! z' ?. G% Dbatch = train_images[:128]
    0 e& P6 U7 P& J) Q3 z# 第二批
    , m2 v3 b- [2 ]. `2 J( c% y# ?batch = train_images[128:256]/ ~8 X3 c- X: _
    # 第n批
    7 x. d& S1 b, ]5 E; d  e4 v! In = 12
    # w/ }! k4 S/ a* J' m9 Gbatch = train_images[128 * n : 128 * (n+1)]; a7 |0 q  [# ^  @6 V( k
    1
    7 R( q8 s! }( @  A2, D# F* t1 e5 L  X6 X
    3
    9 k- S: e2 c% e) S, m8 w9 T6 e4
    ; ]% h4 O% O  G' |  Z$ k! a" _" u5
    ( i+ W2 }8 u0 g  x6
      f, j& z( M/ M+ |7
    1 p' l1 ^: T$ Y所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。
    * A( E/ |( w  `# t* u* y& G: N; w+ N: w, z* X/ y
    常见数据张量表示9 n4 H0 K+ A7 p" ?& L6 w

    + t" F& ?' f2 u4 w数据
    8 U! @8 p3 d) p) H6 k
    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 02:39 , Processed in 0.477961 second(s), 58 queries .

    回顶部