QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6509|回复: 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
    2 z5 E" X% t0 H0 m$ ?, }) v
    Python深度学习之初窥神经网络3 H8 @5 p; X5 {, t
    本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。6 z4 h+ ]# ~; c* _6 G9 h' J: e

    5 c# e6 B. m  |7 z本文目录:
    2 r2 ^- m4 }' N1 ]
    ) D5 h& A6 |8 ^; m5 B# x文章目录
    + L5 p$ C6 U9 F. q9 J- f* Q/ v& k/ c
    / J% m% c2 R6 s. Y- ]# oDeep Learning with Python
    # c" L2 p3 H- w4 g4 f& ~! t" z9 S初窥神经网络* V# O% z3 |* R
    导入MNIST数据集. z+ L: E9 z* g+ _( H# |" U
    网络构建! R# n* Z  m' s& Y" s
    编译
    ! w" ]0 w5 f2 B9 E2 A! k% U预处理
    1 N5 R& v/ ^0 e8 U图形处理
    , c) e" |% a$ t, o1 u  B标签处理0 I& ~  k( j: C3 A- [
    训练网络* s: f; ^# |' Q( ]
    神经网络的数据表示
    # `$ g( z" |3 S4 p1 K+ S7 I3 y认识张量
    * H- U8 }7 L7 U: [+ J标量 (0D Tensors)
    9 x: y0 t+ e4 I$ T& F向量 (1D Tensors)6 [$ a' M$ n2 A6 M% P
    矩阵 (2D Tensors)5 }  ?, j9 ~0 F$ F* z! K+ M. `
    高阶张量
    0 j2 D$ T1 ~  q& g/ i3 N# ~张量的三要素. C& [5 r: i, T" P1 A* X; t" z. j
    Numpy张量操作
    : {3 J# b: X$ b8 L+ E$ I1 ^张量切片:1 R5 p" ?, ^, a1 D
    数据批量! P2 E% k# J  b9 X# U7 g: A2 D
    常见数据张量表示+ L! G1 R: v5 u  K! x  p/ R# V: D
    神经网络的“齿轮”: 张量运算
    / D1 A* C& ]& @& a1 Q( w逐元素操作(Element-wise)' L! d8 M+ b$ I( X' s: S9 J
    广播(Broadcasting)" \) p# F9 S2 Z1 D! U1 y' t% O
    张量点积(dot)
    " p8 A1 ?1 n8 `张量变形(reshaping)9 h; P' y. n- o
    神经网络的“引擎”: 基于梯度的优化5 d% N* j5 P8 |" d6 P! Z/ v# F) Y6 E
    导数(derivative)' B5 z1 B1 q" ^+ A
    梯度(gradient)! k+ e2 n; o2 Q8 m# w0 L
    随机梯度下降(Stochastic gradient descent)
    , J" t  Q$ o1 w5 r6 r3 N$ Y+ @! |% c反向传播算法:链式求导9 r. b( m* L7 i/ }
    本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。
    ; ~* w* B5 C9 k
    # T8 [0 H% J% @. d8 m" f+ t初窥神经网络
    1 D# ?9 W" t0 O( B# T' V4 D( K9 K' y& g8 [1 F  ~
    学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。! l# M4 v4 ^! J8 V$ N% m; f

    ) E' n6 d; |1 K- \) l2 Z) `MNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。
    5 [4 E, L$ }& k5 ~4 f2 D! H& x/ P' V% U2 e+ `
    导入MNIST数据集
    6 \5 `& g& l, D& @! z& H
    9 s- s. c) t) u, S7 b$ `# Loading the MNIST dataset in Keras& }' _; u* N6 h/ B8 D' b
    from tensorflow.keras.datasets import mnist
    ) C4 {8 g* |9 q6 O(train_images, train_labels), (test_images, test_labels) = mnist.load_data()' g+ |4 g0 l8 H& h# R( g
    1: S& a/ r- q+ H: S+ m
    2- J. t( V1 [- L% W6 m( g0 [4 z
    3" _* \+ |) ]" ?' r, q
    看一下训练集:
    6 U- Q1 K; V" B
    & \) U: P8 A! h5 D+ f- e' Nprint(train_images.shape)
      K$ V/ u0 [8 }5 ]9 Jprint(train_labels.shape)
    1 E! J3 M. s1 [' J* vtrain_labels* N8 N+ Y- A8 W( W/ }: f( R3 C) R+ g
    1
    ) U+ m5 v) l# z0 }4 Z2
    0 C7 q% i+ {8 {, }% s' O3
    0 r! ~& _; _3 C' [, \输出:
    $ @! A5 K& q, d
    ! \( }1 O! {+ x( D( h8 w3 V, b(60000, 28, 28)$ P0 L  E3 |' C7 K
    (60000,)
    . T7 ?( |2 E- i/ Y5 ], y3 M4 T! u- i. e% H; \
    array([5, 0, 4, ..., 5, 6, 8], dtype=uint8), R2 K4 y8 B5 v8 z6 h
    14 O( ]" w& t  u7 a: N/ c) D8 w, l
    2! S7 k8 Z5 D6 H  V8 m
    3' W' ]2 s% L0 `+ }+ U# i
    4
      q, e8 A( i: i这是测试集:
      t* y+ o/ k. v! g! r) r
    7 ]& ~# H# P3 a. Q3 Pprint(test_images.shape)) k  {- ]2 O/ H
    print(test_labels.shape)( g" v  c3 A% ?: ^0 F" e& _4 v# M+ t
    test_labels3 ?6 k- y. ?+ b3 i' x
    1
    $ m1 d8 r& w" e! G; i% b21 g  O1 a' G/ D9 S9 _9 w) M
    38 U& J2 p+ J2 s) w+ R
    输出:* m# b7 d  u; G5 D

    - w8 ]: ~3 L" [& v. `5 y(10000, 28, 28)( h: E$ P$ Z1 V) v" ^
    (10000,)
    , h+ ?0 ~4 E3 f8 y- Y; ?, }  S+ d& B1 h7 D  f9 l8 L. C- s' ~4 z- Q
    array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)8 T1 r/ }# c; B  r$ _
    1
    . d5 Q9 Z& O6 w* U2" F% ~- p' z3 u3 U9 }8 [
    3
    : _- z* R7 v; _/ ?$ \$ f4
    $ t+ ]; S+ V$ o* ]2 t) {网络构建' v& M; ?# H& p$ j
    $ \$ Z0 f+ V  f
    我们来构建一个用来学习 MNIST 集的神经网络:$ R9 g) @& ~: `
    ' A  t. }! }9 W2 p3 K6 V
    from tensorflow.keras import models! [" v6 [  ^, Y3 C  P- s: I, n* T. v
    from tensorflow.keras import layers2 M$ z1 x! G( i- ?9 S0 m) J# G

    . d5 Y0 o- A6 r( U3 u7 I* z$ pnetwork = models.Sequential(): P( z0 ?5 J  o2 z& Y
    network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))$ T: J1 V. Y  C9 k* w
    network.add(layers.Dense(10, activation='softmax'))" j; P0 W1 d) D. P$ p. ]4 x
    1
    & D0 n- u+ O+ N. a2
    1 H( R  q. ^2 F! L2 ~3
    ! @" U9 N2 s2 Q3 }43 y# Q, c: Z( _+ y+ L0 E9 m
    5
    # C4 G. {4 x: z$ J9 M6+ z% C; C1 M! M! s, y4 z% @
    神经网络是一个个「层」组成的。4 r, w7 ~$ R# e% V
    一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。
    . h) p, v- ~3 U0 _2 Q0 ^+ s& X& Q  z# }: B
    这样一系列的「层」组合起来,像流水线一样对数据进行处理。# P5 L& D2 c6 Z# d" _
    层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。
    & y7 J; b6 O* O$ u: h& ^" q- s7 `( L6 }0 j
    我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。
    5 r1 r" W2 d! S& @# i4 u. C# A* |* J. m" {  U
    数据到了最后一层(第二层),是一个 10路 的 softmax 层。- Q+ j+ F; S  `+ h: \8 z
    这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。
    . |- L0 x  w' b8 Q3 r" B2 i" u事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!8 G8 ^  @" C, B" m; c6 c2 a! f% [  Q

    " d% a' L/ e- c! x& {- m' t编译* h- c/ V$ ~% C# k4 q
    , ~. u- o1 j" x' Q! g+ ?  G
    接下来,我们要 编译 这个网络,这个步骤需要给3个参数:5 }, ~( M# a! n0 W1 L

    % Y) V* ?7 h- Q' U# E& P4 T  J$ P损失函数:评价你这网络表现的好不好的函数& |) Y/ u! Q2 r, Z: b: J
    优化器:怎么更新(优化)你这个网络
    ! I4 R2 c( _& k' t& }训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度
    # v, o5 l- o% n6 r# j( h; C( g: Wnetwork.compile(loss="categorical_crossentropy",
    6 W2 J- H$ K& G( r                optimizer='rmsprop',3 c1 }! B6 c4 Y
                    metrics=['accuracy'])4 K& d- @. L, Z8 J* e: U4 T. B
    1
    - I$ y5 ]. ?7 I$ q1 E26 A% d/ E* p7 P3 H
    3
    5 E& S, h  w7 c; Y; J- N预处理
    * T7 G0 ]2 `! T; K* ?& r+ @
      G  v4 c! p* C( Y1 v' t图形处理
    $ a1 L3 b: N, S2 b# }
    , Q% Q3 D; r/ X* Q我们还需要处理一下图形数据,把它变成我们的网络认识的样子。. P' r: y) a7 ]* _( e) J& `

    5 A2 [8 q1 N% p& T3 lMNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。
    : D/ t. j0 T# o1 e而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。
    , n8 q& X: N# F; o' n7 \8 M2 b; C- z9 g$ G8 \
    train_images = train_images.reshape((60000, 28 * 28))3 \" D8 C+ a% K: _3 t$ s2 r7 I
    train_images = train_images.astype('float32') / 255/ S  ^! f( L) w1 u. s

    ! S1 |* ~" F, [$ u, l4 b6 Btest_images = test_images.reshape((10000, 28 * 28))3 w' V8 p) n: L* x" j" C8 x' j
    test_images = test_images.astype('float32') / 255( R" r; v  _& C; M7 H7 N" N" v
    13 I" n5 E7 @- O5 G! L. S6 M& O
    2
    . a3 x0 o. d7 \% T( z! x" F  X, J3
    * t: z9 ^6 U- f$ [0 i/ }4
    2 y! o( Y  `6 k/ T5
    9 ~( l7 z7 A3 N! W* [标签处理
    1 S" F! {) c1 r# r$ y
    ' F# ^, h6 {! N6 ?. y同样,标签也是需要处理一下的。$ P9 U/ l' Y/ ], p' p4 N

    " ^3 d' [9 G; V" ]from tensorflow.keras.utils import to_categorical
    9 e, r: M' u9 ?8 P0 c! s
    ) N) T$ i) }1 q* t! |9 G8 e* |train_labels = to_categorical(train_labels)
    . v) d. `% Y: [* o- Dtest_labels = to_categorical(test_labels)' \; }1 H7 W; N, ]# n  T
    13 {; ?) K5 O% I% a- x
    2) N4 i, w3 L) i' w0 m+ V
    36 g6 Z& g) i+ z# a% B5 ?
    44 L/ |* P+ f/ x2 }- R" k# A; U
    训练网络
    ! f2 |- d0 ?) {" R  Z" k! W
    0 I. ?4 s) _1 ]+ L7 Vnetwork.fit(train_images, train_labels, epochs=5, batch_size=128)0 q& `4 p/ g; S& ^: ]+ b$ [
    1+ x  \- `1 U, p7 V3 j1 A# Y
    输出:
    , M% k5 `- c  s# E. d+ `# s
    * W5 n; i! D& O0 _* b! |Train on 60000 samples+ \1 B% U- t! J
    Epoch 1/5
    0 ?% {0 n! W6 ]+ |/ c+ e60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254- m4 _* }: Z7 g
    Epoch 2/50 U3 h% ~7 R! r) ~6 [
    60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693
    + P6 k# I9 d5 b/ O6 FEpoch 3/54 E0 ~% ^" s; c; Z6 W" ~
    60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800! y' B6 K- f! s) d0 _# ?
    Epoch 4/5
    1 n4 Z; K9 C4 u% T$ ~60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848
    1 F7 _3 \1 r- D' ~$ V9 ^8 QEpoch 5/5
    ' K5 q2 r# \. W* `7 E: \& Z60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888
    " `9 I: Z( x; R' N5 t; h
    9 \' F4 h/ r% w% O<tensorflow.python.keras.callbacks.History at 0x13a7892d0>
    + @6 w  e! Y8 ]1
    7 `: v! L7 c. m) \9 m. w$ c26 X3 V' T+ |/ T9 _0 }
    3% C" i& ~) y) g9 a# `$ C/ I
    4
    - D7 G* ~$ K, A7 Q/ _0 F0 D5( s3 x5 a( u2 k
    6
    0 u2 n. l2 r2 _4 h# O; j5 y73 ~$ f/ e' J7 }, U2 j# E
    8
    $ n' ~; E; B* K6 ?; b; l# |3 b% A9
    & S4 S4 f! m) [( ]3 A1 W" Q( \105 q4 S7 |0 ?9 d0 I+ |# b
    113 p* e+ r. u3 m( I  d- M
    12
    , ?# P/ V, s5 y: g& A- a13
    ! v  ?0 K3 o. l/ U; ~0 z& Y可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。3 t6 i) d# o8 U; T: E3 G2 N
    & D" {8 ?- @' t" I' n7 I
    再用测试集去试试:
    5 e/ X, \# ?- n5 l: w8 @$ V9 \7 U) T2 l* ?9 H( l5 f
    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/322869 [; F5 P7 n4 h- e4 i* d
    print('test_acc:', test_acc)
    % M1 r" n6 m+ Y1 c: m1( d) a9 H. z# U6 ~/ N0 i
    2
    # h8 j' B4 U! q% g; I输出:
    / i4 w3 N9 l! V* U( @! @: n2 y# @8 [0 H* y1 V
    10000/1 - 0s - loss: 0.0362 - accuracy: 0.97894 K1 |7 e: I# C* j/ Z" V
    test_acc: 0.9789
    7 P  c" w) X6 }  E& H- K7 P+ F1* j' _- I) [- Z) W
    2
    4 h5 t  F, q1 [% s0 K$ W5 \我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。& e# c" U: f; z3 i! H4 t! Y

    ) L1 u8 W$ \: y神经网络的数据表示. H& I, `% W2 n# ~6 Q7 B- W7 v
    & B# r/ K- y1 r+ M
    Tensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。
    ; y# f, j% {$ s3 J# Y& G  n; S7 C3 m; K
    我们常把「张量的维度」说成「轴」。
    ) V8 r" w6 ?& K0 q/ l. i
    9 C% f3 R$ R) g* v& p+ f! K认识张量
    : m# S- V3 s; j; F# r+ f7 ]6 F; [9 X) x; C5 H' {/ ]% J
    标量 (0D Tensors)9 i% f! n4 z* R6 d, J
    ( G, N; y3 u/ k+ O
    Scalars,标量是 0 维的张量(0个轴),包含一个数。
    5 P1 d0 [! W: n4 d6 ?$ ]" C
    7 G2 X7 a) A. ~# e标量在 numpy 中可以用 float32 或 float64 表示。
    . R  u$ a6 D" B* ]0 Z4 N" T2 o' j+ i; Q' ^% q" q( X
    import numpy as np5 u: F' O# B, g

      p1 x1 n* A& L) Wx = np.array(12)
    & t9 O" F) u% t; g9 [, Q  O/ l% qx
    . m7 J" I: {- d- `9 ?4 c* _; @5 q: y% c1
    7 m& c1 |: v1 l5 C  r  @) G! V2" m0 j4 R' F5 ~
    3! S) b8 N  o% O, ?: y- Q
    4; U4 \+ O* m, ^- {* [* ~' d! R8 z
    输出:0 {/ G7 a. g% j" t$ m3 Z+ P0 y

    " \9 z9 h; O) o' i8 U  Zarray(12)
    & G; @: N1 T; ^2 r1- ?" j( [1 C' w/ U
    x.ndim    # 轴数(维数)
    , ^* s. Q. V  C% n0 x( |1
    & L5 f2 j/ ^8 F2 o' t, {: h* E输出:# g4 Q; Z* a5 k& z

    & e# D2 c' w) j/ g" S2 A9 s) Z0 q, P1/ B) }4 i" l6 G6 M! I6 D
    1
    ! _  R) k$ ^: s$ q0 l4 q! ?  z向量 (1D Tensors)/ l4 |2 _5 ^0 y7 F0 `; n
    ! o" h* b# h6 E& t. u
    Vectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。+ K5 a1 g" b9 g) F. D2 F" l4 \

    4 x: D8 E4 L9 _6 w% d6 `* qx = np.array([1, 2, 3, 4, 5])6 S- B7 w. M- I' |+ y. x7 s0 f" G
    x
    " d; r+ F% z6 n2 @$ ]! r- q1 \1
    9 A/ s: `' D+ E3 ?4 v# u" M2 T2" N" K' D# e6 U6 M- G, S
    输出:7 I/ Z$ [: s. |

    # ~* g& u+ R8 u7 H& `7 F& O" R8 _array([1, 2, 3, 4, 5])
    4 |; B: R! i( H4 l+ z7 e+ R1* o  Y0 I- \# x4 `9 u9 J
    x.ndim: X  p9 Y0 e' l
    12 R4 Q  \, k; `3 L9 ~5 X" ~
    输出:
    ! e: `$ w7 ^) ~
    9 F8 u+ }+ w7 \5 G3 Y9 _7 j1
    & @) u+ V& ?4 |5 a" }$ _% f0 j1* x  @1 P- ]* y1 H% l) M( d. ^
    我们把这样有5个元素的向量叫做“5维向量”。, I4 e  H, L8 ~" ]+ z& G
    但注意5D向量可不是5D张量!: M0 ~9 O# c4 I! Z& ^  ~7 f0 M

    ' E: X1 c7 f, y$ h& V  G2 a" o1 M5D向量:只有1个轴,在这个轴上有5个维度。
    ) ]2 z1 H- e' G6 W& N# S5D张量:有5个轴,在每个轴上可以有任意维度。
    : E+ @* L; G6 g7 r( [这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。* {- Q! N' ?5 f3 }$ e) p- |

    9 m/ j; }5 I7 |: v" O4 m所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。
    ( W# l7 N  f2 @. c/ R0 t8 R  v/ R) {  t* Z6 ~1 y3 {
    矩阵 (2D Tensors)3 N; ?- \  F$ H, g) v: q
    ! b1 J6 X% M/ T2 e! B
    Matrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。9 ~9 g4 }5 m) E( Y/ Q6 f+ y5 \  t

    ( M; w& U4 k9 [% lx = np.array([[5, 78, 2, 34, 0],. d: d% L/ N" }: h5 V+ f+ q
                  [6, 79, 3, 35, 1],
    - z9 @- C* {7 h' R& I$ _9 P$ z              [7, 80, 4, 36, 2]])
    9 n0 R) x& X9 j0 \x: y5 W+ ?! B1 I7 [
    1# r, ^" u' I  [3 Q. o5 s  j
    2
    ! H+ W$ i* C/ e% _0 @% `3' b$ Z( B) g7 q* z4 ?, e" U
    4" F1 u2 y+ V# I" O- q; g: |0 A
    输出:
      g: t# v$ S7 z+ ?. W' |& g" Y4 j9 s# f* g: v
    array([[ 5, 78,  2, 34,  0],
    ( K4 I' N4 ^& f4 x       [ 6, 79,  3, 35,  1],% t2 O8 M8 I) B- I
           [ 7, 80,  4, 36,  2]])
    ! g# o$ O1 j9 p. c) I3 q( {1
    , `: @1 s" X: I6 e2+ I  |( s0 z0 u! C$ V. m
    3
    & i& |2 A# s6 W& h% N. G4 t3 c- j3 O- Fx.ndim" g1 B/ H) J+ }: H
    1' p5 \9 C. M. N0 @0 s; y& o3 j
    输出:9 [. c0 F9 m6 Y8 s
    , B! ]' g5 P8 c2 N  p$ Y' r6 ?0 ]
    21 W# s( j/ B& u' a, |/ D0 N& p
    1+ L: u, E; h* G
    高阶张量$ J- H  q- Z+ m& K# Q5 R
      M- U! m4 G: R. i: l- _
    你搞个装矩阵的 array 就得到了3阶张量。
    7 A/ q6 s( B9 o' F, B% h0 j
    # J" M$ M* U2 x4 n4 W再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。
    " ?$ W" l, T. ?) }: \! {2 U) _% G& I& p, J0 E, F
    x = np.array([[[5, 78, 2, 34, 0],) N. E" O! D6 n' W8 N) ?/ J* T
                   [6, 79, 3, 35, 1],  O' d3 S, k% \) n3 x$ t' N4 ^* ~( F
                   [7, 80, 4, 36, 2]],# |1 V" x4 a( J; u
                  [[5, 78, 2, 34, 0],
    2 A/ L  c8 n( V3 J               [6, 79, 3, 35, 1],
    ( [9 L/ F5 D& J9 a               [7, 80, 4, 36, 2]],5 p$ _: }( f+ w7 j. @7 |
                  [[5, 78, 2, 34, 0],
      F4 k7 s0 ~  L               [6, 79, 3, 35, 1],4 I: [2 n1 c; Y* N$ m0 \
                   [7, 80, 4, 36, 2]]]): P. V7 |& r- f- v2 n/ G5 ]
    x.ndim& J- z# v6 O% K9 Q. p
    1* N. B: N/ h. u( t# i7 o
    23 n. g/ Z/ u7 W9 @3 h
    3
    * G# `. [0 a; I4 V5 |( v) |* D5 S* ^4
    7 l1 W* ~* j! {/ x1 B  R3 R57 t! c$ y7 @5 U6 H& ^" j( M- J
    6
    4 h4 Q$ E' \- B5 [9 G; k  Z" P$ T& s7
      h9 f' x1 T1 p  j9 I80 a) w* \' R  G3 ~9 i; S  b) U
    9
    1 `% q; \2 O; ]10& K2 z$ t$ `: s% m  l7 M9 S; @
    输出:- ?) _. I$ V! y2 U& d7 P) B# o

    : Z! v9 V1 ^' a1 s4 o# m38 {. _) T' y0 p. M4 y
    1
    . N0 N; E2 i% Z4 _6 \深度学习里,我们一般就用0~4阶的张量。
    $ X: q9 e) S8 p+ _9 v3 P0 x  k! ?7 Z# n: }2 _3 }
    张量的三要素
    # E- |, o2 m. L; S: T! Q* T' \3 |2 b9 \
    阶数(轴的个数):3,5,…; z* P! [4 \/ N' W; l. t
    形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…
    & W$ |& E  G: D6 o2 K数据类型:float32,uint8,…7 q. i. Q- t0 S+ ~, C; }! E
    我们来看看 MNIST 里的张量数据:, e( o" P" T% ~, y% m( k7 A( _
    ) k" t2 C6 I' W% e- \! Q7 R1 m+ W
    from tensorflow.keras.datasets import mnist2 p( V: U3 D( \$ u
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data()# y) M$ b: W& f: g% M

    0 j  F) w# `. Q5 Q9 @print(train_images.ndim)
    ' R( Q/ R+ Y0 D$ l* b# B5 Mprint(train_images.shape)
    / T! I$ `1 i" e) x  [/ D# lprint(train_images.dtype)
    5 O+ I; m& @2 `, r; P' ^- n15 I; l5 `- E2 h* I8 Y8 C
    2
    & P+ ]* h; \8 P* S( u3
      q9 z* w0 q* B) ]7 u5 B4; D& N1 K" a' I, J% T
    5
    ' f+ ^* {1 m5 j) |9 u- A, p0 }( Z% s6
    " ^+ E7 g5 o; U& s" |输出:# R/ p8 k- H7 x; l$ {/ y4 j  P' m

    . Z3 M, Y: z; @  u3
    % p- s6 {+ f) {# I- ^% w( e(60000, 28, 28)
    - ]. u  a8 Q: ?5 y) U* @; u6 B: iuint8
    9 P) \5 e$ r+ U4 |' ~8 ?- [1
    + t+ e. [* t4 Y/ `! ^" `7 j$ b5 w2
    ' u, g6 i+ O5 }8 V0 f( E3  w- {2 U$ ^- F4 h6 ~
    所以 train_images 是个8位无符号整数的3阶张量。5 t% k8 j. G: c; v% q" M6 [
      E! @$ |4 O4 n$ p6 T3 F# e
    打印个里面的图片看看:0 P; h; n0 u7 L7 q; Q. ^) {" `

    9 N5 N# ]* K; c5 n6 Kdigit = train_images[0]1 i+ Z' u8 ^5 X& ^- C

      h5 c) e! I) W% g3 w1 `import matplotlib.pyplot as plt/ q2 w# p/ f0 m  G4 {
    ! {5 t; m3 g' n0 }$ \+ B; o* q
    print("image:")3 D  y1 ^5 s/ Y/ v' U) c. b, G
    plt.imshow(digit, cmap=plt.cm.binary)
    " ~+ Z; Y9 A4 ]6 a) Y; _$ v: Cplt.show()7 Q, L- w! J! ^% b
    print("label: ", train_labels[0])/ I- h: M1 W: t' M& I* `- t" K
    1
    7 ~( Q# E# I- V6 h# f2! t, D: ^0 j) e; t3 T
    3
    4 \, z7 a8 |9 {* |/ N& o) _/ W6 R! K4( q1 {; j, @6 m4 ~, g  U: Z/ a% Q
    5
    ( s  U2 b/ N+ S. v6
    1 L1 v- C# ?9 Q  g" i74 p' p1 I: O8 {- t
    8
    8 x/ c: n* \' T输出:; e' o, m  m) ^
    6 [/ v  p+ x* W+ t4 Q& r
    1.jpg ) B, _  ]# t( e  k0 k2 r. V6 l

    & N$ v# S. n8 l: Ilabel:  5( N, C/ t* S1 J
    1
    9 W* `) C# F, S. W1 k" K4 oNumpy张量操作
    5 G2 g0 A0 r7 q
    $ v4 {. j! T" y' |张量切片:  g. W$ @6 f# ~

    ( E& n# {& w, _; ?my_slice = train_images[10:100]9 c" b; Z6 B) {, n3 ^
    print(my_slice.shape)9 T2 Q' m$ [" n3 T
    1+ |$ `/ t6 t, k: b$ J4 c7 S
    2
    ; [2 U; ?9 o$ q6 C8 `输出:8 h* q1 B( I5 e2 u* ?& P! h
    2.jpg
    6 k: `- d; c3 M* l9 W(90, 28, 28)
    / |* m% M/ `! ~# A16 j* m$ d2 o, j3 I6 o1 _
    等价于:
    9 d: \7 v* p* Q% v5 T  X% j
    / H2 i# C" a1 n- A* z- R# ?my_slice = train_images[10:100, :, :]4 T  J" o; t+ f# B, \
    print(my_slice.shape)
    ) E0 O* e' [& W5 Y2 T- j/ A: Y/ v& A1/ o6 M( |& ^7 F& V$ {
    21 \: L$ I$ Y. E
    输出:
    9 d* d/ c, [/ I' n( v5 x' M" u 3.jpg
    9 I! e; t- g# p1 Q" Z5 N/ a0 b0 z7 w(90, 28, 28)
    . E- [7 P9 m' V) d/ X( p1
    # I  U! d4 B4 i# e也等价于
    : Y' l5 m8 H0 I' |, o
    $ }0 B: N  ]4 c6 H1 D2 F6 d3 {my_slice = train_images[10:100, 0:28, 0:28]2 f* z! X7 d5 E) D6 j) K/ a) v) m# b
    print(my_slice.shape)& a: |1 M: S- @% n! [
    1
    2 o" n5 X7 L; O+ m2
    1 _3 q7 Z; r% c输出:* c0 s9 }5 J+ I1 L: w& X& p

    . |4 W  Q0 i" p! }(90, 28, 28)
    $ ?9 A; t8 Q# Z8 K  K) _3 i1, Z0 F  H5 }7 H' b" ?. w
    选出 右下角 14x14 的:
    ( Y- ^* b9 |0 D( v* W7 j' o  k, z7 X1 @3 q# u3 L
    my_slice = train_images[:, 14:, 14:]
    / j, U0 A8 }! S/ e. j7 Cplt.imshow(my_slice[0], cmap=plt.cm.binary)3 S" A9 a: f/ g  V% g' `
    plt.show()( J/ B8 f4 d1 v
    1
    * K0 }/ D4 A, S; N1 F28 `& d- \5 Q- F2 n$ v$ p  |/ w; I
    3
    - C7 D) S$ M- r  I输出:
    - f- l& b) {: ?  Q0 W5 {; C" ]( Q. c% v

    ; v5 b- B- q+ k; n- N6 y! K' i; U" H$ h; c
    选出 中心处 14x14 的:
    * D, i8 o! u6 I7 w$ M: N  E. t3 _1 r: U; k' B  C" q0 h+ R) I# @; b6 l
    my_slice = train_images[:, 7:-7, 7:-7]# d0 M3 a3 I. W' H& O
    plt.imshow(my_slice[0], cmap=plt.cm.binary)
    3 @6 _! q$ E8 Xplt.show()
    * \: U- O" F# X  N9 I7 K. b8 }: W1, H  j2 v0 u8 A; f0 u3 Y' \( r* P
    2
    1 w1 J5 J9 W1 M3% U% i  C' J2 I/ L
    输出:
    9 ^: c, u) O3 t4 F/ ~! n: t6 z! z0 A6 R* l
    $ X4 Q& i2 @% O: K
    # u: R5 i0 [' u5 q3 t, U* X- o8 e* e
    数据批量
    . @  c) M) ^; |- T0 Y! r, e! c
    ! u) x6 d$ j  H深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。! w9 s9 ?2 P5 k1 r7 g" X; ]6 R2 E9 m

    % g0 R& y# h! K5 a深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。
    " E. O+ W) D6 D( C! t6 Z/ k3 c: I* Z4 D- G, F: v% ?9 n
    在 MNIST 中,我们的一个批量是 128 个数据:
    ! V  T9 O8 l" v$ t; h; u4 D7 I! ^7 A
    # 第一批( J! n6 c9 H, I) a$ w" c
    batch = train_images[:128]/ g; O% ?3 ~. L( J4 r+ n9 T) X
    # 第二批5 O  u2 N( u& V3 s8 w* }
    batch = train_images[128:256]
    # z' X  L" Q8 q1 j5 m) E# 第n批
    + h7 I2 \+ F6 E% _- Gn = 12
    , H2 @! t: u; _7 Hbatch = train_images[128 * n : 128 * (n+1)]
    8 A& }# ]' V! \9 e1& T! [4 z) l7 H# B$ A* {
    2) w3 G% ~7 k% A5 Z2 n  N
    3
    0 G1 U1 w, ^4 Y2 J0 U3 v7 S0 B6 ]4* u6 @. W0 Q& X3 o/ K
    5
    3 O8 ]  K$ r$ D- D% w) d% i6
    7 z$ }5 t; ]) X+ j9 c7
    ( s1 j! l1 A( Z所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。  W$ [- h# i; V7 h! j6 t. J6 g

    % ?% n# l4 M- X8 }常见数据张量表示! T( L, I# p3 }4 L

    5 l* ]6 l9 }* l9 U; ^. J- c/ p6 t- i数据# P/ J/ G0 ]& s; p" i& Z
    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 17:18 , Processed in 0.444907 second(s), 59 queries .

    回顶部