QQ登录

只需要一步,快速开始

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

    ! t+ S5 ~& ~+ c. K1 U$ \  {Python深度学习之初窥神经网络$ K6 d* ~6 L4 T
    本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。# D! t( m& Y( j' }8 e2 m' O

    2 R9 e0 j1 L" }* p( T. X2 t本文目录:
    ( R2 B9 e5 j' J1 \* Q5 z/ n: x$ n0 E' v6 G' ~0 b
    文章目录1 x0 b: o6 I3 a$ V4 c5 M/ M
    : ]1 z* ~- j. G* t& _3 d. K& x
    Deep Learning with Python
    : i1 t% X0 x6 @2 G) F初窥神经网络
      D$ ?8 W+ d- H& j1 Z+ n3 U. P导入MNIST数据集
    9 U. z7 c9 r' u1 X/ V网络构建1 U- }5 P* C" }# i- |$ g) {
    编译
    5 i- h0 c3 f. s1 ]预处理0 a1 x- k: Z& W# P8 p/ _
    图形处理, K2 S% E3 o; A# X& [
    标签处理
    * D0 V$ I# |% i4 T9 x& S训练网络% s0 l$ G$ j, W3 C# y" h6 Q
    神经网络的数据表示4 x1 @0 ?/ ~/ e, K$ L
    认识张量. `& }) d# W+ y! n6 v
    标量 (0D Tensors)
    ! G* M. I2 ?: t向量 (1D Tensors)( z* s2 _2 H  X
    矩阵 (2D Tensors)
    6 h5 u, B% r3 V! X) W' U8 X! {9 ^高阶张量
    / d' i; [: D1 x8 ?7 U3 i3 K$ T张量的三要素
      K/ t  @7 \7 B/ h5 b( nNumpy张量操作
    ' {6 P! p6 e% @( n0 g张量切片:" S; w# V! r. [1 U4 S* `, }7 r
    数据批量
    ; r  G6 N" N. f5 }  ]常见数据张量表示
    3 Z0 F4 V9 D3 c9 Z% ]神经网络的“齿轮”: 张量运算
    / s% V, c* u- [- S, |) e1 B  \逐元素操作(Element-wise)1 R) B2 u2 ?8 z( m1 n# |" W8 o
    广播(Broadcasting)% c# h1 q7 G( K) m$ X. N
    张量点积(dot)
    2 _3 d' @5 R8 K& @4 F9 g1 O* ?张量变形(reshaping)
    ' J2 R- j1 o; H9 W0 m0 K5 @神经网络的“引擎”: 基于梯度的优化
    : X" l8 G5 K  E1 |# G' N导数(derivative)
    1 k) F/ g& T3 {" w梯度(gradient)
    + O, |/ U2 `8 ^, k/ q/ t4 t随机梯度下降(Stochastic gradient descent)
    8 S# y' R" g* n9 B) Z反向传播算法:链式求导
    1 O$ ~: k! {. g" a; K本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。. H+ _/ H# B5 q- r( W! D
    0 E. z( E4 ~- Z7 z8 e0 U1 o
    初窥神经网络$ q% z" q3 J: m2 {1 p& P& s
    " ~$ z9 o7 [8 p% U4 a. y& {7 u& [
    学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。
    " j+ I9 T- T( M. k9 D7 V. Z: S6 X0 S6 r, e6 k
    MNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。, V! W5 E7 a! n' ]0 u: `" ~

    / y6 w" z. u& z0 J1 r导入MNIST数据集
    ! I- Q' D/ V$ S2 l. }/ j9 M
    5 J5 X$ ^: p: u$ `6 @$ X$ j6 Q# Loading the MNIST dataset in Keras2 I! `' J1 q8 D% B1 _
    from tensorflow.keras.datasets import mnist& X2 t5 x- [) N  O' y" S
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data()* f: f+ l4 u: Z4 _( w
    1- _/ n  q: l% R3 f/ M
    2/ f! p- a' I) c1 d8 G, @
    3
    * P) Y. B$ [* \3 |) L2 D看一下训练集:1 S& R2 }* S& H( y7 c4 L) n. a
    % H5 Q: J0 R' m* [+ i
    print(train_images.shape). O1 p2 `( W1 N/ }& P
    print(train_labels.shape)* d  S! V2 B6 h) I, D
    train_labels
    & o# e5 r0 o6 P: x2 l% s1
    " D/ i3 r* h& H1 }% r2
    % T& c% d+ s& ~' |4 G3
    9 [* e5 {, ?9 \# u1 j输出:7 V0 V2 R& o+ d* A1 P7 r

    . \5 U+ g9 {* l) _7 g2 W- R(60000, 28, 28)" T% x2 F3 x: d& Z
    (60000,); f" r; T0 r2 q) u
    / n& C! ?! S+ R8 x& _+ b+ p, b
    array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)- O6 x7 Q/ Q  C( o' R& `
    1
    8 j2 W% o. U: {5 Z4 S2
    9 Y* @* v& b' H# L& S- i. q# }3
    ) ?. H3 t. C7 ?$ k. B# [4
      W: S' I+ g* P, b# j  _这是测试集:! V( y" y1 i" v0 X% a

    1 ^% ?. v8 U% W) }- v: S; @print(test_images.shape)+ K- L$ L, \# P
    print(test_labels.shape). i: i- s3 y: u* K: J0 Q
    test_labels
    & D8 U, J- j" D3 u1
    - Q; l/ Q. Q  E  ^& i2" x& n* X( v  o+ }5 H) k
    3+ j, f, w2 C/ ~
    输出:
    3 k. y8 i1 ~  a$ y* ?/ ]- Z* V& B$ x5 h
    (10000, 28, 28): E3 L  _) N1 }* \" J' I
    (10000,)
    & k$ T9 B' p/ \# \! H( k7 D" p
    " E# Z4 G( g! [" a: c# `array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)
    $ S+ }1 L5 W! O% u; i  M& ]1
    . g* o5 C$ k, p9 k. \3 v2
    4 S7 u6 F, c4 S# s. g9 _3
    : N0 H+ |) ^0 P# u+ g  W; z# B4$ A: U* x+ N' X5 E7 F$ e! @
    网络构建9 H% y6 I$ E& j! K
    & P8 a$ v: A- d$ u
    我们来构建一个用来学习 MNIST 集的神经网络:: N6 S, H" i) p7 N2 X2 Y
    & Z5 g4 {# g' X0 a9 P
    from tensorflow.keras import models
    + a1 ^7 v8 b" C) T) N! ^+ wfrom tensorflow.keras import layers
    % }5 ?' P2 }7 ]4 q
    * S# T2 x1 {$ snetwork = models.Sequential()3 G6 k+ p  s4 v. G2 R
    network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))( c  M  @: h. ~4 i$ D+ U2 q1 B( T
    network.add(layers.Dense(10, activation='softmax'))
    6 P  `: L  y  O1 d' z1
    9 J! l" R3 @: H9 {# ^$ ^: }2
    9 P/ I: l: M! S! L! A$ J- J, [6 d3
    - t+ N2 J9 V. k7 ?2 t2 P4
    0 T) Q) Z% n5 i" k8 r( r) ^4 v% B5
    5 n6 z# Z' M, g7 v- S68 w6 {4 E. x$ ^$ j1 K* ]1 w
    神经网络是一个个「层」组成的。* i/ d; U. a0 A/ h6 \: n* o
    一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。
    ' R7 g" Q- J0 y/ y! R( m! a8 C3 Q- c, D! s' s
    这样一系列的「层」组合起来,像流水线一样对数据进行处理。- `; A* ?8 a& c: }8 u& j
    层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。
    ; @5 J. B! q8 c6 f: `+ w& `' y% Q% r9 {+ {+ T9 _% h( L4 T
    我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。- \5 z) ~3 ~4 F: r# ^% E( @
    ' t2 N! w9 \9 O2 E- S7 F! A
    数据到了最后一层(第二层),是一个 10路 的 softmax 层。
    ' J- T" ]0 o0 s  y这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。
    * }  S. I, U7 T事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!& U/ [2 z) k- R. q3 _% R" N
    - }& [+ D0 z. x: Y. v
    编译
    8 H" ^# r1 S0 [. {+ U- U) }4 n( Q8 {, u- \
    接下来,我们要 编译 这个网络,这个步骤需要给3个参数:$ z* W8 \8 b5 q3 X

    1 n% [6 ]# F6 N. \, T损失函数:评价你这网络表现的好不好的函数2 b' J( }8 x/ ~/ p/ V( V/ w8 h, O
    优化器:怎么更新(优化)你这个网络
    ) s0 M, M  ]4 k训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度* @) L, Z; g6 w1 J2 z9 W1 ~
    network.compile(loss="categorical_crossentropy",
    # j/ o% ~% Q" O) z: a                optimizer='rmsprop',4 P0 X; v- e" _8 J' j
                    metrics=['accuracy'])
    6 e% l& }3 }& C$ c1
    7 B2 r9 j, w: ~" h, W) j/ u9 a  x  O2) I& I4 X: O: S. ?, T: Y7 G' |
    3& S3 K. M3 z3 x- A
    预处理
    0 n: }$ [, I- o( S' d$ k0 v; L( |) X! O& s
    图形处理9 H) P% e- T$ i/ C
    : ~& r5 Q( d( ]; Q. e
    我们还需要处理一下图形数据,把它变成我们的网络认识的样子。# A6 a8 c: F3 A
    6 i+ K. k% C) s& o: r. J, j5 q
    MNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。
    8 R  }8 u: d( I& B: a( i9 F" x& U而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。6 Q6 o  N$ `- ~6 q' ?" M$ ^/ I
    * R, ^6 w! h3 l: T" c. U' S
    train_images = train_images.reshape((60000, 28 * 28))
    : O! w  D$ M0 d0 u; Ktrain_images = train_images.astype('float32') / 255$ [3 X2 c3 \5 M: `/ e+ U7 Z. y
    3 g2 D# Q) W& q$ f# E2 d
    test_images = test_images.reshape((10000, 28 * 28))
    , u* m) S: N0 Z7 ktest_images = test_images.astype('float32') / 255
    . Y, v3 {6 E, R2 j" X1
    " S9 K: j; W& O9 S  i) K29 H1 y; y* l4 ?9 r' s3 L& J
    3
    - z7 b% L  P6 @/ _5 {3 h/ N- O+ j4  C* |* [  A0 F( T" t
    5
    5 x8 _" _2 f- G- ^标签处理, ^  {' H. `7 M$ f
    - H: G9 C1 C& l/ e* ~, M$ o
    同样,标签也是需要处理一下的。
    ( v! X9 L2 M8 N" s, k2 K& B/ m& |
    from tensorflow.keras.utils import to_categorical
    / ^8 \0 s! d: p) F, @' l
    * _/ V8 B  _0 P$ jtrain_labels = to_categorical(train_labels)" m; Z! ?$ l" l7 B9 c5 M' _
    test_labels = to_categorical(test_labels)6 T  N! h0 y" c3 N$ f, P* O4 W
    1- E; m3 L9 E4 i$ H
    2
    ; B% Y/ h% }* p6 }3  K8 F* z0 U* P6 x
    4
    5 s9 l: R; }- j2 h. s训练网络0 }* }+ ~/ a# a* |& R$ c3 n$ k0 P0 j
    1 T' R: Z: Y: L9 {; l, E! a& |
    network.fit(train_images, train_labels, epochs=5, batch_size=128)! F& h1 Y" d. o1 r/ p% }. q. @
    15 N# d; P8 Z$ t+ Q1 r1 m( b/ c
    输出:3 v/ A/ A* C6 T. ]

    0 M# r) H- I7 z9 cTrain on 60000 samples
    ) h' K* P# T6 M8 A8 t5 hEpoch 1/5
    6 }0 P$ F7 {( q60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254: T3 U* V) O3 H1 P+ h0 f
    Epoch 2/5
    # i: i+ x" r0 {$ e60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693# P4 E7 }' ~1 o0 N& m# `
    Epoch 3/5
    ; `; [1 O3 e( y) J) j60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800; [& q6 [* f2 [
    Epoch 4/5- B5 d9 C; i: U. r7 D$ o
    60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848
    1 B( D9 N9 K8 e) V1 O/ \Epoch 5/5
    4 w- U; k4 R4 @% y8 P60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888
    5 L, L8 Y- T2 r) ^
    ( O  Q6 r8 R) M% ~<tensorflow.python.keras.callbacks.History at 0x13a7892d0>
    / y9 f0 \& B$ x5 l4 ~1" M% b0 [4 q6 L3 V1 I
    2% m1 I, j2 |% H; A* O$ t
    38 `2 I1 Z* m$ g0 ~2 W$ t6 p' }2 ]
    4
    % `4 c% ?% U$ p. m6 S) N: ^5/ M- |0 m) i/ u7 l5 v
    6" `$ w8 M, v/ t
    72 c3 b2 M% I1 D" x& k/ V  E
    8% B. c5 C/ U, a4 x
    9. [) P; e6 m  i
    10
    ' N* \1 s4 N* E- c. q11! Y2 A' ~  `+ ^- l
    12) t5 T5 \* P+ d% J
    13
    + u% b9 n+ l: F4 p3 V% Y可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。0 B$ Q! s; u0 f; a  K' Q

    3 G9 N; |) p" }* Y! ]! L9 E再用测试集去试试:
    " h8 Z0 d7 H5 q- d. t4 V4 }0 D
    7 ]$ X- z6 f/ U/ @/ o1 u8 rtest_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
      s9 u6 }& I! p5 c. k) Iprint('test_acc:', test_acc)$ {  }+ ?0 m( w7 b7 i1 Y; U- n
    1
    . A- S0 |; p6 }$ Q- X2 }2+ b0 ?9 K" w( ]3 Y" K9 ^+ k& Q
    输出:$ J* a0 g: v& }% U# v0 ^

    6 M! T  d' c. @# k7 ?. w3 X+ h10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789
    ' @/ i8 K- d0 R7 G: Ctest_acc: 0.9789$ E+ A4 _4 t4 L8 X2 x, B1 r  C
    10 Q* C. w7 P4 M" ]2 y7 m- f3 I/ M: Y3 M
    25 Q/ y$ \& O/ N+ X
    我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。! P- z9 @9 B# |! K# c

    1 N' I( y% B2 Z% k( y神经网络的数据表示& @4 ~3 |6 o; S4 r2 p$ z' D+ p
    7 G9 |" K: B* O6 n/ X: ]9 t- X
    Tensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。, t5 K6 w% {: ^# a4 y
    ! O1 f  U' L3 N4 k
    我们常把「张量的维度」说成「轴」。
    ) y. Q5 V0 H; c* A$ x$ f  M- W9 ^% M$ e
    认识张量( P: z+ |/ Y7 r# }" i
    ! _! \+ a# Z4 |; w
    标量 (0D Tensors)0 U# r; O  d! t' p9 J6 W7 j& L% a

    6 A1 s$ ]2 I9 u* ?- L. hScalars,标量是 0 维的张量(0个轴),包含一个数。
    4 f9 y4 a& p( Z! y9 x! e. `; c" O5 R* N
    标量在 numpy 中可以用 float32 或 float64 表示。
    8 e) v+ e! x7 |) t& N; d6 h' l
    $ k) t+ s) |; U! O4 W+ Gimport numpy as np# f! E( d9 }$ g7 g# K
    $ N/ `' H) V5 J5 S# R( T
    x = np.array(12)
    / }2 e* A$ t) {1 i% r$ yx" u3 B9 y& J7 n& g/ p% Y
    1
    3 C+ W  Q1 q. A, d, b$ h9 I& ?2& T1 b& V* [' e* ~( @" O# I$ k
    3
    ) }* L# {+ @% U5 N% ~* ]4/ L5 ~  c0 h- F( `9 [* f3 t$ p
    输出:
    6 H' z* J; O  @, M4 K$ a6 q& h9 b  r7 n
    array(12)  _1 t- P% z: h6 D) W0 V+ W- l9 ^
    1
    ; R% a, x+ I( E* {. F) U5 \0 f- ]x.ndim    # 轴数(维数)1 i5 C" P+ R  z2 r' p- U
    1
    ) O0 N' f# Z1 P2 R输出:; e9 W2 G" n0 h+ {. X

    - N" T- z# S4 I$ ?5 B6 k) u& k# m1
    7 g) W2 Q/ G1 S! ^3 y/ d' o! @# f1% s$ e5 j5 ^7 z0 N/ Q  T9 S
    向量 (1D Tensors)
    . O0 L" n+ n  Z3 O: L1 S
    4 o0 ]4 D1 Z, J; b4 i# P2 _Vectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。+ q) R' q6 ?& K$ @. s
    8 Z- g* Z3 {' ^
    x = np.array([1, 2, 3, 4, 5])
    $ {4 ~- B" g. F9 m4 u! lx
    ' d8 J% T9 x, S$ j/ j18 X9 r& d; O6 V1 A6 r# C, ]; A
    2
    1 G3 c2 A7 o8 D输出:
      a/ r9 c. V- g5 ]/ X
    . O- P0 ?6 y/ |3 f0 [array([1, 2, 3, 4, 5])
    ) @0 y8 Z9 c/ u- A1. Z2 m! k' O5 @1 p, Y
    x.ndim8 y3 W) N: c  ^( _* |, k
    1
      k9 b1 X/ B- R5 M5 A0 ^( f! \# D输出:
    / F1 C: m6 t7 S& o
    / I) a% x  f4 a2 h( U$ c1# g) w  @3 P( B+ Y! ^+ r# D2 F
    1" m2 N, [/ i- d  w' e6 T  ?
    我们把这样有5个元素的向量叫做“5维向量”。
    + A6 i, w, ^: A但注意5D向量可不是5D张量!
    1 W$ v7 @2 L+ ?; U2 R
      k- j+ A+ h5 v3 V% O5D向量:只有1个轴,在这个轴上有5个维度。8 \" M" r  x: U/ S3 z& _" M9 |$ G
    5D张量:有5个轴,在每个轴上可以有任意维度。
    . H, R' Z2 J$ H4 G8 E这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。# F5 x1 m/ B' {, I

    ) E' H. t: z5 `" m9 M所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。
    5 s# J1 z5 q- k3 C; x% A1 P
    9 v3 U# n% A5 J( l* o& Z矩阵 (2D Tensors)4 p) ~1 f" R1 V" @4 z3 w, \; d

    ; j# N' c  c! @2 H7 j5 }3 ^4 U& C: `Matrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。
    4 ~- E5 z! n2 b( k9 \
    - e) b+ j3 o2 B/ wx = np.array([[5, 78, 2, 34, 0],
    ' S( n( Q' Z1 _* `  W/ T" m3 y+ v              [6, 79, 3, 35, 1],* _* ^) ^) g5 W
                  [7, 80, 4, 36, 2]])1 X; P- }) H* s$ B* M8 s/ b
    x( y. l0 s3 }2 r6 s/ q
    1
    $ n8 a9 v# W* Z& @2/ Q! N+ m: o( }+ G/ O- V0 a8 E
    39 H& l4 W6 X$ F+ ^" Y' k( H
    4
    6 Z& j& j6 _/ w% y: b' ~输出:
    ; L' A, m, U" Y: s, m- }
    ) \7 ?- L. d4 K; Oarray([[ 5, 78,  2, 34,  0],- b+ N0 t) v1 C+ d# t+ _2 V
           [ 6, 79,  3, 35,  1],
      A( w5 }& e2 {* q. [: B       [ 7, 80,  4, 36,  2]])% w- p( _9 }, R( X2 v( q
    1  T; W2 s& F+ ?$ V
    2! v7 G1 T+ c1 s7 R
    3
    6 k" P) y& b: d( {6 Hx.ndim4 d& m1 j' j1 _0 l* Z
    1% H4 c6 w7 V- A/ Y2 F8 z1 U
    输出:; j/ D- J# F* J8 F

    7 l# P( p. ]2 ~( V" u( ~2. N. Q7 N. `8 y, R( y4 S5 d
    17 f9 J- ?* z6 u6 c4 A! p
    高阶张量
    - n" F* l$ k, g# H! i$ l: a9 [
    4 r+ M% X7 A) f! C7 f3 x你搞个装矩阵的 array 就得到了3阶张量。
    " s5 X  L2 m) N) I! X/ C- U! ~5 d
    9 l. |* L4 K7 e# y! Z再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。9 r# x1 q8 G$ \$ g" {/ [* ^' z
      W( s# g/ ]3 h8 P' [; t
    x = np.array([[[5, 78, 2, 34, 0],; Z. b& F8 q3 E' O
                   [6, 79, 3, 35, 1],$ \  r) B' X0 c" w4 v2 a
                   [7, 80, 4, 36, 2]],, R9 i6 O' _4 \- Y6 q/ W
                  [[5, 78, 2, 34, 0],
    + ?" N& _- _  ~. @7 C+ h               [6, 79, 3, 35, 1],0 f1 d- o& W# Q/ E
                   [7, 80, 4, 36, 2]],
    # u# k9 ?* E- q/ }" ~& v              [[5, 78, 2, 34, 0],9 K8 U# E5 V- v! Q. P$ v
                   [6, 79, 3, 35, 1],6 J8 P# T+ E& }+ z
                   [7, 80, 4, 36, 2]]])8 }. P) K+ q( a
    x.ndim6 t, `) H' }- V) r
    10 u; P7 k& o+ r# W: i  f
    2  T& b- z- `4 m% m$ H' ^- v
    3
    " @. k4 U! i) N1 S2 m# [4$ O" F0 b5 @, l
    5
    & V3 ?6 g( q2 H" m7 f- _1 V$ ~6' R0 B7 |1 G/ Z5 H
    7) g3 h6 Y9 k& o( Q- q5 u+ a
    8( Z  Z0 _) x' ~
    9; i6 m+ B! @4 Y& b0 M7 r! C' {5 T$ G
    10
    / q) {; S% f8 y输出:
    2 m! D; b% b/ Q& G- ?* I; G
    8 c6 c; M  ?' e1 I36 A( Y2 N2 C, L
    1; A  \. Z7 `, |, I% s6 q
    深度学习里,我们一般就用0~4阶的张量。' k0 F- W6 ?$ ^

    # `8 O2 H8 ]: T, l: p张量的三要素
      g& J0 g( A7 P& X2 ^7 p' Y6 E, y' z; t* @' o5 H
    阶数(轴的个数):3,5,…
    4 t# d. {6 n& p形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…9 z7 V* J, }# P% _: @
    数据类型:float32,uint8,…7 B+ z2 O+ q" N7 `7 M/ ^
    我们来看看 MNIST 里的张量数据:" [, k/ m1 N0 A! D6 E% f6 ]% F

    / z# l' g1 N' X8 O5 _: Xfrom tensorflow.keras.datasets import mnist
    8 n) A+ c8 n/ L# w: _(train_images, train_labels), (test_images, test_labels) = mnist.load_data()$ R. B# t: e. |; h8 q0 v/ l- j

    3 h# Z9 N' Y+ ]4 |* fprint(train_images.ndim)
    ' N, {0 c  W: b3 _8 aprint(train_images.shape)) N1 k# p2 d; M4 M& Z
    print(train_images.dtype)5 }( Y$ V5 [* y+ t) l9 q4 |1 E
    1
    1 f7 i% P5 [  q' s4 z# c! O8 {3 C2
    ' n0 o' C2 ?# N* y3
    8 z7 ~* i, V" {* n+ l4$ |4 M0 w; X2 c
    5; d' H, ]! U8 A. A& @. D
    6
    2 J# L* q6 v- I% E! _% N' x7 t输出:
    2 m, z( j; G6 L2 ^0 I: c* K0 x8 r. e) X, E% A' e. }* F! c4 }
    3; K- F) `( ]8 V0 V( ?4 r; L
    (60000, 28, 28)
    + w  ?6 ?& r8 Q! M1 `+ J% _' xuint8( o- n$ m9 f+ G4 U1 x9 n% N
    1
    , p3 ^9 l. v7 x# Z+ l2+ u6 m+ f2 C, [6 J  o) b
    3, ]! l+ ]" B! n  B  v$ T& D
    所以 train_images 是个8位无符号整数的3阶张量。0 n! ?* _; ~. F  k9 ^
    * A5 a% M' o& S! q4 {
    打印个里面的图片看看:
    / o, Q% \0 `2 E/ t/ @: I& B; s8 O* `! `( J* @- f1 `
    digit = train_images[0]* ~9 K7 R" o# Q; X

    " p6 i# E8 C1 _import matplotlib.pyplot as plt
    8 t) V! \' O  \8 |5 U3 h# _' k( m; e- B
    print("image:")
    4 X% `* N9 Y3 g/ |plt.imshow(digit, cmap=plt.cm.binary)
    ) E; N) f, x# G: y- \* u* lplt.show()$ [6 f: i: y) u: }
    print("label: ", train_labels[0])7 h) f/ Q8 @/ R3 j: b/ \3 K/ {. F2 |
    1% E$ Q! Q) E6 p* d3 b8 q" Q
    2( w2 @5 X* c: u6 @! i9 L: G
    3
    7 K3 Y2 L" J6 Y$ J7 D48 o4 j0 s4 j  `: |5 @
    5/ Z& B# q, c$ F+ n5 W, Y
    6
    ) B! b: X. o- T1 s' |- B2 v, B7
    & N8 O+ U, j! `& v% D& q80 u# u% o4 c( S: `) `
    输出:
    # W; Y% V; d$ [7 `
    - s/ ]" p' T9 n: D/ @+ M 1.jpg . N4 S# V9 e% K% ^
      O/ T, k8 b% _2 l* y$ `: N$ x' A" z) t- m
    label:  5$ V4 b# c3 I. O* \
    10 D' ?' F' ?7 r+ ~8 E
    Numpy张量操作
    1 |- l* |/ E& Z; t. j9 ]" K! O2 ^! z' O' |& S+ e: J
    张量切片:
    . P. X) L4 x5 n! [" R% A8 F1 s' s! [5 x( e
    my_slice = train_images[10:100]
    ' l; k; [3 S" C+ t- X& {* mprint(my_slice.shape)* U8 K& U+ `6 e) K& O
    1
    0 W! q) b9 v, p% Y2
      }6 ]% y  k# [$ t输出:3 G, e% L$ M" w. }" @- n
    2.jpg + m: s) P  c3 t( O# c/ X9 y6 M5 G
    (90, 28, 28)- n1 }7 `- g/ I4 @- o% i6 G3 J, v
    1! \* l) ~1 [9 ?* F
    等价于:& ?4 Y9 @3 a9 V" h$ R, A' K

    ( Y7 B  b3 ]0 {5 t& Wmy_slice = train_images[10:100, :, :]6 B1 O; f& A/ t
    print(my_slice.shape)/ v" j7 q5 F1 ~# K0 J8 u
    1
    8 K8 N" T; z$ A$ T  I28 M; f: I! {" [
    输出:  p; v- b9 h; Z" q
    3.jpg 8 y- o, Q) t; J8 [6 Z1 g
    (90, 28, 28)0 k9 a5 w2 K2 \" p' _
    1% I1 j2 {5 C5 h) c" h) Q' f/ S
    也等价于  {  Q: |: X! z, ~) j+ G

    4 k+ G! `; _. D( i! |8 ymy_slice = train_images[10:100, 0:28, 0:28]' x. @" S/ y8 ?- s4 C  k
    print(my_slice.shape)$ k! L! G. z, k$ _
    18 e7 Y  V8 S5 d' a9 P8 a0 S" j, k
    2
    8 Z# j. ^- t" j. \- M# N% Z输出:
    * K+ E& `% |1 e1 K
    2 K5 _: p, h9 c+ t. N(90, 28, 28)
    , O, ]: G, y9 S3 \* J1  L9 _% R* K& I8 {
    选出 右下角 14x14 的:
    . j; s3 o8 e/ b. L: g
    + h8 e, E8 e5 O2 M* }  Nmy_slice = train_images[:, 14:, 14:]4 b3 b% I* W' c
    plt.imshow(my_slice[0], cmap=plt.cm.binary)
    : ^# A; O) M; T2 |plt.show()
    $ r6 y% q6 q/ t6 M1
    % [7 @: m- q+ T2 s2
    + Y* o( j; U% r" l2 F, Z. f* J34 @8 }9 g5 u- o: J- c  V
    输出:1 A1 P2 r+ A/ X7 @( m
    9 U3 V  B( M! m: d* i2 ^
    - D5 Q" E/ T* x- R5 ~+ I/ S

    + N) L9 e+ J  ], X7 c" B) s选出 中心处 14x14 的:
    % ?% C4 K8 c% p) C6 p
    ! ?9 ?2 Z6 I# d4 D- rmy_slice = train_images[:, 7:-7, 7:-7]
    . Z* q7 J. N- b/ k  p3 vplt.imshow(my_slice[0], cmap=plt.cm.binary)7 A  i2 t3 y9 D& R) `
    plt.show()4 Q0 X4 {5 k( k) x2 a6 T7 r
    1
    4 U& g* }0 W1 \2
    . A, V/ H1 w' R3
    . S- s" C5 O9 _) O& {! g输出:/ q1 w6 l# E; o7 {  u3 \" ]

    , `# _+ ~; e% v* d) _
    ) b' F" b$ j) |( ~8 [3 l( k7 |+ j
    数据批量6 y* Z' n: c. @" z, i1 K  p4 x8 R
    - X0 v5 g+ u# W9 S8 G/ M# B  X4 P: i
    深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。2 ^* J- u( k8 o
      q1 b! q# n- t3 w
    深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。
    & `0 s8 f% A5 C/ @! |- ~& P+ M7 N" \( `% b# r, M
    在 MNIST 中,我们的一个批量是 128 个数据:0 U4 Q. H) v& W0 a7 O6 t

    + S: j8 z$ V% A) l% v3 Z# 第一批
    3 V& `4 ~; _+ T' ^# Kbatch = train_images[:128]
    4 I: y  E2 ^, h9 @5 V. ^# 第二批8 g- d* w- @$ u' i, Z, K
    batch = train_images[128:256]
    ( h+ s, ~# l5 @5 @# 第n批, U7 f( y3 Y$ w; p' }$ h
    n = 12( k2 G9 R" @6 C3 L5 _! m
    batch = train_images[128 * n : 128 * (n+1)]3 l% g9 ^/ u8 m
    1
    8 B0 ?  ?3 j* K3 G0 L) n2( i5 u2 E* U* S3 {7 t) z. a( R& V
    3
    5 t: [& d$ {# |4 \2 x$ U2 h45 K- \2 M% q$ _
    5
    " j* q* u! g+ F6
    ! H6 W) ]; }# c8 R5 E& i7
    * ]! w: J4 e3 M" ^7 G所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。
    ' I* C7 @2 C( r4 I$ _
    & x0 p9 R: ~; h) ?) U2 C常见数据张量表示
    . M& [" E! V) G' f; I
    5 ^& J& |; O: W7 Q7 ^数据1 q3 W6 L5 d0 m7 z; F6 L
    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 14:44 , Processed in 0.434800 second(s), 59 queries .

    回顶部