QQ登录

只需要一步,快速开始

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

    7 O, L4 O/ H% n; V1 VPython深度学习之初窥神经网络
    3 D# }6 M( v! G# u: R本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。
    - w* }* c- I! l" S0 p& x
    , \$ }) o$ {. n7 ^* a; u本文目录:
    8 k4 k7 e( ?9 ?) C) ?4 Z
    7 J# m! W: H  M1 j- _5 a7 o文章目录
    " h5 S, R5 ?2 q/ @' K6 q
    0 S) s& `6 ~3 A! i# n* x  f- ZDeep Learning with Python4 K+ D# R0 d, ?: \3 ^9 ^
    初窥神经网络$ X# E) ~: r6 S- S  e
    导入MNIST数据集: _( Y% q" E3 S1 G6 ]
    网络构建6 R6 A- H+ H3 F7 Q
    编译7 N% p/ j8 X* j7 M7 a. r  h% X3 L
    预处理3 u, b' r6 c  Z8 q5 E8 m8 H( U* y
    图形处理& A1 Z8 c% g6 t$ e7 I
    标签处理
    8 v  e$ w: l1 [) {7 m8 f) ?训练网络  E7 c' T2 }2 ?7 {1 B; b
    神经网络的数据表示
    9 ?* m: z' U/ ]% @5 q) p8 [! D  H认识张量
    . P) Z3 O% i: {- E% J标量 (0D Tensors)3 P) B! A, K$ }9 d5 t' P) l: W0 t
    向量 (1D Tensors)
    ! t# Z. y, j2 A, D) n矩阵 (2D Tensors)4 q' M9 H8 l. ?9 p* s
    高阶张量
    5 t3 w, _1 C3 [$ {张量的三要素' j5 U! ], X0 m5 a) k1 I
    Numpy张量操作- i/ q3 J' |. r9 Q8 Z" w
    张量切片:
    % ^2 k! D$ j  b% F/ E# j& d2 z数据批量
    2 y% ?, p$ x1 f# D常见数据张量表示& w6 L; v& g1 B# D6 }* r  s
    神经网络的“齿轮”: 张量运算; m& N, D; Q* {& K
    逐元素操作(Element-wise)
    " F. z5 i( |& _& m- E* o' d广播(Broadcasting)
    . q1 Y6 c' `0 T! X张量点积(dot)
    4 _4 ^: o! |  @. Q* b/ j张量变形(reshaping)/ w' W& e9 E: i) y6 {
    神经网络的“引擎”: 基于梯度的优化
    ) Z, c$ ^  w, p; o4 z: Q导数(derivative)
    / ^- G' A6 t) w梯度(gradient)6 h8 R: Q5 G8 K6 c% A& b4 c
    随机梯度下降(Stochastic gradient descent)
    0 Q( G+ j3 T, q6 |6 J反向传播算法:链式求导5 w' l& D% K* Y4 ^$ [& G6 }$ O
    本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。  q3 |' Z. U4 x: g- \

    9 p7 Q& I4 \0 w! y# y5 {* j初窥神经网络% v0 t, D, ~6 {, X

    % ~: ^+ f. q" d) F2 Z$ ?学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。
    " c* D! G, l5 X! V6 i4 \* x3 i, l3 E8 M! x5 A9 _
    MNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。. @% S, q2 a! K6 o* ?

    7 w2 N  h# m, G- S导入MNIST数据集  ?/ W+ l  Q' P
    - y: C" Z1 C1 v. ]
    # Loading the MNIST dataset in Keras
    6 e& ]4 f% P% c7 y/ M( b, K0 j/ hfrom tensorflow.keras.datasets import mnist' p+ s8 w# D, i1 d
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data()! \8 ~' L% J% b6 Y3 X4 Q
    1* `+ S; G* h& R, Q  a# G  E
    2
    * M) Z, w. q. N3
    6 A* X* S7 W) \( n看一下训练集:
    0 v! G8 E7 d3 P6 G. n4 u3 L3 ~+ v1 J+ w) U1 F
    print(train_images.shape)4 w$ G5 t% _( _+ @. L  V
    print(train_labels.shape)# c1 B. c, a: r  G2 b8 ^1 u  F/ p! T
    train_labels) }" B( U0 V7 X8 I6 w3 |
    1
    : K& [" b2 B+ A/ Q6 ~- b2: }, ^* S: i; M0 p
    3
    % r0 }  L% q4 H& z7 q+ c输出:% Y7 T) Q7 F) d3 Y0 X% j

    8 Q6 a! Z3 K. h3 t9 y; e+ g(60000, 28, 28)) U7 q) g8 N2 Q
    (60000,)
    # ?! g+ l1 J3 D; |9 ~+ T5 ^# i  p0 S) K* w& ~9 P/ O/ r: Q% }
    array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)2 Q8 Q3 Y. `" m- W1 p0 [: M* i
    1
    ! m' V' z5 U8 ], O  ~1 W3 a2
    $ B3 c$ N: N' L* x3! x* g4 Q1 h) Y  S
    4; _1 m. e- ]( j9 ^
    这是测试集:
    6 M, ~( |: P1 f. D  ~8 p. m4 F+ p
    print(test_images.shape)* U0 O9 o+ d3 v. e2 I7 A
    print(test_labels.shape)
    + f5 r( h9 Z# t# g: O1 _test_labels
    8 p" V& W% l# r# L1
    4 v8 K: ]+ W% s2! y' Q: Z- r& }8 ~& X4 X0 F2 ]
    3
    ( i' p% j. s5 i+ i$ F3 g0 M输出:
    + J. F$ n1 w7 B& w6 R5 X" y
    / S6 t$ N! c3 b* Y/ j: x( [2 j(10000, 28, 28)  G# q' k) h! W0 S& r( o
    (10000,)
    3 a8 z% {8 k$ N/ J2 Z% k) _  T
    1 {" Z9 ^1 }3 Y4 Sarray([7, 2, 1, ..., 4, 5, 6], dtype=uint8)
    % \2 d1 q' d/ q- \3 v1
    - f, n8 t) _3 e& Y- L2$ H1 I/ F! S2 y4 i9 y2 O9 u) o
    3
    7 r: Q  v7 `' X: E( `4
    " a- i+ X9 {, c( g8 n网络构建
    ) P. J4 r1 j  V: G6 k- Z2 `' l! j; W  w/ H2 S( ^
    我们来构建一个用来学习 MNIST 集的神经网络:
    ! }& D% t. j4 f& F7 G& p  r: H
    & L$ d3 m5 j* T9 Hfrom tensorflow.keras import models* ]  g# O1 d9 K) s" [
    from tensorflow.keras import layers
    $ \8 `# b! U* N2 Y7 O. K% W( P9 _3 N2 v+ H4 a' V; Z) @, a
    network = models.Sequential()
    - j4 P. e+ T; A; Fnetwork.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))
    2 \/ e; k' c" c1 K9 Dnetwork.add(layers.Dense(10, activation='softmax')), F6 J) x; X& i: o
    12 M$ \7 O1 C* V: _  Z3 t. V
    25 F% t' G# p/ }& b
    3( g; x: `" t9 m! F, i% e* z* C1 F
    4
    ' x# F( E5 m2 z! h5" P: y( |) {6 K/ [  F. H/ h
    6& Q) ], I8 {6 E! g' i
    神经网络是一个个「层」组成的。( x4 C* v' s( c
    一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。! e2 ]6 Y  `4 S- x
    " m! j4 k& d# X/ e* `
    这样一系列的「层」组合起来,像流水线一样对数据进行处理。+ k( {& a9 N; v, I' o" [  S
    层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。
      I0 c" V! \3 f" i- x$ _8 s" @( U
    0 r: k2 M0 G( A+ R4 E$ O我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。
    4 x9 E  j: T# f: Y$ N' d3 B- E! y7 r& d
    数据到了最后一层(第二层),是一个 10路 的 softmax 层。
    $ o( Q' G( `* x* p% w* S& W这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。
    2 @2 O+ M* M* M事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!9 B5 a9 V& P, x7 g3 \( b1 G) Q- T
      r+ u( n4 w) B- n: d
    编译# L7 N5 }" V7 D/ L
    9 ~% Z& R- i, u$ X, H7 z! W& w
    接下来,我们要 编译 这个网络,这个步骤需要给3个参数:/ p4 ]9 E0 ]' S+ a$ V2 Z
    & A( S* K( N: X
    损失函数:评价你这网络表现的好不好的函数0 G  k( Y6 Q2 U0 q; s/ P# J/ _1 ?' J
    优化器:怎么更新(优化)你这个网络
    3 q. `+ v4 D2 |* p) k训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度
      Z- J9 `, s4 o8 h2 I2 E/ enetwork.compile(loss="categorical_crossentropy",% g/ W, a2 k' z. G
                    optimizer='rmsprop',
    ' @( |4 U+ s" S# E, r                metrics=['accuracy'])
    8 {0 v/ Y. L1 ~( ]& d1
    ; V! K5 b- j1 S4 }2- H! N* |, x& w8 @
    3
    : S) S1 m- }/ ?9 x' R预处理+ N3 ^: ?* D* _5 c$ s) S' T
    " M* t4 ~% L5 A0 i
    图形处理
      H! Y/ V' L8 Y8 Y/ y4 i
    $ F& h' r, @" r- G0 R我们还需要处理一下图形数据,把它变成我们的网络认识的样子。' m  l+ z- w; c% ?

    9 @8 ?! H4 d& V4 NMNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。) @0 c0 \: P/ ?2 `/ K, z3 s9 `
    而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。
    9 m: a0 p7 K8 d+ T: a6 L
    ; Z# c; J4 [1 a+ h; rtrain_images = train_images.reshape((60000, 28 * 28))
    ( E3 F4 R- b. @2 d4 |train_images = train_images.astype('float32') / 255
    # u- g6 j/ n" j" k
    * `% b# m  e% K$ P3 ftest_images = test_images.reshape((10000, 28 * 28))
    & b& x2 @7 a! |# a, ^) stest_images = test_images.astype('float32') / 255
    9 \" i3 t. I  O10 l2 l8 I# ?2 k6 P
    2
    : f4 r2 }  X6 R3 [1 _3: F0 t- [' y( T' t9 H& c7 N
    4
    4 r9 H, ?) J& A; O% s) s; I5 \5
    , z' K. _( A6 C! O标签处理# Z7 I# Q( N  b& V; a& Y% H
    9 Z7 ]1 o2 Z+ S" `  P
    同样,标签也是需要处理一下的。
    ; U) L# W1 q# t7 G: I1 k' _) y7 z' P% W" L; x/ E- T
    from tensorflow.keras.utils import to_categorical
    6 s6 @. k+ C2 b" y9 _4 J4 y  R9 S. ?" v2 X
    train_labels = to_categorical(train_labels)
    $ ?4 a! T, Z2 {+ }/ z; |1 }" Qtest_labels = to_categorical(test_labels)" F& Y) h" Y' H- J/ k: N3 }( p
    1
    ; N0 |; v. n7 W2
    ! C  ^% P, y& e4 T# T5 W$ i3& Q* @& S3 B3 i3 M/ j* I9 F
    4( z) J' L+ Z; V7 {
    训练网络" ~$ T( u* a7 N' P' B

    2 e! `. s" E8 l$ B/ U0 `) I1 gnetwork.fit(train_images, train_labels, epochs=5, batch_size=128)6 P. P2 \! v6 O9 f% s, Q1 g
    1/ ]4 B2 b9 }" R, w8 D( D- Z. R
    输出:
    - E' o( n* a6 i. O: e/ L. j6 i
    ; Z( I1 _$ o* Y+ R) V. }Train on 60000 samples
    . R: l2 M  g0 v0 ]: z: Q) s- i" g: SEpoch 1/5
    - ~: a, c7 ^0 @; ^7 n60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254  i* _8 }0 m  o
    Epoch 2/5
    ! R. p: }3 P2 \6 u* r# l60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693/ {3 P* B2 i3 u
    Epoch 3/5
    ' r! V8 ^) s$ V60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800
    " V2 j2 ?. m: W; dEpoch 4/5
    * @% j0 q8 ]+ e( B7 b- ]60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848
    $ F  g2 i  r0 j. Z8 h: xEpoch 5/5
    # c* h7 h6 B# _1 Q: Z( k60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.98888 _+ m% k. s5 f8 c: s
    2 }2 G4 B2 i$ f5 e' W/ ]
    <tensorflow.python.keras.callbacks.History at 0x13a7892d0>
      s( \. m, m4 }7 ^% u; `1' [2 {9 j. l( y0 H# Z  b9 X
    2
    - r  U6 ?- U7 _2 @- |2 ^37 A+ t' u( ^: h2 F7 g& q: x' {
    4
    # g5 W  Y# B7 }. J0 ]( ~5$ `- ]4 G) e+ \$ q
    6: j/ h5 R. H  m8 L
    7
    1 j! U& d3 K, s8 p, ?! I9 ]8
    ( T! H$ @6 k; v$ n3 y: w* b' u- V! y; F9& ?& U' S+ M& q/ \$ s1 k
    10; W1 X8 Y5 T* ?. i0 P
    11. W; [* }6 Y- O# k& T
    12+ V+ i- [* A& l4 [4 r2 R
    13
    & S2 D. \! [, q. M可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。
    ' |% x/ c7 f8 z2 o6 A! b* t9 p0 J; @4 {$ t2 q# y
    再用测试集去试试:' b# h  r0 M- }* x, g. j

      m6 C/ [/ B2 L8 y% R( ]4 n: vtest_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/322864 P) z6 k: _% C1 Z- E
    print('test_acc:', test_acc)
    ! D  |8 Y/ t6 x' a3 W9 g+ x14 r  h; B& X4 l$ ?% ]" }8 g- w' ]
    2
    & A. D8 B* C/ Z2 I" z输出:
    " d. r: N0 B: f/ `& b7 H
    3 R; Z7 X! C3 W) @10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789
    2 y% _4 j+ q& w& C+ Ctest_acc: 0.97897 X+ W' x5 X1 ]/ w; z) }3 E7 E
    1' e0 J0 [/ `7 |" T5 g3 P/ o1 Y" D
    2
    / H3 n; B4 k" C2 b$ v/ z2 p我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。' i/ l; R4 L( h; s6 k9 F/ ~
    9 z: N% o6 N- c, _: C
    神经网络的数据表示
      [+ Q% C$ A( Z, g) X- B) M  g! w, l& k; Y1 a1 b; j/ h
    Tensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。* J. c& j% m) F2 L
    $ i6 T& S9 G" T& z! q/ G
    我们常把「张量的维度」说成「轴」。3 l, G: e1 v- \) {- v  v1 s

    . H4 ]2 _; N  v, c, \% b8 B认识张量" @  Q/ e. t' E1 G' ]* q) O

      |! Z# y9 g% m: i2 \8 b2 n. c& J标量 (0D Tensors)
    - q( Y& M' \3 L2 i& e4 Q$ Y& [1 q& H$ N9 z
    Scalars,标量是 0 维的张量(0个轴),包含一个数。
    / m' |" A+ J5 W1 m
    ! I; r! X9 n6 t1 [. V标量在 numpy 中可以用 float32 或 float64 表示。
    $ V7 G% I, Y$ I  l$ r: P4 D% `1 D! V' S  n6 K% j
    import numpy as np% M+ {4 L0 g  X1 m1 }$ X' F8 o
    " Q, d6 Y+ o7 T6 L1 B% a. j
    x = np.array(12)
    - U1 v& g' U1 M  g" s. m9 Ax
    / g9 R4 W& U, ]; _) ^1+ b% Q6 O4 R9 G& \; d* r0 w2 T
    2+ Y+ k: D. [% L3 Y" h
    3
    . x1 w; u- R+ v4 j4
    6 n" f5 s$ ^0 @: Y. \输出:
    * j* I' @" s' Q) \7 C2 e5 I) j! O# `2 S& r) ]8 P4 B8 [) Z
    array(12)
    0 y0 M0 w* @5 c4 E" h6 K1 @0 q1 [7 d$ N1  \+ \; l1 Y2 A; B3 Q" r4 o
    x.ndim    # 轴数(维数)
    4 |! r6 c/ Z5 I1( B: b( i7 B% p. C. @
    输出:" X. r% O# i# p. F& u  o, R9 k8 o
    * W, G; C2 @' P' ]! a9 _
    1
    7 T. _, ~4 x0 W5 B4 O! F1
    # b8 Z  C) I. V& C% K& y3 n向量 (1D Tensors)
    - e8 u& d0 H5 E' ]; U/ \
    9 s' ?( [, r& j4 ]/ P. _+ wVectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。
    0 ?4 V$ r( p6 N9 V0 E5 Q6 ~5 Z5 P8 N
    6 {! e( J% s, e% v/ e6 Ox = np.array([1, 2, 3, 4, 5])+ ^/ S+ t$ \+ h) X+ m( O9 M+ O
    x
    + |* ^3 Z( ^7 n8 R1! x- w, G0 p0 J( B
    2
    & d8 I0 k* Y1 k& }. X输出:3 u. m3 u( q4 t% J% [/ z
    : e4 r+ [  T- s- Q5 V9 u. _
    array([1, 2, 3, 4, 5])8 r" j) g6 Q# j5 k0 v
    1; H+ m3 i6 o5 i" O) ?. o
    x.ndim, v# k( T/ q+ ]
    1% q% v( a2 T$ A, H. g/ R- k
    输出:
    . b3 S8 i2 h; y8 ?- L  R7 O& ?* ^7 Q" @* B, Z2 Q
    1
    ) z' A. k  R; @1
    - L) s- X2 b9 g& n) N我们把这样有5个元素的向量叫做“5维向量”。6 {$ r, u% ^- X: {8 `' E; A) a
    但注意5D向量可不是5D张量!! _! R9 C, W# d; n9 P
    4 @) s+ E7 j. T1 L; z& q
    5D向量:只有1个轴,在这个轴上有5个维度。, o" i, o9 \" ]7 Q* t5 X' |
    5D张量:有5个轴,在每个轴上可以有任意维度。( C! R& C3 W; X. G& {
    这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。$ p) v' B1 J- l. ~5 H

    * {1 \, C  P- E1 H" j( e! e所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。
      H& b: c+ b7 [+ L$ H: W
    : _6 t6 t' @% [* M矩阵 (2D Tensors)
    7 I& k0 T! O3 R! P- i% z
    7 W3 z* e% P. r. u  ?Matrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。
    , y- Z) k( a3 L' d/ ^2 n" z8 A
    % y2 k' N0 R4 ?1 ~, w  F# Wx = np.array([[5, 78, 2, 34, 0],
    + u4 }! Y* M7 A- n9 X  s/ y2 c              [6, 79, 3, 35, 1],
    3 d8 l# H( D) k' i' [/ a; B              [7, 80, 4, 36, 2]])
    " I/ L+ k1 ~. a& j+ e2 W2 z- px
    , e/ h, u9 |9 z' L% l1 z4 d8 Z1
    2 d& B0 u- q( Z( a% ?/ W2
    5 y7 x' U3 }- V3% A! B2 ^- Z8 n5 L: V
    44 V+ d7 u5 z" E) p- f
    输出:
    : ?9 [# g( L0 z/ M7 D
    ' B6 X, ]% y. {4 V# {  s& S+ Q4 Darray([[ 5, 78,  2, 34,  0],
    8 A3 w. r: r/ z+ n' G       [ 6, 79,  3, 35,  1],
    " H  _( e5 S6 y  }. X       [ 7, 80,  4, 36,  2]])
    : V: Y/ ~/ e( m  L( }+ x8 x1' F, ]2 r% I9 C# W  O- a* @" z
    2
    3 b. P  ]5 Q# a1 w3
    " l4 r, }9 o, a+ w5 ]! c. d" N2 b" Wx.ndim
    ) Z, T7 Y  S8 J. v* c# i- H7 J1
    7 E7 e4 B1 s& b/ ]& W输出:# a% I) P6 N8 j3 B" ]5 b
    $ b) H( {7 M& U7 N( D/ O
    2
    ! B5 r# o' O5 R/ i+ }( V0 J1
    6 X4 F8 L+ D; V/ x  T1 }. v) m+ V高阶张量
    0 P5 j& G: k9 j1 f" }6 ], H9 R& p& s
    你搞个装矩阵的 array 就得到了3阶张量。
    2 L2 K) K) Z5 Z. y$ O* N8 X; y+ M2 Y
      w. }' B. d) @再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。
    , ]6 A, c; u( t0 `  U+ j* k3 Z4 X4 @# b" P* G
    x = np.array([[[5, 78, 2, 34, 0],* k. j! r1 U5 q1 C( x; p
                   [6, 79, 3, 35, 1],& D8 E: b, E$ K0 R  h7 f
                   [7, 80, 4, 36, 2]],
    ; b/ {( ?4 @" ~0 h+ d( x9 w2 p              [[5, 78, 2, 34, 0],% g) @8 l, z+ V; s. W/ R
                   [6, 79, 3, 35, 1],; r, ?9 F; b, O
                   [7, 80, 4, 36, 2]],
      \& {% p" Y% `$ d2 [              [[5, 78, 2, 34, 0],
    . y* g$ X; I) ]0 r1 a9 z               [6, 79, 3, 35, 1],$ W7 o$ U# v: i! L
                   [7, 80, 4, 36, 2]]])
    0 R' Z. O: T& `3 ~, e# i8 _x.ndim/ b8 x& G% C4 z) O6 ]. G7 y
    13 w3 A. s5 z  A2 _( `5 I9 d
    2
      f. ]; I: X' `: P3
    4 G# A0 G1 q7 w4
    ! q8 R$ Q6 o0 j* P; L! T( c" [5
    1 c8 g( t9 M# v* d8 A6" C+ L. H9 X0 B$ w5 q- [
    7
    8 ], d& V( K4 Z4 h" E/ ?8% U# |# }2 \5 c( u7 m
    9, \  ^& h- E& s! O! v/ ^
    10
    - E( m. _; s4 [# t7 v% x0 f输出:
    ! S0 N1 f) C4 w: h. [: `1 Z! E
    ; H! ]( b! Y9 H+ ?7 y- G2 O1 M3
    , S' T$ ^, Q4 m6 L1
    % P. K; i' H/ d0 e深度学习里,我们一般就用0~4阶的张量。
    $ w, X" N7 X0 O) z, a& q* n7 C( C' U9 ^( @
    张量的三要素% i1 H* G5 k* M( v9 C
    ( b. Y0 m+ Y8 K! a, ]
    阶数(轴的个数):3,5,…
    1 O, \/ c! s5 h' K; Z形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…+ C$ t, Q" \; a* ?  @4 Z7 b6 X1 A* F1 x
    数据类型:float32,uint8,…
    3 I" \: x# i9 |3 `3 v. q我们来看看 MNIST 里的张量数据:
    $ [% m$ u" }& {5 O* V) S8 g9 p; }1 y
    : `; m, @- L3 x9 afrom tensorflow.keras.datasets import mnist  @0 C# K9 ?3 T
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data()' g) T9 @, Q" }  N0 V( Q
    9 `- g$ P, c5 K- e6 {8 v, F1 c
    print(train_images.ndim)1 y# _  ~, w/ ]7 D/ g6 I- Y
    print(train_images.shape)
    3 h+ q$ K: |: A# _% f  E; \print(train_images.dtype)' W) G5 b+ q; p8 |; H
    11 t+ z3 ~% ^6 H! k( k0 v
    2
    7 h! t, J( j) ^, B5 U: u3/ y" O1 V4 {, x" `, {7 R
    4
    . _4 C5 y  h. y4 `# x. |9 @5  M: n3 a4 a4 h8 w5 }- K: e
    6* W6 O* N, S) e: U% `
    输出:
    : N  r- Y9 I% C1 Y( q; u* e; j
    9 l( j/ E6 N# \* T" m6 y; p6 Y3
    : h+ w) _5 X, s) ~( B  W(60000, 28, 28)" |. t% `# g( ~
    uint8. U; q# R' T8 V4 E+ b1 h
    1+ n7 j3 x; i3 a, k
    2
    , F) W/ w, a3 M' H; i7 a0 Z. i, c3
    . o; {2 G0 {- v所以 train_images 是个8位无符号整数的3阶张量。
    : e2 c3 \" g7 n0 P) |- y
    # V9 v: C. q1 {打印个里面的图片看看:
    * D- [9 a# H3 M- a1 _9 i) R  h8 s4 {7 n
    digit = train_images[0]: k$ X: G5 {4 S' ^+ K

    , ?9 m# \# v+ ]' L1 t  Nimport matplotlib.pyplot as plt
    : ]- {3 K$ G: O8 N& I2 D4 C3 f( {' ]
    print("image:")
    - O- ^' k7 J5 aplt.imshow(digit, cmap=plt.cm.binary)! y7 e0 B9 ~- q4 J8 l
    plt.show()
      q) o# ~* _8 kprint("label: ", train_labels[0])" I6 |, [) y& R1 r8 r5 M
    1
    9 `! X# C# ]) ^+ O2 I) d25 g$ x+ H: L7 n' U# s
    37 w6 C4 N3 S" d( x& ?& |& h
    47 [9 H+ h" [2 `/ I: e- ^! g2 Z
    5
    ! I9 I- Z% d3 K' D- H; j6
    4 C- o$ ^+ v( H7 Q+ O7
    : N2 E8 h* W4 e. V% l; e: R81 d. S4 o! r4 y/ l" V; @  s) M
    输出:6 S7 N9 b7 t* M' l
    / A; L2 e, ]1 k" S+ H. S( q
    1.jpg 1 \* A0 d0 ^+ p+ N
    ! |3 |1 v' P' B7 p% O. ?) S# p: x3 X
    label:  5
    / Y& y& w3 ]  v/ P, {1
    / I+ q( {5 F' u7 A2 kNumpy张量操作) y3 m: P, R1 U; A: |; X

    + M' S' O: ~: W5 Y张量切片:
    + F4 d2 w3 R0 r: I, S: z
    ' J  l! r& X) p, Amy_slice = train_images[10:100]/ D8 F- f4 }9 @6 a  ?  q) P
    print(my_slice.shape)
    ; ]' l: b7 y/ h( ~2 }1
    . o4 }+ u8 U% n25 ]: c* M- O# \$ y; e! K
    输出:
    3 \: L. ?. {0 u: z* p6 P  Q 2.jpg
    / S0 ]+ z* U: Y+ {7 Q2 I(90, 28, 28)# E  W+ R+ u. N! t, ~7 \  r9 y% t
    1
    4 g: T& i, \& F( U9 h" d等价于:
      I3 W% T' v: f
    , k& t5 k4 ^. B. n% ]my_slice = train_images[10:100, :, :]
    ( I+ W9 z1 ?9 {- h( Gprint(my_slice.shape)% S1 O  w( b+ X" p7 s- h- L7 e# A; \
    1+ ^! E2 \: M" [& c% I3 z+ B* O; [
    2; ~5 X0 d3 h! m$ ?. W! \, m
    输出:
    7 L0 I  k" \; Q  P 3.jpg
    : Y( q5 T3 z3 }; d  Z(90, 28, 28)
    7 K3 B4 A% V2 i1
    & ]" L3 F5 A8 t! o7 G也等价于
    1 m$ \' c! H& V$ l  O3 L. }
    ; B) ]1 F0 U! x& I5 j7 h. imy_slice = train_images[10:100, 0:28, 0:28]- J; D! L- ]* [& z. B
    print(my_slice.shape)+ B# e# S3 B" [" B4 \- c5 S
    1
    ! t" b, W- `. k& {; n4 x2/ C% T2 S- ^" E; m3 q4 M
    输出:
    - r1 \- s$ l; M/ Q9 ^/ M
    " h# z* S7 Z3 \$ G(90, 28, 28)% c- Q) O& Q* d8 X( X  Z
    1
    * j2 i" J+ ^# M* F) B3 S选出 右下角 14x14 的:
    ( r$ n9 m3 m2 E2 E/ `
    . V- [  F) s' S7 P! S$ Pmy_slice = train_images[:, 14:, 14:]
    . d) N2 `4 J* [6 Lplt.imshow(my_slice[0], cmap=plt.cm.binary)
    $ E/ V9 y$ T. f# G5 Tplt.show(). z& ?- ~: K. r4 H2 \$ U
    1
    $ U$ ~( u  B$ c: j# d3 B2
    3 T; I. l/ {1 b9 R% Y( P31 ^2 }6 ^7 j6 U4 u5 L
    输出:+ p& a6 c! u* m9 j6 f% Z, {

    3 v" ]8 h& _& w- z. R2 W
    ; f# x& H: k" u/ \2 {
    & Z5 Z6 c4 Y$ t# w! ^& `" F8 ^  j1 u# J选出 中心处 14x14 的:
    . y4 M/ O5 {7 S$ b# W
    2 [6 }! y# j6 u' |1 H( xmy_slice = train_images[:, 7:-7, 7:-7]
    0 M: J5 E% L* @plt.imshow(my_slice[0], cmap=plt.cm.binary)
    * U9 d  m- {/ e: Q' @- }0 l9 yplt.show()
    ' N2 b1 d3 h3 P; N5 S# A+ w1! H4 Y2 A& A3 p
    24 U% Q/ p, L# T+ E% W, r
    3
    . M+ `0 I% B" S  c+ @输出:6 d3 |% W: `* A

    # m9 |; o' p: @3 q7 E0 L3 X( t- [2 v8 q  M- `# `  I' r6 T& O4 c

    + O1 N- v* ~$ j( }+ _数据批量
    6 l; o' B/ i6 {" A2 O' H: c
    / D) z3 A5 p. F7 N0 o+ P深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。  c3 {! j8 {% C, G0 i% l

    1 V. c: }/ S, F. D  e深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。/ c9 @2 @6 q* ~+ d/ ~1 i4 o

    ' v& }0 x5 x* [在 MNIST 中,我们的一个批量是 128 个数据:
    9 J; V7 D- H6 S8 E9 ]4 Z, ?$ F' ?( U: h* i, x% V) g
    # 第一批3 |$ F; ?. L& ~& f
    batch = train_images[:128]
    ! X- ?# ~6 v& q8 f: Z1 ~- ]# 第二批, Q" c" A, y8 ~* k
    batch = train_images[128:256]
    ( N; {7 K4 G5 A3 v: j! k# 第n批
    2 k3 I$ D2 t6 X" n! X2 V% Xn = 12
    , [. [& u: z8 Zbatch = train_images[128 * n : 128 * (n+1)]; ?, i6 k- c9 K6 S1 d- r+ J2 X
    13 \1 {( a  w3 j* ~
    2
    . o" r4 _) f; f8 i7 C' {8 _( D3
    # o  Y; d: u% @) R* x  m) h; |  R4, j9 ^0 [% P2 H: F4 J- u# v
    5) \) y; G. i7 W! b0 i3 d
    6
    " y+ s  k0 E- q2 J6 N' Q8 l7" b: ~6 r- }: H& i$ Q
    所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。. A- }- \0 p, o, S! [. `: ]1 y# Y

    % d) G8 T" R9 s# n- ]) C" X常见数据张量表示: k% o, S) i. {# Z1 x

    # H7 q8 }3 z. ?, j7 _数据
    ' c3 l: ~! j! t# h3 r$ ~
    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-19 06:32 , Processed in 0.464334 second(s), 60 queries .

    回顶部