QQ登录

只需要一步,快速开始

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

    + d, K7 u0 r4 h. I) ~3 E, D; oPython深度学习之初窥神经网络
      M% E0 ^3 P. b4 |. v本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。8 X! ]4 P3 l9 ~

    , Z$ I4 n* `3 ]: `" w9 \7 a4 Q本文目录:1 {3 s2 w& a! V0 N$ Z
    ( I9 O  J3 L% [  F- V' v1 |4 c
    文章目录
    ) U8 n/ T% R1 m. x# d7 S% M3 _, }  ]- q; B9 h; U" I
    Deep Learning with Python
    3 q$ f0 y+ y1 B4 @% ]+ P) ]初窥神经网络" d, M4 Q6 d( L0 @  e
    导入MNIST数据集
    ' q: W: B/ F4 J& Z9 E+ D/ n' L网络构建1 w3 z! _  R1 }3 A
    编译6 u% x8 M% \. L, W
    预处理
    6 j- `7 m- W6 m8 ]图形处理
    . j' `! L! q" k! {- X" R标签处理3 ^6 H6 [0 D% x4 A
    训练网络: K3 w" |8 T9 }. @
    神经网络的数据表示1 j; f; o5 \7 Z0 z
    认识张量
    ) ]; o9 {/ O; d7 L. c标量 (0D Tensors); X" u* i" T" l; `: h' ]1 y! _# s
    向量 (1D Tensors)
    4 Z! a: I4 f2 ?  ~矩阵 (2D Tensors)5 `9 B$ W  @* b, t7 V; ^
    高阶张量
    ) N5 l/ b( @0 C0 r张量的三要素; i/ _2 k' @: I( S$ k. ?3 a
    Numpy张量操作5 k) r* P0 I, Y6 L8 Y& Z
    张量切片:
    5 v1 T: L2 t7 m5 h! [数据批量* G$ g' @5 E7 Q; z8 b! H$ W
    常见数据张量表示* y$ t6 g* a# t" z7 k0 J& w
    神经网络的“齿轮”: 张量运算9 N% ~: W( w- _5 k1 W
    逐元素操作(Element-wise)4 j- j$ J" g0 G/ l
    广播(Broadcasting)
    0 Q3 b7 W) ]# j' E+ o( Y! n1 F张量点积(dot)* `* I+ w& {& v! h
    张量变形(reshaping)
      r$ J! M! I! L- h神经网络的“引擎”: 基于梯度的优化
    " j6 F5 X4 ~* W5 r' Z导数(derivative)
    % t4 s8 H& W, Q2 s& \) t9 A6 L% j梯度(gradient)+ p- k$ H) h5 J
    随机梯度下降(Stochastic gradient descent)
    4 _/ [7 R6 u9 |. t% n4 n反向传播算法:链式求导1 h) j2 w" X2 f3 e0 n
    本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。$ E1 ^3 V- L/ f- d/ n

    / a. n, x) p. \. h. x. Q+ m初窥神经网络
    " |% E) x) D& c4 H; J
    & ]& ?  O$ N5 y6 J/ C4 F8 d6 Q学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。8 P8 H' b* {* @# k9 A8 \
    # h/ ~- y& t# b- b
    MNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。
    ( C+ j! h8 y8 ~  M. q' x8 y. g1 G4 h1 q' v
    导入MNIST数据集7 b- Y7 H$ p# f

    ! x  z6 ]) U* J7 B4 |: z2 t# Loading the MNIST dataset in Keras* d- @& [  @3 t
    from tensorflow.keras.datasets import mnist$ w7 N; ?2 R! N1 a) Z. F
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data()
    * m" `7 z' F( w/ S' R. h17 ^# z% G' a- o& N
    2
    / ~* h5 g9 q3 X3 g3% t' ~; ^0 U- W
    看一下训练集:
    0 T- b  x" a: X$ x3 p8 |) Q
    * p* h* X* U" ~. j% q0 s( pprint(train_images.shape)
    % G8 d1 g* z: K" }print(train_labels.shape)
    ; \0 c: \: [: ~# Btrain_labels
    # E" y  [! w7 ]- a' X/ E" z$ S: ?1% V0 w9 A" t$ |. [# b, V4 e
    2
    ! e/ X, k) b3 C/ u. L6 t3
    : s) g1 V3 o% z7 r3 g输出:! E" a9 Z' R6 H. U. A9 }

    . k: x0 k* q' G' x# U(60000, 28, 28)9 }# I7 ?  q' r0 x; C4 q2 s
    (60000,)
    " J& N# V9 h" @4 l$ E# l$ V9 [
    3 l! ~' x: \1 c4 w& C, jarray([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
    / M0 s# p$ S' R$ t1
    1 m- U% x0 W2 m/ K9 q- `) z3 |% C2. }1 _! G" f; A$ d" X: e+ b2 h
    3
      F2 \! ?0 J; X6 X4
    % n1 v! I2 z; }1 |! W8 C3 k4 }这是测试集:+ e* k1 c2 i: T$ W4 b

      r4 N: X/ j0 s0 Iprint(test_images.shape)9 |, q6 s, u5 D* w
    print(test_labels.shape)7 F" c7 ^: S8 i; e* P
    test_labels- A4 q  d; K* \8 S0 x/ r
    1' Q8 K, P, t$ D3 d9 O! i
    2
    + D$ U& ?5 F* U$ Z) H' ]36 R) z' W+ L5 x$ @1 b
    输出:
    % ?- t* g. }1 N( F, @9 R1 a
    $ x+ c# q( v& S+ X; n. Q: B# X(10000, 28, 28)  }: K+ L; x8 I9 }0 V3 y
    (10000,)
    7 q  R9 f3 Y, p5 D1 H! n) `2 {$ S+ w, |8 y, f9 A
    array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)
    4 c, b$ e2 U$ m: j; R1 l) Q15 ^/ ]* }. @9 k* [
    2: |; ?, F( i. Z0 L/ E
    34 y9 F* c0 i: v' _7 g
    4
    0 d2 @2 N7 B6 x& X: u网络构建
    0 {# d# M5 z( e( A7 A1 O1 ]- g' W* x+ P0 d" ^  o
    我们来构建一个用来学习 MNIST 集的神经网络:
    0 M8 A' \! A1 }8 t6 }+ A1 R" _& F2 }: y$ V- O; f
    from tensorflow.keras import models( r1 U# @: e' j" S) x
    from tensorflow.keras import layers
    : O# r$ b* Q# [/ Q; M: C7 ^# b2 q' d' M. m2 }; B9 u" Y  J8 M
    network = models.Sequential()
    ' `5 f& U. y* y5 r9 ~1 tnetwork.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))/ T* }4 b- b* {2 h$ I$ ]
    network.add(layers.Dense(10, activation='softmax'))
    + A* D) X8 Q! H3 L& b) b! D( w1
    $ i* C$ L/ w% p8 ?, j* F2 g2
    0 d' S& K8 _; @, F, [) a3
    4 R: e2 B1 J: b: Z4 Z% v+ i4
    + t  D# L: h: T) ~% B' V5 }5
    % e5 Z  i9 q4 E$ A  }6
      D5 |  e0 r0 Z6 S" E5 K, `8 p神经网络是一个个「层」组成的。) f4 ^" Z2 G( y' B8 ~
    一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。* `* O% ?" J% s) p! L

    . i% o: d% E$ z1 u这样一系列的「层」组合起来,像流水线一样对数据进行处理。
    . U! q3 _% a1 @0 N8 f层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。
    / |: z1 ^! C# |, l& K; V! _  D! d& D
    我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。5 k3 {0 u( ~* M% l! {* I, K6 K

    1 |% P" ^0 Z7 S: G数据到了最后一层(第二层),是一个 10路 的 softmax 层。
    $ X* f, m. J" X% A" A2 Q% g8 K这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。1 h$ a: |1 P6 S9 F2 I5 Q8 G
    事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!  w6 j8 ^) `$ r! Q
    % k7 h. ]% U3 I" E8 K' [
    编译
    4 J+ B# p6 z- V9 x
    ) l# l& s3 Y3 L8 k0 b! n8 d接下来,我们要 编译 这个网络,这个步骤需要给3个参数:+ g( p2 `. A, G- r4 y8 t8 v

    - q1 o( M3 X. L* r0 d4 `' }9 t损失函数:评价你这网络表现的好不好的函数
    . K8 I6 ~4 y0 K& K+ M优化器:怎么更新(优化)你这个网络2 ^; T7 H5 p" h& U6 J/ o, `7 O
    训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度
    8 h) B* T) j, anetwork.compile(loss="categorical_crossentropy",
    % }0 o4 `4 B% f3 V                optimizer='rmsprop',
    . B, }) B$ y" `" l( _3 a                metrics=['accuracy']). U- O- P+ I8 @$ |7 d
    11 ?6 L2 u, R+ r& i" m1 M7 B6 ]
    2& s2 y: X2 O; M' `. }' {
    3
    1 g/ [. I7 u7 u' c% x! ]预处理
    % [: x  L, O2 ^7 G& u  M( [9 d1 B- y! S- _, U1 M6 N
    图形处理
    ' g7 q) u# S+ \: e+ U7 P  B+ R
    4 E1 y7 j: D8 f) C5 I' K1 b我们还需要处理一下图形数据,把它变成我们的网络认识的样子。1 N3 l9 a# f0 J' E+ e  W  C$ \8 g

    ) D% p4 }9 v' d9 K& HMNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。
    7 U% q1 ?7 u7 \  Z而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。' W+ k% {2 \  C( i$ l

    8 Q6 ^  \5 H* V7 p  [train_images = train_images.reshape((60000, 28 * 28))
    ! @2 H% s$ H3 {2 e$ ktrain_images = train_images.astype('float32') / 255
    ) I" \+ \& V% b4 r: @& d- i0 V* ^  D0 ?& z/ E. z# h
    test_images = test_images.reshape((10000, 28 * 28))4 @6 I2 P. L' e5 W
    test_images = test_images.astype('float32') / 255
    2 v/ \6 S  D+ B, s4 |. o1
    ; V7 O3 _8 D+ r" [2 p+ {7 P24 I5 y* K; P! U' c* P! O
    37 F0 q. N: |* Z, N8 Z" ?& s0 h
    4" C: s( _9 R1 b$ J1 E5 Y$ E
    5
    & I, x+ V2 m: I标签处理
    3 ~  e- t* g# T. B
    # ?' \7 }' A- i9 v& U同样,标签也是需要处理一下的。
    ! _& F! c9 h" _4 v8 z4 S
    ! e: C3 M6 ~. r7 X5 mfrom tensorflow.keras.utils import to_categorical
    " ^+ o; g9 ^- d0 e* A- a" }4 a( {: i
    6 V: D4 }4 ]4 d; r- a$ O9 Itrain_labels = to_categorical(train_labels)$ e9 G6 e$ {5 g' {
    test_labels = to_categorical(test_labels), _' D4 _" q5 K# R$ L% i
    12 g6 T9 A9 c% b4 x$ Z
    25 [# z7 s9 T0 G4 P
    3, V$ p" Q# ~& c
    4
    3 Q. H9 L6 P4 N- K: `7 ^( X训练网络
    ' g- X& J  D" q5 J  Y6 K1 u! G+ d8 z9 ?  T7 G5 a
    network.fit(train_images, train_labels, epochs=5, batch_size=128)8 y7 |% ]; G# x3 _  ]
    1
    : @- o& C: u% f5 g, Q# r& D输出:
    ( J/ b1 d8 J" a# W4 W: \5 h5 S, l; V! G( d0 i$ r
    Train on 60000 samples; J% Z# Q+ x; T& _! T' P- r
    Epoch 1/5! O5 s: i: T, V" D# g
    60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254
    + O0 x5 P8 ]0 r5 d! GEpoch 2/5$ f5 Y5 D( v7 d- g
    60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693% G$ N! o; r$ X' s- X9 }- Y
    Epoch 3/5) I; \  M- |  I& B: b4 o; W# n9 n
    60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800
    4 O/ e! ?! O5 p- LEpoch 4/5
    $ e% c2 I/ U; y6 B" N' [60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848
    1 }; `! r  N" j1 E+ zEpoch 5/51 f2 h7 B, ~( j% J
    60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888( X! Z, O5 s! J: d0 M3 K; k

    8 f8 N9 M5 {7 m9 K' H<tensorflow.python.keras.callbacks.History at 0x13a7892d0>
    0 j3 W& J! K/ F' X( H5 k1( q; |: ]9 X: S; D- M
    28 ]  S; m  H( M" t- B. I/ |
    3+ U3 Q2 L+ L0 ~4 r" D  a+ }
    4+ X, L! ^& d2 ~! ^" `% D: k
    5
    ( k4 [6 |  O* v5 U* L4 n6
    ! K0 z* @& t/ L- s- M8 n, v7
    $ n" d7 V! |# D! O3 Y8% _9 c# `, l/ o) t& n* |. ]6 C3 K0 {
    9" z6 T! D7 C3 z. C" \. r
    109 |" Z6 P- c% E! l! Y
    11
    5 K( p; R' q+ U  N+ h% H12
    + D0 W. t5 f0 ?1 }; j13
    ; _. e7 N; l, A% \6 W# I  W可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。9 {' A# m' [( I% d
    ; {4 `$ v+ C' T2 a, P* s! |1 E: I
    再用测试集去试试:
    2 @9 N, r9 L0 O0 S+ ], a; s
    ! K5 t# S, p- {# I: z, Mtest_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
    9 v: z& i' k2 W+ dprint('test_acc:', test_acc)" F1 i& W  A  d: J5 ]
    1% ^/ [  V( I$ G) B' Y- e3 i$ l
    29 U* }( s' i% b( u4 L: {: t
    输出:2 X' y3 _# C, u7 I( \' c# R
    8 r" S# R2 M0 g( r5 t2 v
    10000/1 - 0s - loss: 0.0362 - accuracy: 0.97890 W! N3 W. y3 U( Z2 Q7 `
    test_acc: 0.9789& I6 _" G* }+ H( L* D- O. E
    1
    - L0 A1 O- `& K5 B; a; s2 h+ X2* k+ D8 b" q" s. I6 k
    我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。
    % B& L) T' T# C  y% D' _; I9 Q& |# x: j2 h9 K' p( x2 ?/ F5 \4 b2 v& _/ z
    神经网络的数据表示- k  y+ V8 C5 C# c6 H

    / g7 M* j* b' P' E" ?+ kTensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。  M  _+ s! O6 p: D9 g9 o

    ! J5 H3 x9 `7 s( Z- ~我们常把「张量的维度」说成「轴」。+ R$ M% R+ o& }' E& R; |

    ! D' N4 Q8 R3 B! x/ @2 F认识张量' l" M/ T+ _* N- n  P6 T7 W! x

    , d; z2 f5 l* a( T标量 (0D Tensors)
    ; {) e  z: h8 d1 x% W( c# {1 ^/ c4 Q0 c' P7 q( \
    Scalars,标量是 0 维的张量(0个轴),包含一个数。% ]$ w1 r4 A; h0 z* s  l

    ! V, @. z) L1 H) f) y标量在 numpy 中可以用 float32 或 float64 表示。
    7 K+ n' y9 w- a5 \" [  f! C0 P- j* P0 X8 a9 J( U3 s
    import numpy as np$ \9 P5 @7 P  E9 `8 p

    2 ]1 |/ \6 e) `1 hx = np.array(12)4 i" r7 O* C9 s0 a9 e/ B( `
    x
    / G# a' {1 C6 p; Y% X; k# T0 X1$ G  |$ R3 D$ c4 A  W! A
    2
    9 n4 y7 T7 v. U5 G3+ H/ O- L  c6 m4 `3 W3 p% _
    4
    & L# s8 r0 l- P) o输出:- b3 T. M6 }+ ^' c
    6 L3 ^( k- Q# H/ ?- ?. D
    array(12)
    % H6 A0 J! ^! x1
    $ n2 ~. Q" ?+ ]/ B* ^4 F/ q2 k! `x.ndim    # 轴数(维数)
    " ?% ]  O! D3 g1
    & I$ y- H4 Y) V6 k! E9 w3 b输出:8 {0 t. T* x/ D. x0 e. Z

    2 ]& ^. b  l* ]) \3 t1" ^9 Z# l4 L0 [* ^: U
    1
    & r+ X/ X8 y- f9 y向量 (1D Tensors)
    ) Y* v! e& g, t; O
    + s1 A1 Q. m% `: q6 r5 MVectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。4 N2 O) s: @! x8 L/ U. I
    " B# C5 b" q1 _* B( i
    x = np.array([1, 2, 3, 4, 5])3 W8 f7 C/ d( N% n
    x9 }, D5 B+ Q" o
    1
    , S5 E0 P4 h  N, ~  e: z2
    ( r6 g4 O- L8 O, ]" d- |$ I; U输出:6 R) }) ?" V* E7 R5 h; ~

    $ w, h& H  [8 C, _* {7 @0 Earray([1, 2, 3, 4, 5])/ r' [& w: g3 W& f7 ~, t( {1 H  T7 y
    1
    5 j* G9 X; F- Zx.ndim
    0 K$ Q0 V  J# }9 @5 x# |! [: ]. Z  N1& I8 ~% ]& S( e, t$ w2 M& k: E
    输出:% w# j+ f7 @5 }( i$ w1 z* F- I

    + p4 S9 l8 o) y0 U6 Z1$ J) p2 t! J1 d/ \4 W( ]/ P
    1
    % f+ g7 d% [! N& n2 c* m. h我们把这样有5个元素的向量叫做“5维向量”。
    * l* w) v( L! E: h但注意5D向量可不是5D张量!
    ! a, F8 H: @1 n5 I  i3 Q- f% I! T/ b- V4 q
    5D向量:只有1个轴,在这个轴上有5个维度。6 @7 w( N$ k# j4 w. A/ f/ u
    5D张量:有5个轴,在每个轴上可以有任意维度。
    ' V, i' f( W" n1 O9 z这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。
    - f3 b: R& u  H; p4 V5 }+ u5 _$ Z; ?# W, ]2 n
    所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。2 z7 N" I9 E; p  D1 @& e

    3 F% L" {; l( D- y4 X4 ^( F矩阵 (2D Tensors)
    - A" T! A4 i, l; ~4 @0 j
      Y: w6 w( g4 \; B  mMatrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。1 ]8 l3 T1 n; H9 v7 h
    - Y) F: t% G( R' f" i6 ?5 ?2 y
    x = np.array([[5, 78, 2, 34, 0],. o+ Y# }% n2 {2 N. W. d) k7 ?
                  [6, 79, 3, 35, 1],
    0 D  E' k  ~6 h1 u" F' J4 R- @/ A+ v              [7, 80, 4, 36, 2]])3 c/ S9 w! g& T# E! x) h/ P+ [
    x7 t! M5 j$ A) x8 G, d% t8 B
    1% l9 b" x) P, l- i& z7 G0 W" ?
    2/ D6 p% z% L. n7 ?+ b9 X
    3
    6 u6 y6 |. F3 O* s" W6 K4
    ! Z0 u+ b: y  K' m8 c2 K# c& x输出:, O4 w* |; U3 N' s

    ' u3 E! t9 J) [% g; ^array([[ 5, 78,  2, 34,  0],
    ( b/ X- z* ]+ S$ @  Z       [ 6, 79,  3, 35,  1],3 E( A; n! v% E' U+ r
           [ 7, 80,  4, 36,  2]])5 C# y& o& m' J: a6 e  h  u8 d: Q. j
    17 K$ ~2 K3 _8 I% K- i: Y6 ?% N" d
    2
    1 s$ ]' l* K/ T5 g& G0 u3
    4 a- ]+ r) A; ]" f/ Z4 j& @x.ndim4 ~1 m. d4 d/ R
    1+ P; |  ]* C6 u7 g$ m4 j' z; }
    输出:
    6 `- B1 F% i) |5 o# P$ V7 a+ ?8 N; P
    # ?( ?2 {3 f! v" {2/ Q1 J; a" Y% X& b1 r
    1
    5 N9 E- M" [" l! u/ _% ^" o( D高阶张量0 q( q) ^2 p$ {& Y1 k1 _( U
    2 b9 w: u; g- |+ A' u) V
    你搞个装矩阵的 array 就得到了3阶张量。
    : k. s! P& K' ^5 {* j3 m' J( f6 I: j9 a: M& o
    再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。
    ! J3 x" c/ q' T! q$ I- ]6 N
    / m- b$ {+ v( ~5 U! K$ cx = np.array([[[5, 78, 2, 34, 0],- r$ \% U8 ]1 Z5 {2 M
                   [6, 79, 3, 35, 1],$ k4 c0 y% J2 t7 @8 s
                   [7, 80, 4, 36, 2]],
    6 g5 a- [) X) b9 ]5 p# u) ~              [[5, 78, 2, 34, 0],
    8 G" ?; r- c  d% y5 z& ?               [6, 79, 3, 35, 1],
    # F( p3 F( c* N7 z               [7, 80, 4, 36, 2]],
    # ~% U% w2 z% m              [[5, 78, 2, 34, 0],% x; G9 w. i9 p
                   [6, 79, 3, 35, 1],
    3 S6 E* H4 }; ]% s- G: C9 n               [7, 80, 4, 36, 2]]])
    , q8 v8 t% I: r3 I, p6 [/ Mx.ndim* K0 B5 ], x! E
    1
    8 _2 A- O1 k. M/ F29 P9 h* ~, @6 b3 D8 ]5 V% O9 L
    3" S+ t3 x6 J2 X6 h
    4
    2 Y# e: D" G; t) J( K. ~# S5
    , ~# _0 ~/ |# `) C6 @6& I1 ^/ w" X- T+ q
    7
    $ d4 M4 _% V3 A8
    " p) P- b$ [4 x: k( k# y2 r9' U& e0 n  H. Q; q, i( _" C  s
    10+ c( g1 v6 t7 B+ w' D) o
    输出:
    & O4 `* V3 l2 V$ s+ q! b  h9 M3 l* m
    35 @' M* k" }( B$ k+ @
    12 @4 F: J# `& V+ W  a. ?
    深度学习里,我们一般就用0~4阶的张量。3 ~; j6 y8 O' o$ N) e8 n4 F

    4 `! |# c- @, \9 N; U张量的三要素
    7 P' X; v. H1 J/ O  D/ @2 }% Z( m" B& V$ f
    阶数(轴的个数):3,5,…
      B6 e$ V, n, R9 Q0 Y- R9 X5 T5 o- C8 {形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…5 t: s  O( ~+ F' M
    数据类型:float32,uint8,…; `! q9 E- \* H- {/ j
    我们来看看 MNIST 里的张量数据:
    # A. V+ ^2 j  Q# d$ n* e
    5 A4 v4 t5 z" ~. i. _from tensorflow.keras.datasets import mnist. j5 e! X, Z9 E  a0 r6 z; c
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data()
    , M7 `# j0 |& r8 G% y- q- k, ~" P" B! D, O! \4 m8 _/ |
    print(train_images.ndim)
    6 I7 }/ S) e0 b4 g% [- gprint(train_images.shape)3 N& [2 T7 W9 W4 c2 F
    print(train_images.dtype)
    & O8 l, W/ r* n14 B- K) V  Z3 r3 c
    2
    ; d4 b* q1 D1 m9 ^4 I39 K/ g! A9 ^" d5 \$ j
    42 y% g3 ^  C# ^' C$ X& n) L
    5# r- G9 c! g2 c# p8 ~4 k* R
    6
    + h5 I+ S6 t/ b+ _0 Q# t' K输出:
    8 X+ f, E, d3 \  W: u3 m" I9 f1 Z. T& x9 \/ @8 Y! W6 h' ]
    3
    ( Z) c3 _$ b' _% R2 _7 _(60000, 28, 28)
    1 h& O! E# N5 h, I$ p) B8 Auint8
    , W# t/ B9 S+ t# [1 ^+ V1! x/ t7 R1 T: Q' z
    2/ [; X9 ]  h2 R+ H+ [1 U
    3
    4 G# F0 ]4 Y5 M所以 train_images 是个8位无符号整数的3阶张量。- U8 J1 S4 a7 ^' Q& f9 w
      I% f1 N2 Q% z" t$ T
    打印个里面的图片看看:5 ^, D* E7 X% F5 G4 y
    : g5 U  R( U. Y
    digit = train_images[0]1 ~7 t0 J0 d; K  U) S/ a6 Z1 Q& \

    ! V; _  D  Z/ E" L) C9 \% f  k: z# @8 fimport matplotlib.pyplot as plt
    & J0 z' T3 ~, F; l# ^: W& F6 f7 u) u
    print("image:")% m+ Z/ A& [" c# x
    plt.imshow(digit, cmap=plt.cm.binary)+ w0 E. @, a5 a
    plt.show()0 v3 |; S! E# V3 B8 X! E2 `# t- A/ R4 k) j
    print("label: ", train_labels[0])
    , v# [+ r2 H0 c! ]3 J1, J) k' m) @' `+ E' k& P
    2
    / p& E0 q7 Q9 t3
      H. m, w* P8 Z# Z. t4" |- Y5 o. K+ O8 A
    5# ]; x5 _2 L8 ^1 z& B4 h0 }
    66 C+ D# S  b  s" J: g
    7
    # L( Q5 c( U2 x$ [) p' ]1 n8* Y" M0 {  J2 b( @, j( `( K0 Z
    输出:# [7 `; M& B6 q6 J

    : N0 `4 n8 ]: z! Y 1.jpg $ q  h: p2 x5 c* y

    7 T6 r' h% y4 I7 z2 ?. @; A) c2 t% ^label:  5
    3 k3 ^! N/ s* n" k8 Z9 W! X- ?! F- a1+ |+ y( F2 O! y" d* ^; E
    Numpy张量操作2 q3 y) F& z0 w& _- a; M" F
    / L  R7 {+ `" S8 W5 T
    张量切片:
    . N5 g! N* Y: c* c# D1 l% [8 E) C$ A& p
    my_slice = train_images[10:100]
    , V, c+ ~1 j8 }$ g- |print(my_slice.shape)
    + f: q4 y- P3 v. t6 \18 [1 j& k" U. y" K
    23 w9 ]- c& x  f! @  B
    输出:
    ' H9 u/ q7 Q2 b- T: {+ p 2.jpg   K, ^* o! k" y. E5 R' K
    (90, 28, 28)
    3 W2 Q  Z! g; _' E6 Y) E# P1
    5 _; W# Q  q  k等价于:
    & a# ^6 E- _( X% ~
    ' ?. Y. s+ ^% x' L( j  amy_slice = train_images[10:100, :, :]6 g" F% x1 s) F: I
    print(my_slice.shape)
    / V) F( M0 G' [+ U( @: E- E1/ y8 O; }0 E! b
    2! z* B: F+ p2 M/ M
    输出:
    * w& G+ d" L: x+ v( k 3.jpg ( g$ o( h  c5 y
    (90, 28, 28)
      h1 _9 g9 h) Y' N, {15 F) o' }( {4 L8 ~7 u1 `, c' `. h
    也等价于
    ( j, R% A$ X8 v! M  S
    . t3 ~6 a5 T, _% vmy_slice = train_images[10:100, 0:28, 0:28]
    / M& B0 \: {$ a( a5 Mprint(my_slice.shape)) N1 `; q" W3 i! m1 \
    1: K6 c7 A  i8 \, I
    2
    & v1 H& I1 h, g5 \输出:  R0 \7 q$ U7 f1 E! y8 [" I

    ! I" J# g4 t: }% i, A(90, 28, 28); c. w# T" Y1 G2 K
    1
    + a6 i/ |! w2 i: F选出 右下角 14x14 的:/ k6 i" u) G, Z2 t' L( I) O
    1 c+ w5 c/ Z: `. h( Q% R
    my_slice = train_images[:, 14:, 14:]! C" ^  t* G; Q% y" O/ y' k
    plt.imshow(my_slice[0], cmap=plt.cm.binary)
    7 x. A; {- l1 \  `% L- Iplt.show()
    / t' l) w, S, Z: f, |1! M1 m9 H+ V' E1 D3 e  F7 `( D
    28 k9 S" x3 f; \
    3
    * \" _  Q" j: Y3 b; h, `* [输出:6 \) T* _: ^( g* K) q
    3 R0 f+ }- y. M, I

    1 R% D% `5 ~* O4 s- l, F3 b. C
      P8 f  c; o2 n7 n选出 中心处 14x14 的:
    $ a% ~% z* n) p/ ]0 N0 x6 }- ~, l3 c( m$ Z' s* [% Z
    my_slice = train_images[:, 7:-7, 7:-7]
    $ `. I+ j5 u& tplt.imshow(my_slice[0], cmap=plt.cm.binary)# a& H* ^2 D5 I- i: M) r9 c4 b
    plt.show()
    $ E' g- G/ m* ?/ _% ?1
    # }- H3 h( [! i; j2( N; T2 H9 t6 y8 ^/ t
    3* A5 v% p& v( X# N! X. Z
    输出:
    % F3 ~& o) R' a! V  t5 w. e8 F& k  t1 k0 G. W/ M6 F- [' Z
    # D6 x6 {" j, Q; P* b  |% s0 Z* t

    1 |* X$ y8 v! ^1 d$ n( u8 y7 W+ M数据批量
    . e. K' [$ U/ D( V) K0 P$ b" t
    深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。
    : G  X. {7 [/ O7 v) g
    2 Z3 t3 ^4 {. u0 L% _% P" l$ K深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。
    8 A) ^/ h- P" o/ _% z* W9 {7 U! N+ D; G! Q) c0 T# d. q. d% A# L" f- Y
    在 MNIST 中,我们的一个批量是 128 个数据:
    ; b. H& q& ]1 m3 ?: ]3 ?8 f/ n; R/ a/ c. i
    # 第一批% d1 y) G8 h+ |6 v
    batch = train_images[:128]" f. j+ n9 A! X4 q
    # 第二批
    % }; O7 Y8 |* x8 ~3 g$ j6 |batch = train_images[128:256]
    $ O2 |  b' a6 H  n# l8 ^4 S# 第n批: R) O7 R3 ^- e4 C9 E; P; \
    n = 12+ G' Z! l  F# U1 ?- S7 P
    batch = train_images[128 * n : 128 * (n+1)]
    5 ^2 s2 ^7 G# n0 @/ ]: P' e1
    $ C* V6 \% `) Q2 L28 s9 }7 j; i6 e4 A4 Q
    3" Z( d8 Q  c( W2 _
    4+ V' h& m* @& _! A
    5" e  B9 o2 d4 w8 a' ]- R3 {
    61 e3 f, C1 g/ ^$ Z; z& T! E! a
    7
    $ v( \5 t% t1 D所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。
    9 l( d0 _  k: q- c& w& z6 B& d
    3 o+ y6 `5 Z5 x3 i0 C8 z6 A常见数据张量表示) ?4 q! K; f* a7 n4 s/ @2 [% k
    - X: U& }/ }1 S3 O$ b% Y& p
    数据6 Y; ?% C+ ^3 h2 g
    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-1 22:17 , Processed in 0.372883 second(s), 58 queries .

    回顶部