QQ登录

只需要一步,快速开始

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

    % ]) i- D. d4 ]! a) @4 tPython深度学习之初窥神经网络
    ( v: p3 ]) z# c. W' e4 S, f本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。
    0 D2 J! O/ G( J* E
    ! O* R! \7 f4 V) u$ M' C8 Y( \本文目录:3 }) A* X8 l% G( T3 P
    0 K0 b; [0 X8 z7 `6 [4 U7 |+ T
    文章目录7 X6 j/ P' v( H2 l6 j
    : E# r% u1 u8 V: I. X
    Deep Learning with Python& u" B; F' u; H! @  s9 K2 Y
    初窥神经网络
    6 g7 P% E! }4 u, [8 l导入MNIST数据集* c# n' \& J9 M" u. R- i+ L
    网络构建7 m8 U9 {3 y8 x0 S
    编译/ y$ y$ N' {9 d
    预处理
    : [& P* Y5 m. i: s3 R: s图形处理
    8 n0 z# H' A% t) ^标签处理
    # s: w5 T  z$ R' f3 k0 @训练网络
    ! s9 H5 w0 ?, T4 e, [神经网络的数据表示
    5 f6 t% t/ m: F" V4 S- x认识张量+ y+ K, R0 \( k" m8 N1 e+ @! t* {) ?
    标量 (0D Tensors)/ I. @+ e+ [4 t" Q; {' s% I$ U
    向量 (1D Tensors)* C% l$ n6 x9 Z8 b! Z3 t& M
    矩阵 (2D Tensors)
    ( b  H0 ~6 p) x1 ~' n, [0 ]高阶张量) f0 l" Q, ]! y6 d; L) |7 F
    张量的三要素- N, w4 w$ Y, {7 y! z
    Numpy张量操作* n/ R' O# o4 c8 }9 R/ \
    张量切片:" k8 n: G; ?8 M! i
    数据批量
    6 u+ w* L% O- W+ ?/ f, y) t常见数据张量表示
    / j: b0 e. b, ~, K神经网络的“齿轮”: 张量运算- x( R% v5 ]+ T0 G& K
    逐元素操作(Element-wise)
    0 O& D+ [: k: u广播(Broadcasting)
    + }) _9 c" N; e4 X3 f/ U张量点积(dot)
      A6 u4 i/ U- n+ i6 E7 U* n1 [张量变形(reshaping)& e6 ?9 \) r, b1 L  w# H
    神经网络的“引擎”: 基于梯度的优化# ^% G" @, r0 @; q' P( K8 x" T
    导数(derivative)! {0 d# o$ ]+ ]) f* `5 ?+ |! E( z
    梯度(gradient)
    % `) O* j" A& T# x# K8 |: y随机梯度下降(Stochastic gradient descent)! R9 w4 F7 z, D. \( G6 L
    反向传播算法:链式求导% p! D* s7 |& N! g, L( Q/ @
    本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。
    6 o' w% A: B; j" E6 x# B" Q7 ^) h* O$ ]5 u
    初窥神经网络  h* A) {. r1 |/ d; p. d/ Y5 \* P

    5 X3 u9 g( {: A: `学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。1 |% W5 l, F. |8 n( N" C, x
    4 F; \  w* Y& j  v
    MNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。
    % u8 N! _  @$ r7 N3 `5 L3 c" U$ j
      ~; Y1 k8 G6 s4 ]. x* }导入MNIST数据集6 J) S# i1 L2 \& U3 ^
    / o- h% R. ^0 N7 f5 _" k
    # Loading the MNIST dataset in Keras
    1 }; D' ]6 |1 u( F/ Gfrom tensorflow.keras.datasets import mnist
    8 b5 {7 G7 @8 p8 F. Q6 O6 ^(train_images, train_labels), (test_images, test_labels) = mnist.load_data()7 F! X& l( V! p% v" K) a
    18 e( A* M8 y$ s+ M2 V! Q
    20 \3 G# ~# [  c7 E
    3
    3 b/ l' r. X8 f/ I1 d4 W7 K+ H3 Q看一下训练集:( e# {1 X. z7 |  Z" }: s6 p; c

    : c& I* x! C0 z+ L# jprint(train_images.shape)
    ! e5 a# ]0 V+ B. \print(train_labels.shape)0 C+ I3 G1 S, t5 @
    train_labels1 _' k6 u) R; D( Z0 E1 H( @
    15 h) M. t3 W9 Y  t( u
    2! ?' w2 H3 u7 u0 g+ ~/ h
    33 u) X& {  B& {! ^# f
    输出:2 D' E, Q0 P; a* y

    & l1 m& R+ K1 }$ Q% M) N) [4 l- T(60000, 28, 28)
    3 B) V0 C& ]$ g/ u(60000,)
    2 L7 r/ O% l5 P& q) y" [2 |/ ?& X. ^- R  w( v0 G' n# T+ k+ K1 e
    array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)7 i) v- f) `& ?- L5 K' k4 d9 S
    1
    " j) c, {3 W. B( c8 C  c24 l# s0 ?6 R1 l1 Q  u
    3
    : d/ S& e8 J  t9 f1 g/ T6 ?44 @- n* m4 x3 D5 e& p) F* I. ?
    这是测试集:
    " `4 U' Q! n4 D- a) P5 ?  @; D
    4 h$ K2 E/ @8 H( m9 d: X; Iprint(test_images.shape)# B$ [% T: _9 q7 u) L
    print(test_labels.shape)
    7 m. G* P5 h: y" r" V# xtest_labels' K7 t5 W$ b  L' H3 _! ?
    11 a# x$ p$ f8 @+ J/ b/ U4 x+ S' n/ b
    2
    + t# c. l/ Y: \( m3& x3 O0 G4 U& A9 M- A( x
    输出:
      J6 @1 Z4 P6 l8 ~, i0 V( Q4 A9 K# @1 m0 z. d# c" ~. [! O
    (10000, 28, 28)/ s# ]/ o2 q( j8 Q( Y1 q! Z0 e
    (10000,)
    . g7 i; j: S! H* o$ H9 i7 w6 m  c. {9 j5 S6 N8 _* I
    array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)0 k% A. v9 E5 Q4 V- [3 {' V
    11 N/ U" H3 h9 P
    2* U3 _: J! [$ s) Z" t
    3
    # O/ C( b6 Y5 R4 N4
    + D* c) x2 r) e' j; C7 b网络构建
    ! _5 P2 J) }& f7 F, N! f7 s) M: Z7 w
    ' ?* k: h7 A$ Y: V# u/ `我们来构建一个用来学习 MNIST 集的神经网络:) i0 Q& M( J) ^+ d' H/ F  i

    & ?! p* V& i  V/ K5 u7 F& c- B) Rfrom tensorflow.keras import models
    9 x+ T2 Q* q. Jfrom tensorflow.keras import layers
    ; {4 X7 V" b' r. u1 h: h! \9 ?1 S% V% B+ _* I0 p- `
    network = models.Sequential()1 [( E* L9 ]% w6 Y
    network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))! a$ @5 B7 |6 H
    network.add(layers.Dense(10, activation='softmax'))7 Q: c1 V$ x! u( A3 _
    1+ W! Y8 q7 G, E8 l/ M0 ?6 ]
    2' n* J$ h' ^3 @) g) `- B8 a
    32 h3 O1 |' C6 l) [- l4 p
    4
    " |7 i$ T5 j" a7 W& W; C5
    . x4 ~, @. S; N' g6
    6 k8 u$ Z) _& A4 C4 q) L- E) l神经网络是一个个「层」组成的。
    % E# z9 y* e3 y3 s* v一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。
    / ]. g2 a3 H; V' h% B4 @
    0 H% {& y- w* I" ]  V1 ~7 h这样一系列的「层」组合起来,像流水线一样对数据进行处理。
    ) k( J, S1 Y, V: Z$ }, k! Z6 v层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。4 `$ D; m* y. z

    . M/ s. t/ v( m* |0 k2 E我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。" w% G8 d' ~; l! a( E  p/ s
    ' o2 U# T% a! h
    数据到了最后一层(第二层),是一个 10路 的 softmax 层。
    * \% J) c6 ^* O) C这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。8 l/ a4 m& K' D/ d9 m
    事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!
    ' T4 F$ q& O: R0 h9 I1 G( }+ J. P/ j3 m3 n; s
    编译
    8 I5 J! i$ l  }6 V7 g" w  q3 ?
    2 K0 s4 k; z* J3 h) X接下来,我们要 编译 这个网络,这个步骤需要给3个参数:
    ) a" V2 k# a6 y6 L7 U9 v9 w8 [% ]9 C+ D
    损失函数:评价你这网络表现的好不好的函数* Y2 W8 t" D) X
    优化器:怎么更新(优化)你这个网络. |* R& m& V( o# H7 L
    训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度
      M# @$ C' F" R  gnetwork.compile(loss="categorical_crossentropy",
    7 w8 ~. [7 _5 Z$ L1 A                optimizer='rmsprop',
    7 Q6 \8 ^7 U) y" f8 u                metrics=['accuracy'])
    , \9 v/ ^# F6 p+ K9 K# y1
    0 f8 R( @5 l3 N/ O# ?2 x& Z8 s% d2
      {4 }& |+ \8 A6 ?3) `6 [' g2 g  w4 d) _$ m
    预处理
      d% l, E+ Q) R! T' f. T
    * D: F; b; c5 X& Q4 E5 F1 k图形处理
    ) D8 f1 G: R0 ?2 R5 \) R
    5 i7 T! l+ y7 k$ Y( X* [/ i我们还需要处理一下图形数据,把它变成我们的网络认识的样子。4 T3 w. y# ]; g

    ! U+ U* b& K( f% P$ X2 ^$ QMNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。8 u; s9 Q, k8 g) V# Q
    而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。4 K' J- ^+ |7 i8 k6 `" G
    3 }! p0 \$ V$ E  u2 o: ^
    train_images = train_images.reshape((60000, 28 * 28))
    1 X5 Q  m8 [) ]1 e( g" H+ Ttrain_images = train_images.astype('float32') / 255
    + n% C( U, d9 g+ E* `, H8 W& q0 _# Q- R& ?& \3 }
    test_images = test_images.reshape((10000, 28 * 28)): r3 p4 |+ A! p/ Q9 u
    test_images = test_images.astype('float32') / 255
    3 D, v. \4 k: l. U7 @0 W  o. Y1
    / w* c$ E) H! g! R' Y% a" i2
    1 P. _9 Q) e- G# m3
    " [( k4 G  R5 S% B! {8 w4  D( ?- o" ~$ M! y/ c/ \8 v
    5
    5 y; k( J* n, o- V  h6 o  d& M标签处理5 y1 ]- Z) w  G' n
    0 n% s5 r3 B, b" }. B6 {
    同样,标签也是需要处理一下的。( F/ r! f. q5 m& V! D
    8 ?; C/ R+ Z$ H6 R5 U& E3 l9 Q9 w
    from tensorflow.keras.utils import to_categorical
    1 T' l; l& W$ _) C1 V- p4 v- I$ v, c3 ?$ E8 b
    train_labels = to_categorical(train_labels)% G  G* ^  f& E
    test_labels = to_categorical(test_labels)
    $ j: S. v. e2 P; N" R9 C3 s1
    5 A* }7 K7 x8 F, N" b& F2
    7 \9 l2 N2 Y4 g' m5 Y, M3
    % q6 v- H' u7 e' Y" ?; G4) K# w4 I$ Y/ ]
    训练网络
      U7 O, N/ z5 T0 x/ g+ b& j+ f2 K
    network.fit(train_images, train_labels, epochs=5, batch_size=128)( t$ I2 u5 n$ u9 ~$ Q; S
    1
    3 W7 v8 z2 A; J' J0 B6 Q0 ~输出:
    " j) a7 B* _9 \' g) S! l' }# I7 Z1 x& q( [( ?
    Train on 60000 samples
    ( S+ Q# u2 M/ a" s- wEpoch 1/5
    ; y: Q+ l0 f  @8 X# v$ h" H5 W60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254  [- s" d0 H: K, V
    Epoch 2/5
    ) o4 I2 y) g; m* k: Y+ b; e& y60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693# B7 [' C, P$ _7 y) a& ?
    Epoch 3/5
    5 H% {0 Q8 B/ y3 i4 G7 G* M+ j60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800
    & t6 \. {3 t0 sEpoch 4/5
    ) S. u7 }* K' A60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848
    8 u* c6 J. D4 H3 W* BEpoch 5/5
    : g+ q0 x9 }+ ?3 a6 G7 R# U60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888. o- A9 B+ C2 O# n7 O! D

    ) s& y* Z7 s5 W+ z<tensorflow.python.keras.callbacks.History at 0x13a7892d0>  X  e  ?9 N6 b5 d) f7 q* p
    1
    " x& b3 l/ h; U' h; Z0 M2
    & d4 B' ]+ t3 @; o- B: p" Z- p5 t3
    0 P, u* a0 |; e# z3 m& S4
    ) E  r% v& L1 ~. _5( C  f' {$ J" I% Y6 D" U
    63 s8 W; O1 L- R3 @
    7
    1 j; ~* z2 T& @+ P# {8
    4 u4 @# ]! O2 [# m5 I) T91 E0 N: d# g8 l  j
    109 @) ]; q$ g) E& D" g7 L( T7 v8 G
    11
    ; J! B, R- O- o; T- j. i120 e  I& B" \% d- D+ S' G  C
    13
    % d5 h" e2 y- z7 Q- ]可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。& Q. {, V+ i6 U2 J! t! Z2 i) t9 P
    ! {6 }+ F3 [, p, {4 C2 q3 N1 p
    再用测试集去试试:
    0 h: ]7 F5 e7 ?5 j8 _3 P: S1 ~8 p0 M2 c
    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+ o8 m# b) p& ^  Y; \
    print('test_acc:', test_acc)2 d5 i" S0 |+ t" u
    1
    % [6 b, a0 B2 {22 g& d  y4 H  F, J; p
    输出:& x. E! O4 T  R- R
    ; v/ L! k6 c: K; g/ u
    10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789& W; K6 P6 R4 J- l
    test_acc: 0.9789
    " X2 S! B8 B8 y$ K  {10 \9 D/ i# @2 F2 R1 s
    2( P5 n; G4 r4 c  M
    我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。
    8 U, j- @# e6 ?8 z) A8 F6 b& A1 _( ^
    神经网络的数据表示
    % Z/ U! T6 e$ X: G9 j& o4 Z$ Q& J' n' `) M
    Tensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。/ q1 N  V, A7 U6 A

    1 Z% s( K" V+ j# D我们常把「张量的维度」说成「轴」。
    4 ?2 g+ P5 H2 }( x
    # m0 a! `" F1 O% O- S认识张量- G9 c3 ?5 O7 \! g
    * ]' g% g* B+ A5 y0 K% V# b
    标量 (0D Tensors)  v5 a/ H5 P4 y; I* s9 T3 Y: o

    ' e- y0 W2 V2 c$ pScalars,标量是 0 维的张量(0个轴),包含一个数。3 W$ d% E% n" Q- B9 n/ T

    % Z3 `1 A  s( m& A/ j6 k% X标量在 numpy 中可以用 float32 或 float64 表示。
    ' ^0 G/ _- }$ V
    * C5 R7 R+ @1 S  g2 j/ z3 A8 O9 U( Dimport numpy as np! j' P) H- y) G# ~" Q

    0 V" H, e+ O& l4 g7 Sx = np.array(12)% Q8 b6 p0 G+ ]- |% @. ]
    x" n) Y$ |8 d) l
    1! W8 m- {& ]* S% H, e" ]
    23 S: M, y( J9 V8 ?8 S  I2 E
    3$ q9 N. E% }) Z
    4
    7 E4 [1 f' |; [. F9 V9 H输出:
    : M0 P6 U( s. q: g2 r2 J/ }* r" C- s0 J4 `- i7 f" f% Z6 @! e1 G" I
    array(12)
    ' B- M2 @# s6 K1 W1
    , w4 F2 \1 h* Xx.ndim    # 轴数(维数)
    8 \7 f1 M% v# w0 M' q1
    " m3 ]# t4 P# u, J输出:# D2 t, _. ~3 l$ g8 Q
    2 @& ~! U5 I, j# K2 X. S( z) {
    17 s. H6 q- R1 R( a
    16 N/ P7 z( o# z! L; J2 s; z
    向量 (1D Tensors)5 m. }6 a4 h' C0 a: o& q/ a( s
    ) c) L7 s! y1 R8 |0 n: l
    Vectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。, V8 l# w4 T+ ^# k6 D

    % K1 w5 s- @- b+ K2 [x = np.array([1, 2, 3, 4, 5])* j) Z$ E% ~6 t) e2 v1 W6 m
    x
    " w( O# s# c$ [6 ]$ c( d1
    7 }* v7 o2 o  `# ]) Z( B2
    8 R. {7 Y2 c: W7 i3 o( }输出:
    $ y1 }5 j3 p* W( `2 x+ I+ T1 H! n
    5 l  T3 `7 L' N& k5 O3 Uarray([1, 2, 3, 4, 5])# t) F' j3 Q! U# U7 d& ^( K5 P
    1
    8 V+ A" d, }) L6 {! M" ux.ndim
    # `4 M% I: T8 f! ~9 o" R1& [* T$ y/ s0 U, Y8 D; b& ?
    输出:
    5 m5 V% }$ Y7 M  E: [+ A
    0 a% I3 v! R, R; v$ ?( }10 V) {$ g" h' f% X# Y
    17 L& T1 y% h4 }; K) y; B
    我们把这样有5个元素的向量叫做“5维向量”。: ^: g+ J. g2 `- @
    但注意5D向量可不是5D张量!9 Y( d& \! L, T. l$ ~: C4 o
    $ `* U' n; I$ K: e. P8 B+ Q: w
    5D向量:只有1个轴,在这个轴上有5个维度。2 O, T' {7 i  A! Q4 W2 d: A
    5D张量:有5个轴,在每个轴上可以有任意维度。
    8 L- a0 |* M! {; F) A这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。0 t6 r# J8 D2 d* |
    8 Z/ o# ?* t: s7 ]. v$ Q# f
    所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。* R$ J- v; H4 s3 e3 E; x2 l
    / {. v. y) w' r$ [9 ^8 F& P2 |1 {) |
    矩阵 (2D Tensors)- E/ y. E3 M1 P* B+ v
    . `* }7 T$ }9 B5 o, f* L
    Matrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。
    , f/ d5 S1 P3 p
    6 u4 y& @. M4 A/ D% n6 t- W, Ax = np.array([[5, 78, 2, 34, 0],. K) {+ |% p9 S0 [, o- \/ x5 o
                  [6, 79, 3, 35, 1],; R; z$ Y9 M* Y) A
                  [7, 80, 4, 36, 2]])
    2 ?0 p/ Q6 r0 Q2 G* t3 `x4 J1 t: f, }9 R: c, H
    1  F& {9 L0 F" |3 x+ j, v
    2; h4 @, Q) o% W7 i: f
    3
    7 s( c8 g( D# ?4
    % k* r7 ]; n& }输出:5 Q; Z! ]8 k0 ?
    * o  b6 O8 e9 G. ]- b; W' \; [+ P
    array([[ 5, 78,  2, 34,  0],
    2 W5 u$ w$ J1 p: O  `7 S5 N2 K       [ 6, 79,  3, 35,  1],( n1 ^  B+ n! a% I* ^( P4 a5 d0 L; Q
           [ 7, 80,  4, 36,  2]]). E7 {: T2 S5 D. U- @9 `
    1
    ) y  u/ ^2 ^+ |% G* _2
    3 D4 G: s1 F  B" c/ e3- r1 ]0 o: b2 o" j) i
    x.ndim0 H+ q: v* G: j" s: N3 j
    1" u2 D# \( g, n6 i5 N/ e9 s$ v
    输出:
    0 {, l: N& q5 q8 j" y- q; V, i+ Z
    3 H  b& W; r) O7 Q0 \8 m" k' e; e; j2% J! i; M5 j% T/ Q4 |
    1, \" U: k  }: {) d5 u8 t: I
    高阶张量
    , {% \$ N- u  f, H6 }2 C
    9 O! m  n4 M" T6 D  M3 K3 f% K你搞个装矩阵的 array 就得到了3阶张量。; R# `2 y) P9 D( W( n

    ; `9 A3 W  b' c再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。1 Y* x8 O5 L4 w. s1 A

    / P; C; p: S8 o# F8 z/ v8 Px = np.array([[[5, 78, 2, 34, 0],
    + l2 V$ T3 S) X               [6, 79, 3, 35, 1],
    5 ^8 a; a6 C) x               [7, 80, 4, 36, 2]],
    * g; t1 p; m. t" d( E              [[5, 78, 2, 34, 0],
    . H3 K$ i/ l7 m# @. E               [6, 79, 3, 35, 1],
    7 Q4 H# q& f% F& V% F8 k* f               [7, 80, 4, 36, 2]],
    + o; k$ ~6 W+ k- @/ x              [[5, 78, 2, 34, 0],
    $ q$ E( C/ l0 F               [6, 79, 3, 35, 1],4 \7 P3 c4 T, x  i& e2 V) A3 w3 [
                   [7, 80, 4, 36, 2]]])2 E1 }6 c' x4 ?7 b: o8 Q$ A
    x.ndim( G& W. U8 F, p" I  Q  D
    1
    8 C+ a# ^* _- Q1 C- ?" N" w! P23 v0 D$ V/ c: W) `
    3
    7 Y  W; g& ~" ]- f$ Q% |! H4; D) F  b2 s3 }5 Q, @
    51 ^6 |6 i2 e- r- T& s- Z
    63 z; w( t4 u' I6 s0 u
    7
    ( f0 ?% g5 v( a3 g* E  ]8' _1 ]+ G0 b" S3 {& Z" p& }* z
    9
    " {8 W& h' J+ u2 _100 r# {' t: G& T4 v% Q" u
    输出:
    + V! c# ?% U; T; v6 |
    # w) a) z! t- s9 v" b3
    , U3 ]! C8 N, o  o) L1+ L8 t' ~. k' Z1 d1 G: X
    深度学习里,我们一般就用0~4阶的张量。
    & w- R( Z3 D% L( \& V# v6 d
    3 |5 x+ _; ~' x; b2 N8 K张量的三要素, s4 W/ G6 y9 R, I5 A6 B' H

    - E  a2 n% K7 \0 @" ]阶数(轴的个数):3,5,…
    : _0 y: g5 p1 O$ z/ w, a形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…
    : ^8 p7 [& M! }$ L3 @数据类型:float32,uint8,…2 h) J& R# j9 G" h2 G
    我们来看看 MNIST 里的张量数据:
    5 ?2 I7 W# m" f$ p0 M5 P& ^( J3 C
    from tensorflow.keras.datasets import mnist2 a: P8 X/ t( X% \. s
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data()
      h2 G; u4 |* K9 M6 C4 G) |5 a2 k0 Z5 {. O' }! q7 Q2 A
    print(train_images.ndim)% l5 S" {: I* ^5 w
    print(train_images.shape)" P# N) E$ c1 h% R/ J) x
    print(train_images.dtype)
    : q( m/ x* p2 E; d1
    8 W, I1 y/ j9 e+ p8 R. {: `  `8 {2
    " ~$ w4 a& P) K32 |9 I/ C! V8 T
    4/ p  |, c$ J! k5 |8 F0 E
    5' K* m7 |4 q: g9 @# F, L
    6
    6 T- N3 Q7 f  e9 q输出:
    ' N7 f' x: e! {" O) ]) p! n; _
    - `  n/ _- m8 u& s3# z+ t' I" W3 d
    (60000, 28, 28)
    5 H% `6 I" R. b) Uuint87 |' t+ N1 k. d  Q: P
    1& \: V% ~5 y) O
    2, h8 \. S7 y. V  f! g# W
    3
    . i) O" t4 \" q7 B5 [; g3 ~! ]所以 train_images 是个8位无符号整数的3阶张量。
    9 m/ ]8 T! i. o" p7 k
    - z2 @. v; e! m# H打印个里面的图片看看:
    ) L4 c1 ?8 W% u/ q- @8 v
      {1 P$ t0 B9 v2 G' ]' Qdigit = train_images[0]
    8 h. \; M- r; m5 @- J9 C$ B0 [* ]4 U" Y
    import matplotlib.pyplot as plt6 Q4 c* ^- A- V2 \2 `: O/ E
    3 Z5 g( c% w2 J. Y1 N) R
    print("image:")7 W* X  I# Z! y4 C+ ^/ e& R: A6 Y
    plt.imshow(digit, cmap=plt.cm.binary)
    ( V5 W" j! \1 P7 c; u0 Dplt.show()) F% J+ i8 ]+ f( r7 E5 L/ L, o
    print("label: ", train_labels[0])
    ) S: Y4 q8 C) j# C18 _3 [2 x% Q3 I
    2
    ' Q1 l1 r7 p7 ?0 C3 e8 p6 E& d3
    ' u: C- D7 E/ N  B  f+ P4
    7 W0 z7 w* ?: k  |  K2 [/ }& S+ E59 m0 I3 O  A  x# f
    6
    $ t$ Q2 }& k: S( i7
    / F* Z- Q3 U6 r5 @8- J( b& P$ s; g
    输出:+ w$ w0 H1 Z* N5 U5 g: i
    9 G: S. X1 ]6 w2 c
    1.jpg 2 C/ ]$ ?* p: H& d8 O* `. J
    , X& d+ ]2 v2 |
    label:  5
    ( \$ \; S7 O+ ]6 t7 |4 M- w1# }0 e4 {/ E! F, f1 n" V
    Numpy张量操作- K: J! W, M- ]
    : `) V' n& _# q  q( I
    张量切片:% Y1 u/ }/ @* K8 f
    1 n: d3 \' Z2 Z3 H
    my_slice = train_images[10:100]+ g, D4 d3 e# ~& d: Q( q
    print(my_slice.shape)
    6 [4 b- h9 M- T! m1' U0 M& E9 m8 N5 a* d' k* B
    21 ]$ V5 f, t. A
    输出:
    # S0 `/ M& R* ?' f8 Y0 E: o 2.jpg
    . f" s. a! f) ]7 [/ I/ q7 @- ^(90, 28, 28)( y9 t/ ?. e+ L
    1; i+ u& ~8 B& j; Y& W5 c
    等价于:
    ! O2 B5 `+ n" O! }, `  P8 s, Y. K# \7 ?7 `
    my_slice = train_images[10:100, :, :]
    - s$ B  r( l( m( w$ H% \+ n7 cprint(my_slice.shape), i' y* h. F1 L6 o. A+ x
    1
    " P& |: h9 W9 I" ^. d( I2& U4 j- M- k5 Y  C1 u1 }7 Q
    输出:! ~* F8 M4 E; M+ @
    3.jpg
      \+ s% b' j4 W) k7 C(90, 28, 28)
    % [! J5 C0 O: W: A4 r5 P) i1
    - J! V" Y1 w) k9 O也等价于
    4 `4 p) W8 I% r- H5 b2 V& n: i
    ; K% ~4 M# I; ^2 ?% Bmy_slice = train_images[10:100, 0:28, 0:28]9 l3 M- o3 z" W0 k1 U/ z
    print(my_slice.shape)0 N9 f& X% F" D# G$ q  o7 z
    1+ s$ i2 ?" n" ^8 r8 I0 w% y$ j
    2& R" n5 i# ~1 |. L% A
    输出:6 l  ~8 M& Y, D7 j% Y

    / [3 x& S7 x0 I/ A(90, 28, 28)4 F# z4 X# {- ^9 ~
    1
    , J7 P; J6 @9 P  K3 e选出 右下角 14x14 的:
    * @$ x8 T+ Z$ T3 P; w0 Q, P5 A! V6 x$ Q0 |
    my_slice = train_images[:, 14:, 14:]
    6 y& w7 N! X4 Cplt.imshow(my_slice[0], cmap=plt.cm.binary)7 o( |' O- ?1 c5 y" m# ]
    plt.show()
    * V5 [# I2 b8 H/ @, i1 l2 q; Y! U1( U: a; I0 G3 L  z' \- l- [
    2
    0 d) j2 ^' ^. w: k# A3
    : E5 t, m, L! [! k/ K输出:: z: `1 s/ w' X

      V' R( o3 a( p7 s! d% z
    : B& a0 j/ t+ y
    & S: V6 F* ~0 ~; a" T. r. @) ]选出 中心处 14x14 的:
    ! l2 Y! ~8 ?; [5 {  N( v* ^( B9 x# J" F1 c+ k
    my_slice = train_images[:, 7:-7, 7:-7]8 T# a% G1 `0 P
    plt.imshow(my_slice[0], cmap=plt.cm.binary)' e% T& J; W( o7 ~! w/ l: `4 z* ]
    plt.show()5 {- Y( j6 F; l, I2 U
    1
    + d8 \/ W& w- j6 [+ T* a- g1 l26 o4 G9 ^. g! w3 N
    3' }5 a1 a' s" r+ X8 m% d  A
    输出:! O% J9 `9 l2 T7 K! c

    9 {- G& }& v2 v/ V! ?. p0 ?5 i) K
    ) ?$ Z. Q" h  c5 c! i2 V+ F' m  d* _3 I
    数据批量
    ) }$ i* E  @# ?# r
    : R; ]  b) t& a+ [深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。$ u! p' F( J1 L- y/ s0 z

    7 Z; @1 n2 q% b. ]% @7 R深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。3 U$ I" r& ^- t

    7 R& S; n$ C6 f* _# D在 MNIST 中,我们的一个批量是 128 个数据:
    0 e5 b; F' H- v1 I
    * }0 ?8 D5 C# N  ~- ~# 第一批
    1 F% F+ W- Y# b- f: T7 Lbatch = train_images[:128]# V: B5 e; s( y& O- w
    # 第二批
    6 b2 y9 S5 k2 H, C2 V7 E. _batch = train_images[128:256]
      K" Q' Y/ G5 W# 第n批8 ?9 d5 n& P/ R0 H7 L1 }7 f
    n = 12
    , ^& }# o9 D  U' E4 Mbatch = train_images[128 * n : 128 * (n+1)]
    , j/ Q+ |4 H2 a4 N3 V' L2 ]# l1
    ! n8 U) B2 L: N$ n: d2
    3 X& o/ a, g8 R3 v' [- R31 @/ w& y" O# I+ x* {
    4
    # R) Z/ a* z7 ^0 N5
    . X( B; M" r9 Q0 F69 g5 Q# O- A8 t  Q" z  L; {3 i
    77 N) [) h0 |- V2 Q* o
    所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。
      K& J+ y! R. m, ?, m) w) W; d
    - g( k% W+ ]( D+ G+ R常见数据张量表示
    # \2 }3 i4 Q' Z% ?3 S: z% S- v
    + c6 T! q, [' N* E0 |# J% I5 L, O数据
    . V: }. r" D  f( g7 i! X
    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, 2025-8-19 14:33 , Processed in 0.401003 second(s), 58 queries .

    回顶部