QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6510|回复: 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
    ' b( w( q; M3 z/ u5 _: i4 j, s
    Python深度学习之初窥神经网络4 H; G2 G5 ^# d+ D
    本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。
    $ P6 N. [9 D) U& W% s! ?& ^  O( C1 W- A  {* \3 P: q+ B7 Q4 A- G+ F
    本文目录:
    ; }! z) L4 E8 h1 b
    % o5 l4 Z' b' ~* d0 z4 k; P4 N9 g文章目录$ u8 S) ?" D4 P. g# N: U

    3 R/ w7 t8 @+ QDeep Learning with Python
    % @" W; S1 `: k  H  f$ Y* S& v4 A初窥神经网络% a3 @' O8 m8 X) l! c
    导入MNIST数据集& q$ S2 c( {/ G! u4 b3 m: i  Y" S3 d4 a
    网络构建2 a! T& N: g% F* ^
    编译
    ; M8 T# e+ g1 H: Y. J预处理
    / j: Q8 w) i4 G  A( {7 A图形处理2 Y2 v, L1 V2 Q
    标签处理
    7 B( ]- W. m2 M3 n训练网络! t. O8 _* K2 [7 f7 W4 v5 t* |  g
    神经网络的数据表示
    : ~. c$ }' g# P# \认识张量( k5 h4 ^2 d1 _: D' I$ i
    标量 (0D Tensors); s+ i* |$ @5 Q3 B  v/ a9 b
    向量 (1D Tensors)* b, ]! v% j( A, Y0 }& L
    矩阵 (2D Tensors)
    " S: R/ N: ^6 }, ?( ?高阶张量
      ]7 J; d' w" t* C张量的三要素
    ( p" [$ z/ b% V" u0 z: F9 \Numpy张量操作
    9 y: I, Z+ Q9 F$ x: _张量切片:
    1 L3 H5 u, A0 ~1 y6 e数据批量  C2 ~! b1 T7 d2 j# y
    常见数据张量表示0 W$ n- V! o( P9 \( F1 g
    神经网络的“齿轮”: 张量运算- P/ f6 c$ H3 W0 v& B( I& K
    逐元素操作(Element-wise)
    1 M  `5 Z7 w' R4 y1 Q广播(Broadcasting)
    7 q* l% I- q: J/ {张量点积(dot)
    ( N: P  s4 B1 p/ R0 d3 P, a张量变形(reshaping); v/ e& q# b' Z$ ~' v+ Z+ d
    神经网络的“引擎”: 基于梯度的优化1 ?. |2 }% B* B5 t8 Q4 y
    导数(derivative)
    1 x" p( r2 l% e) S1 j0 Y梯度(gradient)
    4 F* _: T( `9 e随机梯度下降(Stochastic gradient descent)7 Y" J3 v. H7 T! |: N/ B2 R8 ^
    反向传播算法:链式求导
    $ ^( G( d  e9 f: v9 V2 ]6 p本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。
    / N: ]# M4 K2 N2 p" m6 f% s9 ^; j) U. y
    . P' g! N, j( y1 H4 K+ W% C6 X初窥神经网络
    ( Y( H7 f: R; j
    + M# J" I! i6 C- H4 m学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。
    3 @) ^- R4 M$ k2 t+ P" m1 s. J- V2 ~! \5 ?% m
    MNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。8 F4 g& k- Z8 M0 R

    5 G) e1 j; Z$ c) p2 j导入MNIST数据集
    ' a2 h! w5 v! v  Q. R, e1 [
    - x9 _% i( c; a6 [) t9 y* ?. I; l  R# Loading the MNIST dataset in Keras, S! \' r3 \. C! u; O6 g( C& t/ r
    from tensorflow.keras.datasets import mnist
    ' b6 B/ m, E0 w: ]: W6 |& E6 p% y(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
    ! H& B9 k: X  C: L2 H1
    # f5 j5 D' X' P$ [2' _9 h2 H8 D: |5 @' o9 ~* j" S( I
    3# h8 H4 I# ?4 ?4 p/ y
    看一下训练集:& ?1 v; A( _4 K: W4 h

    & N7 i! v) u, m0 I8 F1 H" f3 ^1 }print(train_images.shape)
    . v8 j9 e4 ^7 H) u! |/ Xprint(train_labels.shape)2 d+ W; e& B1 N- {0 P5 k% C
    train_labels
    $ x& p/ n: r+ g% S1
    / w( V; |% R' E3 R1 r2
    : L6 U3 c( T* }( d* y3# j9 y2 D$ P( s
    输出:
    " p4 L2 M4 @. A* ?' E3 ~: u$ L: K' V. v
    (60000, 28, 28)
    ( V! @4 E. C' H6 m2 `0 [2 ~1 ](60000,)
    - c! `: ?6 H* _+ Q& k5 e) f  B! E
    , A$ B) v& Y- I4 z: zarray([5, 0, 4, ..., 5, 6, 8], dtype=uint8)% M! Y+ v% n; x: F4 T& k* t1 u, a4 I3 u
    19 Y8 d* ?/ X+ J0 c# @
    26 s* R* {# x; `9 B
    3
    : ]0 Y3 j3 M9 q4 K7 [! Z8 `$ M4
    7 K7 {4 V* c: k# n- R7 O这是测试集:
    * O8 h7 @0 g; ~; d: _1 b" l6 Y% M8 m4 @& E% D$ S) W$ h
    print(test_images.shape)" K, m9 D3 E  y7 n$ J+ A6 j5 I
    print(test_labels.shape)
    0 V2 C+ {. {. }- m* z- ]$ Atest_labels9 Y/ y$ r0 E6 }( u* J
    1  I7 D8 X: f! X9 j% M
    2: G- w, o. d8 u& j  k. H1 o& X
    3
    * y6 u& [% a  X+ x  J输出:
    ; l  u/ {* C" X9 V3 h) ~/ q2 ^3 k8 V) u  K  }
    (10000, 28, 28)8 G: v1 U& C, L. c: Q
    (10000,)
    7 s0 H4 x1 q; K% B, f2 C) x
    ; T4 v* O+ h0 N, g9 V: `; tarray([7, 2, 1, ..., 4, 5, 6], dtype=uint8)3 n) @$ v0 `; R9 j
    1
    9 Y1 }( m+ w6 @! K- |" t* @2" ?8 m; {, i: i! f5 z
    3
    % X$ \3 g4 c0 T1 X. c! V( p  |4
    2 ]% y. i' g( ]( l6 f. W$ ]网络构建4 ~. }7 ]. f$ [7 A* [

    ( N* L  B7 L' W4 |% M1 ]& y我们来构建一个用来学习 MNIST 集的神经网络:2 m" W  H+ w1 ~; U( f4 n# V5 e
    * N7 b" J1 W2 ^) K. Q
    from tensorflow.keras import models% {9 ?. |; |: L  R& d
    from tensorflow.keras import layers
    5 q- {; d& v; S$ U; q  z: Q8 R& \
    network = models.Sequential()0 m1 x6 f. W2 ]- c- i
    network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))# h2 T) e4 D9 G4 a
    network.add(layers.Dense(10, activation='softmax'))- B, F- j8 U8 ]+ q% w! b
    18 v- K9 L% _9 f, }9 Z
    25 k6 n: R2 x8 m7 l0 Q# l
    3! j' E) h( X* G, ]: D& M' F# C
    4
    ! ]. \6 ?1 f0 _% |" c5+ ^/ B$ _3 J! S
    6) ]8 S5 T; @, `) N
    神经网络是一个个「层」组成的。* G0 U4 O& @# O% `% N$ {$ N6 L
    一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。7 a! I/ [- g5 B! [4 O
    * e, e' ~% {% B5 l7 n
    这样一系列的「层」组合起来,像流水线一样对数据进行处理。% }# d* K: n4 C" X4 T
    层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。
    / F) a3 s* S! @
    : `- O$ |3 _0 f  n我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。8 c$ ^- V7 r1 N! z; D

    * G# g; V+ m. ^$ s# U数据到了最后一层(第二层),是一个 10路 的 softmax 层。
    9 B. q& g! A2 C! a这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。
    & h. h' Y: z! e8 ~0 x3 C事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!
    + T5 a6 d' n2 M- |  T/ G  R. b  F. g8 h' B
    编译$ Y3 x3 o) t0 }& D$ }! a$ ?
    9 G* F+ _  U; b  e  I1 ~$ i8 s: K/ B
    接下来,我们要 编译 这个网络,这个步骤需要给3个参数:3 E: v8 ~6 g# z1 M! G  P$ T7 Y9 y

    0 L) B  W% Q* O) }# K* q损失函数:评价你这网络表现的好不好的函数
    $ U  U+ Y0 n; S% q/ X. Z+ H' X6 P优化器:怎么更新(优化)你这个网络
    9 E) _( f# y" p4 Y  |* |3 E训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度
    & S$ _1 q# E! ?% jnetwork.compile(loss="categorical_crossentropy",# g! P$ s; p3 ~* h- T% H6 ^
                    optimizer='rmsprop',) B& u6 R8 K% u/ C! e9 T  e
                    metrics=['accuracy'])
    % c- A. @! @+ }# z6 Q. K1
    5 x. J6 p. e0 P5 i& s1 P+ r; s2
    . F$ E0 B( O! `! t- y1 \, K7 \/ X3+ q, V1 y$ T0 s( z- S) _/ A% z, _  R
    预处理" c" M5 ?9 B) b, M# {8 c4 v
    ! ^" f+ [; b4 F# D2 v% v
    图形处理7 k' j/ q( m: w/ i- }! A

    & }1 y" y1 U8 ^3 a  T我们还需要处理一下图形数据,把它变成我们的网络认识的样子。
    2 V% i0 U1 |6 [, p! V' S. ~- H  t  @& I5 c) w- r
    MNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。
    1 P; T; \7 [) @: i# A2 I而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。
    8 U* g* f/ J: h! Y; O2 Z6 U' e
    & z3 R, }6 ?. A$ Etrain_images = train_images.reshape((60000, 28 * 28))
    ' p8 k4 Y+ b2 ?& X5 Etrain_images = train_images.astype('float32') / 255  j$ Q0 J# M' X& f) E7 g( d

    $ J7 B4 C0 I  F: ]7 K3 n* Itest_images = test_images.reshape((10000, 28 * 28))0 u5 r  ^# S7 P$ r  P+ e
    test_images = test_images.astype('float32') / 255: `& _# y! m) H" X0 Z/ _) a/ I9 ]
    1$ z! S" S6 s- F5 j$ y- l
    2
    : Z/ S7 l; r7 i$ w! |3
    4 L- L$ s* |- T5 Z8 G4
    " K: _( v5 b) U1 _* Y3 w56 D3 c9 A( X, |* \' k& J9 k9 ~
    标签处理* @4 }1 M: M  I4 |
    9 j! g% S( L& B+ p/ }( a
    同样,标签也是需要处理一下的。
    % b4 }# {0 U* }2 C- N
    / T2 v2 C. d! s" @* [5 Mfrom tensorflow.keras.utils import to_categorical
    ) u) P; g8 t3 v+ f' C! v8 C8 l
    & p- v( Y5 ^6 R  C* G7 strain_labels = to_categorical(train_labels)
    % j" K) g8 j( i3 H8 t  A6 r, }test_labels = to_categorical(test_labels)
    ; B  ]: ]2 ?8 X4 y1
    / k. B8 ^# V- ~: t- Q27 @9 J1 s. _( Y% b0 J" Q
    3+ D( }0 [9 d: m9 q" ~1 k" j6 C
    4
    ) ~/ }* V% T$ f/ [- N训练网络
    + [/ ]- C4 k7 u& j) k- V2 J! d3 m+ ?
    network.fit(train_images, train_labels, epochs=5, batch_size=128)0 j  N) q, W2 O# e% s3 Y
    1  A, p; E! `: n2 x
    输出:
    + h: Y$ A; x4 C
    , |! _/ B9 S" l! I2 Y- V( KTrain on 60000 samples
    1 Q" |" K; d, e4 n% V$ p$ xEpoch 1/5
    1 b3 m0 C; n! I. R7 ^2 W: @60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254
    ' N% m5 P6 Y( S% I7 G2 m! a, aEpoch 2/55 v8 G9 x) l9 q' ?" |1 k
    60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693
    ! N3 Y  R0 g6 t7 O& rEpoch 3/55 N# i* i1 F  Y1 x0 b3 I& k
    60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800
    2 c9 R$ s- _- O- L( x2 i7 J% cEpoch 4/5
    # _2 o5 z- E9 a7 K3 S60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848! K7 X, T. U3 M$ e4 O
    Epoch 5/5% M  V6 x, ^* J1 ?4 v* p1 D
    60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888
      Y4 F* j4 w2 z& r5 u
    9 j; U" u" N5 H5 r2 n<tensorflow.python.keras.callbacks.History at 0x13a7892d0>. Y% ^& t. C) y, i
    1
      r4 i1 u- l9 i6 `' C' J2$ Y1 h4 u  S% R/ ?3 i% `: L$ m
    3) t0 b( |. b" m% O  [4 r/ ]" U5 G1 \
    4
    . q  W6 Q; h+ n& e5
    5 `1 U4 H. z' N6
    4 M- M1 C0 l! d" G' X( a9 {  H" a  _/ P7
    9 f# J* c7 C3 @# e0 ~* Q82 A1 g) H+ B/ U% |
    93 z! w" S  p* h6 `
    109 ?! P, Y! p9 [) N/ y5 Q. G
    115 E' `8 }6 ~( l2 W
    12! f: }5 l* N6 m+ b
    13
    6 H* v* \, k' I3 S, l; S可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。
    " T3 g, ~/ r0 L5 X% a6 W
    8 Y& l5 h8 F2 d" U  E1 \/ q再用测试集去试试:) s4 b8 j+ `* C

    / \8 w$ t) I, W! ]6 d+ r; ltest_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
      A; N3 [' ]4 ?2 X; eprint('test_acc:', test_acc)9 @, d" q. l5 ]; Y
    17 z6 k4 I+ Y$ ?' Q- S
    2
    , z7 Z7 D1 a$ s0 w% N输出:4 x/ d, M3 t- ~  o+ U; I

    9 P) J: H+ ]) t' P' h/ a10000/1 - 0s - loss: 0.0362 - accuracy: 0.97898 k: v" g/ W8 A6 W$ Q/ K( O
    test_acc: 0.9789
    " _, _# O! g7 a3 I" y1
    1 ~0 {1 r6 V# v4 L7 n4 a26 H$ b) L0 I  b/ Q5 ]4 Z0 b: H
    我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。
    , A9 a" j3 n! z- k3 y) v
    + T- P# K; B! w' E( L神经网络的数据表示% a" T" V0 N3 [0 O

    " L& S& h' V# ~5 Q" uTensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。
    0 f7 A2 V2 K, y4 A
    , ~8 |2 i- ~9 ^% k' U2 l: A4 M  M6 F我们常把「张量的维度」说成「轴」。
    ; ?7 K9 a( Z+ P* x: a5 J3 ]; l  K0 [2 w$ h* z' ]; _8 R) [5 Z
    认识张量
    ; E7 O9 [& i3 U2 {3 l( ^+ H! h' v; O8 o8 |8 j& R
    标量 (0D Tensors)0 R4 P0 U  F0 F

    ' e' F/ o5 l* zScalars,标量是 0 维的张量(0个轴),包含一个数。( t# N+ t, _: Q5 t4 O

    : Z0 ]9 w# H3 Y* Y. z& o标量在 numpy 中可以用 float32 或 float64 表示。  h- n0 A  K+ n$ x5 I

    & P" _- U) d8 f8 a! ~* K8 ]import numpy as np
    ' _  {1 n5 C5 F8 y. ?  s* t
    " x+ a, Z- Y$ N8 q2 ax = np.array(12). _7 u7 W& c- t0 B* P% @0 n
    x& n7 j. g  q  z5 t& a
    10 k. H. M4 y: e. l5 O
    2
    - p7 ~; i' X; N9 k7 d5 M% D+ H3
    ( ~# |9 S( s8 ~  h! J# @6 u4: D6 h% t3 X4 V3 a9 D& }9 R
    输出:) ], p7 w# z; S5 i
    ' m* n6 P5 r3 p% @
    array(12)
    . V2 }$ M+ u) o) k8 T1( l# {6 k4 k1 S; z
    x.ndim    # 轴数(维数)
    - G/ _* l% T! g" u! M9 D; x17 N/ S9 y, D) s
    输出:& A6 d, O" D! X1 j8 E* W

    % r3 j: d9 h4 a1
    1 x% H8 s2 K/ G* p' H& `- f10 w" `  {# i8 u2 W& j
    向量 (1D Tensors)2 l9 O; x% d% L- l

    & D* \9 Q) U9 \: X& y' t7 D  yVectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。
    % o, E, k4 s0 m* W* u  ^! f* J3 [( Q5 w* k' ^' X; }
    x = np.array([1, 2, 3, 4, 5])& o+ Y. I' p0 K- X/ X) k
    x: u& l& A# W6 ~$ X! h5 J
    1
    " A: u1 p4 y% h4 @2
    / o" v$ c7 X6 b输出:
    8 c2 |8 v& q- T
    6 K+ G- Y, Y- `; B8 f, c  s) Carray([1, 2, 3, 4, 5])
    + ^3 R2 }4 j( @1
    ; T3 V$ u# H' vx.ndim; m1 H5 C( H1 h# A
    1" R6 G1 g2 s: @- o+ w& ^
    输出:
    1 \7 l( }3 ~# W% y1 ^0 G% l
    1 W5 I" x9 y8 A6 G1
    - X& {6 a# q: L# Y* Q4 p1: |  e1 z2 G- D
    我们把这样有5个元素的向量叫做“5维向量”。
    9 v( q$ ?' {4 }( u* y5 k+ P但注意5D向量可不是5D张量!. H; }- t- U5 \' q$ T

    8 S. h. O+ s! R/ S7 t5 b5D向量:只有1个轴,在这个轴上有5个维度。
    - a5 k- h3 x: F# O1 N2 a. E' n' F5D张量:有5个轴,在每个轴上可以有任意维度。
    ! Z" E2 O* P9 T9 |, h: C& b0 d这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。0 b2 y1 x/ j- T% Q
    # h1 A9 G5 r  J
    所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。
    2 {( v/ Y; l0 {; k6 G6 I2 r# O. V
    5 A' g4 Y: G* \1 K6 w矩阵 (2D Tensors)
    ( h4 Z- V  @) g7 r
    5 {/ H# r! c+ \: ~: aMatrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。6 h8 ]" N/ h, ^5 X) H5 v% W

    / u1 t4 ^; R7 Cx = np.array([[5, 78, 2, 34, 0],
    4 B$ J  |8 C" F) x6 b3 O/ v' F              [6, 79, 3, 35, 1],% x& c9 C/ ^" Q0 Q8 I% x7 v4 k
                  [7, 80, 4, 36, 2]])
    ; L* X! b2 o* V: s7 sx
      u, N( R) a* j9 r% J1
    5 v* C  Y: D! t4 k1 `2' J2 U  ]  ]* V# Z  d/ C3 H
    3
    2 h3 A: G1 j* l' m- A4' K8 z# _; E& K& |' m
    输出:) x. m  N' [. R% K+ ]8 V* a  N
    0 Y9 p* r5 v6 l* \( O& r, @
    array([[ 5, 78,  2, 34,  0],2 V6 x- W7 w) M( K6 G, A0 ?
           [ 6, 79,  3, 35,  1],
    4 U- ^: D) K4 c       [ 7, 80,  4, 36,  2]])# a1 j6 J! p5 f4 ?9 R7 h+ O$ }" ]
    1
    % D' L3 H( I( I; K/ L3 Z27 H# P8 i. I) y  y) j1 _# Y
    3% r8 X% \+ T5 p) |+ ]+ l
    x.ndim  h* p) _1 ~( ~
    1. d! g6 e% r1 y& H
    输出:
    ' O4 T( j5 g4 @9 E' a& v7 w( u* h
    2
    7 d$ u+ U1 b3 Z$ A% o& z1
    ( Y) U( z0 t2 P0 w6 B# m高阶张量, k) p, @) \) E- |( d
    $ Y8 M" V* B2 ~) }& k1 K6 E: c5 q! G
    你搞个装矩阵的 array 就得到了3阶张量。
    0 y0 T: V& V& g0 T) {' |/ y1 e6 K1 b3 G3 i! G
    再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。7 C* e4 B" l$ F# e$ z
    ' E3 F# t. V6 [6 l
    x = np.array([[[5, 78, 2, 34, 0],
    . n: W" {4 O. v  d3 ?! ~. W               [6, 79, 3, 35, 1],
    ! Y  |" T. _/ f/ {5 v9 v1 u               [7, 80, 4, 36, 2]],& ~% v  m' o  d. N1 s  T$ u  i0 d
                  [[5, 78, 2, 34, 0],5 o" M5 [+ _% Q: _, F% z* ^
                   [6, 79, 3, 35, 1],
    ' U6 u$ C2 c* ]9 W) P               [7, 80, 4, 36, 2]],$ w; T* T4 I9 Z) G
                  [[5, 78, 2, 34, 0],
    7 x2 G! C; L; c7 a6 {               [6, 79, 3, 35, 1],
    ( {0 l* v/ ^$ {* U3 o8 i               [7, 80, 4, 36, 2]]])
    % A' h- Q% \" fx.ndim
    5 J' F% G$ f6 c: M/ r' I7 m# e1
    1 _0 A. O# K8 [0 }$ d2
    ; [( Z8 k) Q, M" R  |3
    % [  O9 u# @( s4
    4 ?3 |7 M# I/ f6 e5
    " s: Y4 D3 Z4 r  u" S% E6
    6 M6 m4 @* G0 a8 m7
    ; i% h/ G' U! d; o+ R  B8; M, j/ S) m5 J9 u
    9
    , w; b% |; J, {+ Y. L8 d( s10# g- U. j& i0 r" H
    输出:
    0 x2 _! t3 p' D. W4 ?! y7 R
    0 V3 }+ ^8 y2 n# {: _% k3 R( I0 M5 U3! M. Y- ?% ?, z
    17 R- L" g* v7 E. g: S
    深度学习里,我们一般就用0~4阶的张量。* T7 Q9 w8 T2 o5 L0 @& l" c6 }

    5 _0 S3 w. C. f) r* m" G8 G张量的三要素/ a) Z5 t, e- g' b5 [% A& U4 Y

    2 a1 S" @- }5 x; `阶数(轴的个数):3,5,…
    ' p4 ]  c- t& W7 [6 ^形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…
    8 u3 W3 a% I' i6 Z/ N7 W5 b数据类型:float32,uint8,…
    6 D- m$ }, ~- y; {& e2 N我们来看看 MNIST 里的张量数据:
    + R: M# q' J! c4 I) C" }8 `) D$ F3 B, S( R3 p$ V
    from tensorflow.keras.datasets import mnist7 v$ E4 f9 P; s6 [  F% [% s
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data(). q# @) ?  r1 }4 z' M( u
    9 a. N) ]9 H& B+ Q: [. @1 `3 w
    print(train_images.ndim)/ h5 H9 K* O  A. i
    print(train_images.shape): s9 O* X( |# ?$ }/ Y
    print(train_images.dtype)
    1 u0 |; O( u) T) o7 _+ R1+ I2 ^# `* x" k; C* v
    2! c- T# I3 I/ q7 p, ^) H
    35 N, M5 b- S, B) S# s$ p
    4: S! F1 F5 F" Z6 F
    5
    / p2 i& v" x4 o% t' p6! W2 q% E2 h1 _7 \: M* p* H& @
    输出:) u  s0 b( v* I6 W2 r6 T* j
    : Z- e  o) F9 W) N
    3
    $ M8 g3 O' P# J, }6 t(60000, 28, 28)1 F- P* {5 k% z8 B0 m
    uint8( Q8 Q3 b( x, J% ^( b! M- e& C: U
    1* k; x$ w9 A  _9 j" `
    2
    1 y3 ]0 h/ b3 I" ]1 z3
    6 ?0 \" d  Z0 v( ^( q- g2 h) x- s, ~所以 train_images 是个8位无符号整数的3阶张量。
    ! S; d; B* ]) c. x& x5 C/ U, l# ?3 V8 S. N3 f8 L7 C
    打印个里面的图片看看:- d* v- f) o9 a* d0 P

    " e  Z$ k: ~/ C1 o/ pdigit = train_images[0]2 }0 ]) `* f, _$ o3 Q" x
    2 r! U2 P. F) ]$ b
    import matplotlib.pyplot as plt" G8 d& B& n. Q( c/ Z9 c! s

    & W7 U+ j9 o. e+ e5 _4 jprint("image:")
    1 L  ^9 y2 @% z& |% V$ B% fplt.imshow(digit, cmap=plt.cm.binary)
    ' h8 k) e+ O" @/ Qplt.show()
    3 Q  f! v: y6 b3 Y- x# |2 K  H2 _print("label: ", train_labels[0])- I* B/ e$ _* u6 N% F& n
    1
    , g; H0 A8 d: J  n" ?2, z+ t+ B; S3 |7 X
    3
    . [6 L- E/ s  ^. G4
    9 h, c. O& d! b7 `; i# s5) `# c1 Z7 p& v* j1 R5 v
    6; R9 N) Y) C2 b9 |8 ~, r- e
    7. l; _" }6 n0 q6 [5 F7 ~4 l5 b
    8& e' V0 L- @" I( F
    输出:
    , V% L+ F. O! e# L* f5 ~
    - @. s8 ~5 M+ ]* Q2 N, s 1.jpg 2 C+ S$ C! ^; ]- n* Q% R6 p  [  t

    0 n3 p5 E% i! Z* ^2 dlabel:  5, Q. o0 L& ^5 z- F& M
    1
    ) o& r( @6 S3 ]Numpy张量操作
    2 t4 U- d& U& _+ W- N' S; P9 Z# X
    . B+ u! ?% ?! P+ t张量切片:. U/ R1 m$ @7 j0 C1 x
    " T8 b! G- Q. C; `/ c
    my_slice = train_images[10:100]2 p1 _6 P: V/ z6 r
    print(my_slice.shape)7 T0 p1 q! r/ I2 o$ P
    1
    1 p$ }: i8 O6 @9 z22 c4 j$ b- e6 T+ m
    输出:) a/ l+ x: K" G# f: ?% y: ]5 i* |
    2.jpg
    ) [5 w6 D1 k' E/ W" U3 Y- ~' x% Y(90, 28, 28): w. m9 M8 v8 i1 V7 ]: M
    1
    ) `( C: g( P0 }等价于:
    $ Z" l0 r. n; n/ I7 P: J. u
    0 t5 u3 s# G" d) A0 L/ r& f; Imy_slice = train_images[10:100, :, :]
    5 Y" j. X( I  g* D6 @* Bprint(my_slice.shape)
    . Y& ^% J  d: a* L" m  C9 v19 H, Q, N  x. ?7 ]7 v. Q5 C' X
    2
    * v; u2 x6 p: D5 d9 ], y输出:" B1 v/ Z. W. d8 Y* ^% W2 @3 u
    3.jpg
    6 T1 ?: g4 c( w(90, 28, 28)3 c2 w* _4 I5 k5 N3 K2 ^
    1
    1 r/ e* ~% f% x/ A也等价于# K* N( K* i8 Y

    : s& u/ ^- \* o  k' P% I& kmy_slice = train_images[10:100, 0:28, 0:28]8 ~0 _! M- X+ C/ S. ~
    print(my_slice.shape)/ k, z. m! J& M/ V' s) |9 X+ |
    1$ l# w* N, p: M5 ?4 c
    2
    0 l- T; q# E+ F/ }% f; z输出:
    5 ?5 ?# a  V" q8 D' @  Z, u) `
    6 O& d' u7 y7 f2 y+ s* h  S/ U(90, 28, 28)
    " g3 V/ B$ d5 r9 O/ N$ f1" B% Q/ T5 y5 w
    选出 右下角 14x14 的:
    6 e. S: ~' M- V2 L0 |& y7 M6 \- z6 t- u: w  `5 {5 `9 [& h
    my_slice = train_images[:, 14:, 14:]0 }* d) q, I+ @
    plt.imshow(my_slice[0], cmap=plt.cm.binary)
    $ k& \; N6 y8 y, U5 jplt.show()& Z+ w# Z/ I$ ^' U7 ?4 X
    1
    1 |  R( S8 C. h( ~0 [2
    - v3 a/ ^& A. O0 e3
    6 a9 x$ K( {# [/ O输出:
    " x+ K+ w: T. l! l
    2 ]6 `7 Y! w" d5 a, h5 j- X) C
    / r$ f2 g4 D. g: I$ d1 `  C) e: R0 |- A
    选出 中心处 14x14 的:) g: @. M3 l0 T5 l) @, \

    ( j7 ^& e  e4 f% |  A& G; @- d$ Lmy_slice = train_images[:, 7:-7, 7:-7]
    ( Y0 _. w: j* I" {; H& Qplt.imshow(my_slice[0], cmap=plt.cm.binary)& L. C" i0 X, O
    plt.show()2 {$ K; ^( l2 j. n, g" D0 F2 C
    1
    2 f* p0 U  N  S( p7 }( ?$ Y25 E2 {3 t( [% H2 H7 E8 Y* k
    3
    * V1 f2 K6 p  E. U输出:
    ; A, O% i( T% N5 k+ u
    1 p3 o* D$ K" j, u! x" u- X* E4 T# g6 a0 A

    # N1 Y! l8 s  o3 V& d/ x数据批量- {2 N" h9 s6 Z0 v7 P3 m# S

    1 K  Q2 Q. T0 ^; Y9 H深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。
    4 m; ^4 x/ I$ ?
    ( ]/ ~+ c$ a2 ]3 f, n/ L2 x3 k& n深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。1 `7 D3 b5 Y1 a
    * \- W/ g2 p) D0 o8 C2 S
    在 MNIST 中,我们的一个批量是 128 个数据:
    $ ?6 ^. V0 n2 D2 I5 ^/ F# Q7 k  A) \" F9 L3 [
    # 第一批
    + ^5 A* u, \% |1 p2 _/ Sbatch = train_images[:128]* ?0 Y1 V3 G- b6 c
    # 第二批, {8 V# c# D" k- u; d6 {/ p
    batch = train_images[128:256]
    % t5 a5 y8 D  h! A0 T& C1 g2 o& t! i# 第n批! Z8 ^8 j/ U. x* t: ]
    n = 12( M, C  ~2 t$ E! n. V, P; q
    batch = train_images[128 * n : 128 * (n+1)]
    0 E# m+ R" O$ e+ Y11 ~5 Y/ @8 F: M8 D
    2
    $ J4 O1 V. d( w% {3# f. v5 y$ r/ O6 }
    4
      V# Z9 @. J* Q# M: m4 U0 C/ D3 H3 e5
    $ X& B) F, ^, @' V6/ v# f/ m, C& d  r8 e' I  }: o0 m
    7/ m3 x, ]. _4 V% y* _& L+ R, R
    所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。
    5 E' ?5 ~, g5 Q; D) \3 d
    - E  K  c# L6 p3 }+ i9 v  A常见数据张量表示
    ; S; {: C9 Y' I5 V5 s
    ; b3 s2 R, ~2 \: Y8 N2 f数据
    9 K2 j2 v8 R4 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, 2026-4-20 18:03 , Processed in 0.410078 second(s), 58 queries .

    回顶部