QQ登录

只需要一步,快速开始

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

    8 b6 v& N8 m" Z8 _5 v4 DPython深度学习之初窥神经网络- V0 Y7 F! R& y% S; F2 w
    本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。# k1 {  u( t8 F2 S

    : u- e/ ~  ?4 Y3 \( i9 `" K7 y本文目录:
    , J" i+ k, e# E3 \; C% \
    : F; X; I! m5 `  M( ?5 S9 ?文章目录; h3 {, n$ C" I2 J2 c: d: Q3 ^
      R: J4 A; l7 t# d. s" s
    Deep Learning with Python
    . P, K3 s: y7 g( G7 M1 _0 B初窥神经网络
    ) q) Y; @* J+ l导入MNIST数据集+ }! c' K) q& ~1 b
    网络构建' j" B9 T  c7 {; u: n
    编译) Q# D( q2 J) N0 Z& u  E5 Y
    预处理
    $ O0 v* k/ _, L' \$ o1 ~图形处理3 ?; z' E4 t9 }" j. n  I3 M  x
    标签处理- ?: d6 v; o. }# T" ]$ g
    训练网络
    ! g* X" [8 }* o& B  S, Z) {神经网络的数据表示
    : a" D8 `' f% w认识张量
    . D/ |7 x9 ]& a% v  J$ l. Z) _标量 (0D Tensors)
    + ^/ {6 x. ?3 x6 R! x: m$ J向量 (1D Tensors)! E9 p* X+ w( v' ^) ], V2 c
    矩阵 (2D Tensors)  X# X1 q  ?" \$ C+ B, b, A7 ?
    高阶张量
      P; D; p- ?" A6 o: J% n张量的三要素4 {; A: O5 Q# }3 j, W" B
    Numpy张量操作
    1 p  c; h  ]7 ?! y张量切片:! J) M: d8 a1 Q: S; Y' D
    数据批量
    9 l% n# b8 b) P- Y常见数据张量表示1 M' |2 h9 d5 e+ b  {1 i4 B- |
    神经网络的“齿轮”: 张量运算8 k& F5 _' N- O2 ^& ?
    逐元素操作(Element-wise)
    - J6 G) b2 i2 A" v9 q( p8 @广播(Broadcasting)
    - k7 i% ~4 z: n( |8 F- B张量点积(dot); m0 w2 ]9 P. f5 m3 S2 d4 }  D
    张量变形(reshaping)0 \4 _4 Z& q$ k6 Y
    神经网络的“引擎”: 基于梯度的优化
    & b  \6 g. |& [导数(derivative)
    : c. j, [1 N- Z7 g梯度(gradient)
    6 y. r" K/ q/ H  p随机梯度下降(Stochastic gradient descent)$ r* V; n" D/ O0 A: D& y
    反向传播算法:链式求导7 B- I* Q: q! n+ ?- ^4 ^
    本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。
    ; B% w+ l3 j: v7 L# w
    ( {; q) w4 N  \& ?3 y初窥神经网络
    4 [6 w) J; A" j/ f, E1 s8 m4 ^7 m, J0 V+ F
    学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。
    # P- `3 X( r  x5 g0 t* J
    & Q/ ~" J$ j; F) r8 X4 p3 z" dMNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。  `- L8 n& w4 S9 [( \- Y( e2 V& i/ |4 g4 n

    % K" N1 E) U+ e+ K( r& O导入MNIST数据集+ m3 h( M. o& ^" X# g, l& X
      T4 o, }; C9 P. b7 m* r
    # Loading the MNIST dataset in Keras: {* k( G/ n% f* `: x
    from tensorflow.keras.datasets import mnist
    , N  p1 t3 X% x- s1 m# O, {(train_images, train_labels), (test_images, test_labels) = mnist.load_data()& Y9 F9 ^8 A/ Q- ?+ A8 J# D' J( D
    1% {+ c# ~. u" o. g
    2
    6 q2 P0 Z1 n% I& H  i3. _  a0 \, I' ]& B3 W- f+ I
    看一下训练集:
    5 I& b) p: P; Q) r6 o7 s+ j' O; ^+ g' g7 L% M9 S# Z$ J
    print(train_images.shape), p- W" p6 _: ?7 o
    print(train_labels.shape)- z0 q* ]# F5 C/ E
    train_labels9 j" F: f0 Y, j3 ~8 h1 D' h3 I- n' G
    1  m' _3 P$ |0 d+ G' d! y; O  q
    2* V& P, s7 p( r+ i
    3
    , e7 g, K  E. n8 v0 N0 x& h) J) X输出:2 _; N% K/ O3 C3 a/ t

    8 b5 z7 U, X3 G(60000, 28, 28)* {- \" U  o; f- k  T' D
    (60000,)
    " |5 s+ a1 y) u) ^
    * L- w5 s9 @& m: J3 N6 Aarray([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
    6 H1 O3 e) V/ _+ e. A1
    ) n3 J/ \( I0 J, X8 B$ N7 s2/ Q2 e5 _  ]0 U! k: @
    3) _& z3 b+ o% I: P* A4 b; H$ `
    4
    : w% O& l  e9 A' n2 f这是测试集:
    " _  n8 B: f+ h  g" g: W
    2 B& Z# q6 Z7 V7 U# mprint(test_images.shape)
    3 Y  `* K& s' J' d* \3 Sprint(test_labels.shape)
    9 z* ~# n7 ~" P+ Dtest_labels
      ^. X# a) f) Y& y; k) A: l+ C1
    4 V8 q7 d4 \4 d24 _  j& w" T  M
    3
    6 J# q4 }: p$ f/ T/ D输出:
    ) }) u# _, F7 Y6 [' k8 _% ?
    ) i5 w. Z/ @" b/ Z( l/ h8 Q(10000, 28, 28)
      B! K# `% v* y! f; ?(10000,)  m. R) w. P, q) v0 }- O

    5 z: H# u7 t4 }5 Uarray([7, 2, 1, ..., 4, 5, 6], dtype=uint8)
    , d+ l$ r" h$ J; G1
    : K# Y6 E1 D0 t" E* Y2& b0 k2 ?0 _% L4 Q8 R& {
    3, \, `) e, N/ o3 ?; W  k  ]" |
    47 `8 ~- x" O# g* c& T$ i9 o) F
    网络构建
    : z" u& W/ u$ N" o0 O9 z  j! w6 v& H' H  A
    我们来构建一个用来学习 MNIST 集的神经网络:
    3 ?" m. i. G" i1 ^% ~
    5 j; K0 x) h/ \5 Nfrom tensorflow.keras import models
    # E4 V6 n2 s; o% w2 zfrom tensorflow.keras import layers
    % T' u2 y/ w" Q! r5 F0 f: J, |, @5 v0 Y9 y- Z- N; T, s+ d' p5 c
    network = models.Sequential()
    $ \$ l, V. E, g9 C* h) q; j5 lnetwork.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))
    7 M" a, d. O# h  ~# o8 E) }# E8 v; knetwork.add(layers.Dense(10, activation='softmax'))) y& p  @+ @7 m2 o) K* G3 l2 U
    1; l! \' c, w8 e4 U0 P1 K# e1 q
    2
    $ a. b/ Z  {" L30 j7 S  d: x! a0 R' @
    4. [" Q! C. W: B9 O
    53 U; k* l! J4 O
    62 k- F# X7 }+ E7 J3 ^5 C: I* U
    神经网络是一个个「层」组成的。- S# i1 I) v0 J4 i! L, W5 K9 C, h6 f
    一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。1 k% j* ~/ L$ V+ X3 \: `7 q
    - J  g/ y3 S7 ]5 V7 K, X3 h
    这样一系列的「层」组合起来,像流水线一样对数据进行处理。( Q( F3 y( \1 A% F; X: k
    层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。
    & }( V. X& e, x& l
    % H0 S2 X- B' N( c& y  u1 }: }/ t我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。+ v! x" |- P) K+ u; y/ }9 t( W
    4 N! r) E* h/ v5 q
    数据到了最后一层(第二层),是一个 10路 的 softmax 层。
    1 o+ ?6 Z3 ^; Z/ n9 y这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。* Y: }% u; H9 i- a% B: p8 [
    事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!
    ' ?6 Z# G4 K& _8 O
    9 u% b! x+ W' y, Y- L% }" e: g编译6 w/ Z0 a8 G% F" y/ K% W

    8 v( p/ W+ p& e1 H5 r接下来,我们要 编译 这个网络,这个步骤需要给3个参数:
    / S" r$ V: e* b3 w3 \1 n  z( y- e$ o6 @  y% t
    损失函数:评价你这网络表现的好不好的函数
    - Y7 h& _: f) D% _  t7 d优化器:怎么更新(优化)你这个网络
    / z: P3 h. z6 H4 E' [2 e2 P训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度1 {+ I2 x! V/ u9 @1 c
    network.compile(loss="categorical_crossentropy",5 N5 B  K  l  m' Y  g( Y5 W% ~0 L& m3 f
                    optimizer='rmsprop',
    ; l& a9 w/ X7 D* R                metrics=['accuracy'])
    4 u. b, l  c$ Y9 b5 R% z6 {1
    ' Y4 ~/ c- F2 c2# T' a/ M) z, ]* K: i1 g
    3, t/ n! x  m3 u8 x5 {. f
    预处理
    ; L- Y/ K; J" x& \
    6 s2 O' O3 Z/ z" R" K图形处理& Z! q) c9 V: K5 V: r. \

    . Q" ?- F* ^+ @  ]- X8 y* u我们还需要处理一下图形数据,把它变成我们的网络认识的样子。% ]) @6 h6 L5 {+ Z
    & i0 D1 B: g6 J9 h5 \* G
    MNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。' |$ k/ V8 ?! Q7 k' g
    而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。
    6 N# d0 {. P. y* R( w  x* c/ ]/ ^- q' ^) E
    train_images = train_images.reshape((60000, 28 * 28))
    4 I, l4 g% i. t0 I9 X# G  |$ ]train_images = train_images.astype('float32') / 2552 P9 j# d# H  N
    " f' c+ q4 Y, u* P& r
    test_images = test_images.reshape((10000, 28 * 28))" R7 i+ I! e8 t/ w. Y" ^/ X
    test_images = test_images.astype('float32') / 255
    + D/ M3 G6 ?! Z1
    6 J; x: v, j" F* I5 g, q0 F28 ?! \6 `. E3 p7 Z/ i) c
    3
    ! X& I4 [/ \2 m4
    9 t; p* g# j/ M7 \( y6 k50 k! ?+ w; C5 M6 j
    标签处理* F6 p$ P4 W- f5 a- N
    * y7 a! r) a3 ]1 L7 c& u* z  P
    同样,标签也是需要处理一下的。6 u$ a; ~7 @) R. o

    - |& Z  U( V, ^# m( Z: Qfrom tensorflow.keras.utils import to_categorical1 r6 Y5 n+ ~+ C7 Z6 H

    % k$ U1 Z( \; V* D6 {train_labels = to_categorical(train_labels)
    # T6 U9 q$ ]" T, D/ B4 M' w1 Etest_labels = to_categorical(test_labels)7 {; P4 t% c0 Q" Z( A# H2 x: P! i
    1
    7 [6 f- u1 p4 I. D. g! I2
    % j/ Q5 c) w8 V9 g+ r* }31 t. V7 C& d) [$ |
    4
    9 D+ J: O1 l$ _1 y' _5 C训练网络
    $ O- d3 N5 I- |# f1 b' R- y1 r& T1 ]) P: v3 `6 C5 g3 O
    network.fit(train_images, train_labels, epochs=5, batch_size=128)- S2 W0 x  v& T0 U
    1$ e7 Y. g, j( o' D& G  k3 o
    输出:
    ) N) p: t  w9 P2 P# G% H8 o( ]2 C, N5 L8 z! `
    Train on 60000 samples
    3 P/ b6 F6 c6 V/ ]Epoch 1/5$ C7 E$ S) }# G
    60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254
    4 R( @+ ~. p  a- X' |Epoch 2/5, a4 ?8 g& D3 {
    60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693
    / M0 x2 ~) E' b& u  V  X& X8 b# KEpoch 3/5, D2 `/ l' o0 A- N4 v2 _/ g6 `( ]
    60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800. L" v' n% c# Z
    Epoch 4/5% o& ~2 n1 Y* f5 @
    60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848# c$ a, U! N8 l  E, c# R" M
    Epoch 5/5
    6 u& i- H& k) K3 \/ d60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888
    ) b5 p2 \- L1 X- k; e% x  Z
    7 C. [+ l) O4 Z6 Q<tensorflow.python.keras.callbacks.History at 0x13a7892d0>6 ~- B/ C6 V& V8 Q" z2 S3 ?0 B
    1
    # d; t9 f5 B$ Y6 S0 c2
    ' O6 Q8 S+ d- d% z. u3$ h9 P8 N/ Q! N6 n
    4. l( t% v- q/ m" E! ?7 N6 s
    5
    + F: C) I2 x9 ]$ A; B; }* {65 \, V1 v& d7 N! v# I" x
    7+ N; T/ f8 E4 r+ U
    8( E8 }8 R0 m; G3 `: A4 A; `$ k
    9
    6 u' Z. c# u4 ?" H& `* ]5 [10! \4 n, t  j+ C' S* t6 C/ G# W
    11/ _% y* h  x+ Y! F5 w! Y7 R3 w$ L
    12
    & S/ Q3 M9 T! r! H- q  @( A0 e0 n13: O5 O  H9 d  Z6 E' m
    可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。4 l' Q0 N4 G* Y, s5 a

    7 H5 R  d6 i4 u再用测试集去试试:
    & H; p, X6 ~( Z2 I& T$ T
    % ^6 P' {( u5 Z1 v7 C* ntest_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
    8 C7 r/ m! O9 X) J+ M) L' ?print('test_acc:', test_acc)
    : d7 X" R! X5 Q17 R$ K/ T3 d& }8 T4 z$ l) d
    2
    ; E& O  |- P' }5 c输出:
    " L3 b& A9 G4 B* W! b
    8 K0 E# F/ `& k10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789" z2 ]" ^7 b3 @2 Y- i5 }- @
    test_acc: 0.9789
    5 h9 ^. `% h) f/ d+ f$ \7 w, f1
    : p8 C( v$ n& i+ |2  e( Y" |' v9 I" a
    我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。
    ; {2 {0 ~3 c6 t% r9 M- h( X9 G" ^, T" n' q$ ?" T& q, @
    神经网络的数据表示
    , q0 p; M* j! Z9 @' v/ L" l% s  C' c9 ~: [1 e, C7 a; ~# K
    Tensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。8 V- b* E9 d; t% k
    : ]7 m7 ~+ H. @2 K
    我们常把「张量的维度」说成「轴」。
    1 m% X, W. s0 w5 h' Z. L# d3 j8 t6 g; C4 n
    认识张量! M5 X6 j% e7 N4 M7 O: E
    ; q' n: ]) L4 {- H
    标量 (0D Tensors)/ B* V4 V$ q  T3 c* P
    7 h) g. z# L/ S. X9 R/ ]& J, _
    Scalars,标量是 0 维的张量(0个轴),包含一个数。* |- R+ c4 i: e3 ~0 k

    ; F9 E  z7 l! T9 t, {4 f标量在 numpy 中可以用 float32 或 float64 表示。
    0 ]4 s% \% b8 H- L: d9 K
    * v0 c1 w' B: Ximport numpy as np) ^1 o8 O5 \& c" [% L

    6 [. B  ?' \& g. Z4 qx = np.array(12)$ x  Q6 r+ s& l' h  J" W) {+ I
    x  @! y2 d( q# G
    1( e1 T& Q/ i- V( E( f( L& F
    2
    # E/ m4 a+ i- f, K. G/ [1 [7 ^5 R' z9 d34 ~8 ]5 s) [3 m! [: @
    4
    . ~( y; n3 h; a! _9 \输出:0 t7 ^+ C- W8 }# y) [- a! f
      v) K$ T$ ^% f; ^3 D
    array(12)  `! c4 t7 v0 {" `+ Q9 {2 H
    13 l/ k/ `# }! O3 `' X2 ]
    x.ndim    # 轴数(维数)
    : N  S8 s- P# ~) l+ Q1: O  k  J5 P% D
    输出:
    : Y( Z5 h) d5 q$ l0 C' o
    ! W: q4 o- y* i, p( ?1& _6 m( y5 a( |4 a2 A4 z
    14 r. O" B/ c& x/ O
    向量 (1D Tensors)
    ' d, G8 X' U/ u3 u9 S: e
    6 G& O0 m' y$ o; DVectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。8 }3 a) K3 y( p: H1 A

    $ ]+ j( f: a* _9 k+ c# tx = np.array([1, 2, 3, 4, 5]). e+ o, e1 \/ g
    x, M$ [: F8 @: F
    1
    4 D  o' V- }+ f" T: P2
    ( X- @- G- }5 m0 ?2 L# w输出:& r$ H8 q# t3 ]. o  J) q) x$ E" Z9 o2 {
    ) X7 Y! L7 W5 g$ o' ?
    array([1, 2, 3, 4, 5])
    . o5 S. L. K# h& m1
    8 z. @3 `( p; ~; y( ^( O( Q5 u" e% wx.ndim5 h* [  p2 W, {5 Q: P% D
    1
    7 P/ C$ q, o) h, K  W2 J输出:
    + ~5 a  Q/ v* d- Z% \. m" v2 U. d4 E" C5 D; B
    1/ C8 G# v0 e/ A7 n9 }# g
    19 a- |8 |: k* j: s9 V0 X- P. i
    我们把这样有5个元素的向量叫做“5维向量”。5 @. [5 {2 o; ~% }) W9 c1 q3 K
    但注意5D向量可不是5D张量!
    $ D% H1 I' N4 u: j0 w; p; H
    0 o3 I( }5 o: P8 L2 I/ @5D向量:只有1个轴,在这个轴上有5个维度。
    ! |3 O5 `0 B& ?9 y  r5D张量:有5个轴,在每个轴上可以有任意维度。
    % c3 H/ @8 R) t9 [- S5 d" k* U& e这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。
    - k  t9 P0 v' k
      V4 I5 W4 q; C7 |- K' F6 R* |( n# ~所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。
    + @! l) B/ `$ v# ~5 v; x/ L$ u# j6 n1 X; l0 j' k
    矩阵 (2D Tensors)
    - {5 o2 o5 r; d* P7 ~! @  r4 g' ]4 U  \* x* M1 ]
    Matrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。
    6 V$ `4 x) g" a7 {( N6 P
    % A2 _& H! i1 y9 v  v7 t* I$ A/ z6 }x = np.array([[5, 78, 2, 34, 0],2 s( B, x0 i7 [+ H! C3 ], t
                  [6, 79, 3, 35, 1],0 F% `, G8 T; M9 D( `/ R0 i
                  [7, 80, 4, 36, 2]])8 \# L, `% E) i8 |
    x& r( d/ d; @9 e- ~
    1( f, I# D% x- }
    2. T* |; o  c# ~. S: [3 E/ K; |
    3& i2 a" j$ d0 ?+ x
    4
    $ x7 ^* D4 a% R. b2 [$ f输出:
    4 p% ~5 Y' i6 C  j! }1 \$ A! R) y
    array([[ 5, 78,  2, 34,  0],
    % [5 \  l" G5 m9 X       [ 6, 79,  3, 35,  1],
    9 y  ^! [1 p$ M) \0 t4 D8 s( [       [ 7, 80,  4, 36,  2]])
    " |$ k% x( Z+ |5 t/ {1
    1 `% g! t, T; T+ t! C2- @# F; M8 q, H0 f8 _6 [- m" f5 A
    3% K2 k* I& I- ]2 S1 W4 ]
    x.ndim
    " \* c$ W0 ]0 j  k: W* g) M1! @/ y  e9 ?+ ?% }7 m
    输出:
    ) [- D# n1 |- _+ C! G! e  Y0 E' {; `  y+ {/ F5 o- A: o* O
    2) ?$ U6 I; f% _9 d/ J% O# C5 @
    1. ~$ ]/ p0 {( S, S
    高阶张量; F  L, I+ G' l& i. Y

    ( y; z/ V3 R. e( o2 B5 m7 v你搞个装矩阵的 array 就得到了3阶张量。
    * H: U, {/ f0 ?$ P% {
    3 [& Q6 C2 W2 n# [3 f再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。0 y+ Y7 c. i% `' j8 F

    3 p6 W; B6 {- e* f' S9 Xx = np.array([[[5, 78, 2, 34, 0],
    : P5 C7 _/ ?& h7 v' T               [6, 79, 3, 35, 1],
    6 O! q$ e7 a7 E9 a  ]  K7 h( Y, Y               [7, 80, 4, 36, 2]],
    ' J* h0 p1 a! r' b7 u5 G              [[5, 78, 2, 34, 0],
    ; h0 d( l0 h: e- g6 y; K& \               [6, 79, 3, 35, 1],1 V, F+ k. r- o. u- t* L! c) ^& o" I
                   [7, 80, 4, 36, 2]],
    7 P' n7 W9 l  D( V4 E              [[5, 78, 2, 34, 0],
    , l. w# x! u$ }               [6, 79, 3, 35, 1],# P& s7 y  Q  J, J0 z
                   [7, 80, 4, 36, 2]]])
    ! o* {2 y" `& c* Zx.ndim
    9 w( r6 e( K& t2 s: J& p; J1
    8 E1 b4 G1 y& L2
    $ q) b1 j% l1 p: C; N  A& O31 u6 j% d' K, `0 M6 c
    4
    ! u; \6 ?  `# x( _- o5( T9 \# F0 r* M; Q9 d
    6
    4 U" d7 u0 |$ m4 ^7- W; G" a/ h, f7 M% v* |
    8
    + a& x  M) [  j, a" j0 _2 O9+ \: p& N' |0 P2 K' h( J
    10
    3 v; l- f# F3 E输出:
      |4 j8 G% P' f! J# v9 x3 |; V' n6 Z6 K  n' p# q7 t1 C
    39 H  i7 G) ~3 ]
    1
    3 N) r/ V/ X5 I3 _- |深度学习里,我们一般就用0~4阶的张量。
    : B" v2 T/ F) e( ?  q  s9 a5 r: Y# K5 y6 w+ e4 P/ }
    张量的三要素8 y7 y3 D! S( n

    / d$ T; I* |% c& O阶数(轴的个数):3,5,…# Y- t4 [  J& D7 Q
    形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…& c% Q! ^' z4 B9 L
    数据类型:float32,uint8,…* s1 W8 x3 Q, W/ P9 `
    我们来看看 MNIST 里的张量数据:/ p8 b. \, R- n3 r, F9 T
    # }8 C4 D* S2 w; A" W2 b
    from tensorflow.keras.datasets import mnist/ ^0 H5 V% n( e, Z, C" f  X4 N& i7 m
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data()' D: v# k! e! {! N% h- ~

    - S' j2 w# n+ o( Aprint(train_images.ndim)
    ' p; X) e* G: k& _" @# O9 B" j6 c7 ]print(train_images.shape)
    & v  Z6 ?& g8 m9 y6 xprint(train_images.dtype)
      ?* b! w* k" v2 s2 a) f7 n1
    1 Y" z( A- x2 }; q0 c& ~2+ q/ Z9 p) G  y( C9 e
    3; ?3 c( j, O) A4 g
    4
    0 l7 y% U& ^7 L8 b9 a5
    9 B  G& p: k1 {% y$ a0 l6
    : X( }9 y0 b4 p/ L  W输出:) p- i4 a" M' ~) p$ S% b
    / o) x' M6 G" a7 \  T
    3
    ; c0 J- u9 Z$ A3 N(60000, 28, 28)$ ^+ Q, a- z; r' n$ A2 S) ~
    uint8
    7 l2 @! U, G5 n% x' U) p7 I1  `% ^+ s- [" F3 v4 y8 n- ]' W
    2
    8 T, w* F, S+ P: j* G8 |3
    ' m' E8 f1 Q! w' [+ z2 k7 p所以 train_images 是个8位无符号整数的3阶张量。
    . U7 X8 P# J) Q* S+ F
    7 ~- S& o' |' A! W9 I. C3 B- x1 V打印个里面的图片看看:/ ]2 ?3 Z! z6 w! b. |0 }/ S
    , S  }" j( Z+ D5 Z6 D
    digit = train_images[0]
    ) H# _/ c3 a& v) x3 J/ N% b5 q5 W1 K( n! ~$ K7 Q# ?4 @
    import matplotlib.pyplot as plt9 c% t6 J# t0 n3 I: ?; p" B

    4 O0 N4 C: {9 q$ I+ Bprint("image:")) }6 t5 P; A: o
    plt.imshow(digit, cmap=plt.cm.binary)3 U0 m; T% w2 r
    plt.show()3 t+ [0 Z+ c: B  H% x9 v) `
    print("label: ", train_labels[0])9 o% I6 C; P+ m* V+ {- c+ X* |
    19 M5 U$ s% D* G; N
    2
    1 f  y) Z  e; i, W+ C3' r5 ]( l" K8 p; K( d
    4
    . w+ m  g4 B+ ]5/ q8 L0 v5 G+ j) Q$ @
    6# h* x5 }4 r; x# D& C) k
    7
    % C8 a6 n& c* A. s8( I7 @( U, I! s# Q7 S% ?
    输出:6 S, F4 _5 h  B* P0 d6 O" ?& G

    / {1 D0 F2 G8 ^ 1.jpg 6 }( m$ H! n2 A6 f  q
    2 x% O+ k) d: c# t* h" {
    label:  58 S7 o1 W1 z& k3 b3 m; k, x
    1: t( Y' f3 `( M* x% r3 k
    Numpy张量操作. z9 a. w) D! m0 ^) @$ @  k

    3 C0 w9 H3 b& b" o* C张量切片:
    6 P" O% Y+ |7 U4 f5 d4 k: A0 s3 `1 z( J0 ]+ ^
    my_slice = train_images[10:100]" t9 a& a% h1 _! M2 ~
    print(my_slice.shape)' G: `3 }' J  x% i! n( t
    1- S1 |% ]. B, f
    2
    3 E2 u; Y: J7 l3 K5 E# t" M输出:+ g( J$ ]4 T: z, U7 v# D7 W0 h6 l
    2.jpg : Q6 U4 F8 T2 E9 O* h
    (90, 28, 28)( H: Z' x; x; u' c. {, a
    1& p8 t3 t4 T, b9 K$ [
    等价于:. d6 ^2 y, W3 j: C* Z

    / ?8 q# K! v4 ]* L: S( {- M8 L# ~) mmy_slice = train_images[10:100, :, :]
    ; h% a# D+ U+ h5 e# wprint(my_slice.shape)$ ?( ~/ q8 @, X' e4 W# f- \3 S
    1
    ' m/ r' G" B3 _" d2 z0 v2$ L( c5 c; H' {, a, X6 F
    输出:
    : d/ _$ j0 ^" ~" \" t0 b2 d9 | 3.jpg 5 N' q5 o. f% d, t) L
    (90, 28, 28)+ H4 J* f; d; y; v$ _% q
    1
    ' ^8 @( f; h8 ?2 ~也等价于
    + Q# ?6 _% s" g0 C! j' b8 t0 Y. }! i  s- E1 b7 c
    my_slice = train_images[10:100, 0:28, 0:28]$ h, L) R% s% D9 f/ ]
    print(my_slice.shape)
    , r. g1 w& w# d. v1
    7 M& R1 Q7 R& q! c2: e  N; _5 f) O6 E* u7 `
    输出:* N& _" V0 J8 c8 A: N
    1 `2 H8 P# k# t. }) A' O
    (90, 28, 28)  o$ `0 x: Y4 v+ J8 h
    1
    ( E' S; S) I4 [) y选出 右下角 14x14 的:3 B7 {4 j5 o2 F2 j9 b1 Q) E* N/ B
    . Z: f7 @5 L  Q$ g$ S0 V
    my_slice = train_images[:, 14:, 14:]! k! e# E5 u6 X2 _9 j
    plt.imshow(my_slice[0], cmap=plt.cm.binary)
    ! |6 `) Z  v1 pplt.show()( w% X: X; n+ h& ?  p. m! |
    1
    0 k( q9 f4 z0 i% S2
    0 f0 d% E3 u  I6 q$ x3
    * T" a  l2 g& b输出:
    ( B: {/ F# x6 \8 W5 C6 d
    7 r) l5 b' l2 g  ?5 O' F1 l5 O
    . j! \/ y- y" D' F+ P5 o: `$ f& ?3 ^$ O  G$ J1 Z; W
    选出 中心处 14x14 的:
      F/ U, ~; a0 K5 h% X5 j# Z& ~8 D( j) Y
    my_slice = train_images[:, 7:-7, 7:-7]5 X2 D) k0 a+ b) p- Q6 v7 q  b
    plt.imshow(my_slice[0], cmap=plt.cm.binary)
    0 l; U7 g9 A3 D3 W' o* Qplt.show()
    + y/ x: C( D( o- v. D! S; p6 a1
    , n. @0 _3 j* D8 \7 @7 K9 H  G% n2% a  \4 q/ _; R; n
    3
    3 l9 J$ Q  ?& K" u. p; _输出:
    8 A- _3 E4 L# |/ T; k! X, e* v/ X

    ' X3 g. n# ^2 Q% C3 H
      A1 O3 O8 ]3 z) T数据批量6 p$ h6 |, D* y$ E; u
    / Y, V0 B" i2 @
    深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。. R) m  z! j9 A5 E& C% [8 F

    ; `( u' g# j# ^% L) D* l深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。
    ; t# N$ \" i+ X% w: b5 H9 z
    ) q. i9 \* T! b+ |4 i) @& }在 MNIST 中,我们的一个批量是 128 个数据:+ J& `9 J# Z' v/ d

    4 i3 _  W! D; e* T% S) ]# 第一批
    1 X4 _3 u, q5 P& p' ^batch = train_images[:128]) t2 A! Y3 F) B9 Y( X4 G$ \* x) [
    # 第二批
    ; ^( C* s* k2 {( |* rbatch = train_images[128:256]$ b+ g9 k+ M" @9 m' w+ r! c& M, H
    # 第n批
    $ a" D2 D9 M) e' B9 J( P6 Wn = 12
    3 S6 G: k5 @5 gbatch = train_images[128 * n : 128 * (n+1)]
    / f* s* B" r( u( R6 y1; @8 l, m2 }- S4 o% i
    2" N+ q( ~/ j8 F4 l$ l) Q
    35 N2 n, ~7 @- V4 w) d! I$ a0 C8 x
    4) i8 B' H% f9 F! H+ ?
    5& d- Y2 V( ^% f6 h5 o3 M! \
    6( l* V  T+ b1 h
    7
    $ t% d$ [# K+ p# J所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。' U6 N! I6 {4 H9 v! n
    $ @$ T4 J% \# S" [, m; F; q
    常见数据张量表示
    7 O. L* K( p4 L  j  g* v9 D4 P- k1 Q- s) z* `6 E% p# d
    数据9 K) j( L! l5 m
    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-19 12:42 , Processed in 0.681422 second(s), 58 queries .

    回顶部