QQ登录

只需要一步,快速开始

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

    $ }3 |3 N) t# fPython深度学习之初窥神经网络
    - K3 X! G6 Q4 T2 L) H本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。; M! U% z" r& z1 u0 t) o! r

    # u. T# S3 X+ E  C8 ?5 k+ e+ m( n3 ~! j本文目录:- Y# Y. p- G# g
    5 H; U7 P0 Z* E( g' q, X5 k. X
    文章目录0 m9 l2 Y9 Z. S2 |

    7 r7 H9 t3 s( l) i  ~Deep Learning with Python
    6 Y: t7 E. W# }" v1 w初窥神经网络4 u. W' M! X& l
    导入MNIST数据集
    " V: H! f& T( i0 e) ]! u3 F5 B网络构建
    + K2 q+ P$ o3 H- i" `编译
    ( g* W) C6 W0 }, o' v6 B预处理8 L4 ~/ K& G+ F  w/ `" Y
    图形处理3 ^, U% Q$ C; i( ]6 m
    标签处理
    7 O3 P6 R8 |8 K: q$ x% O9 ]8 t训练网络- p5 o) Y6 U' Y: F2 \
    神经网络的数据表示" v5 d& g( m! D$ s, H
    认识张量6 M* S8 J) ~* I
    标量 (0D Tensors)+ x& V7 a3 G0 r) @
    向量 (1D Tensors)
    " v" ^! n4 q, Q矩阵 (2D Tensors)/ X. e1 g, z/ f5 C% I  P
    高阶张量5 ?2 h% T1 Y9 T. t( K& @  x
    张量的三要素
    . U! Q4 R3 j+ C1 {2 r: X  wNumpy张量操作5 c/ Q0 N2 k9 M: A+ i! L1 R
    张量切片:( Q4 m8 r/ v; j7 x% t
    数据批量
    5 _: K2 J! L5 T% G" g常见数据张量表示7 g! H% k! o) X! Z
    神经网络的“齿轮”: 张量运算
    / ^* @* ^0 i' y+ w- b逐元素操作(Element-wise)( t2 D" a- p, m3 M/ e
    广播(Broadcasting)
    $ e1 a. i0 l& w, R, \张量点积(dot)9 ]* S( _( \: S
    张量变形(reshaping)
    ; w' d. ^/ W0 i& F! G5 a8 R, b神经网络的“引擎”: 基于梯度的优化( v5 S, i" d, E2 P% \: G
    导数(derivative)
    7 @  }+ v; |2 G3 n7 U9 I+ M4 V0 d梯度(gradient)+ H; k4 I0 G5 }3 A
    随机梯度下降(Stochastic gradient descent)- i  a4 h! W+ o2 G. I& K
    反向传播算法:链式求导
    . w( Y) z8 D1 J% p, M& f本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。
    9 n4 A  C; g+ |7 H$ \$ x# c8 D( u) F! z3 h& c
    初窥神经网络& c% B: L, D- C' ~' K8 T
    3 G- F+ q+ D5 U
    学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。$ p; H' I+ n3 Y# j" t. `
    2 F; x- t0 L) E6 c& x- s5 q
    MNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。; Y7 v+ P( t- ]# S, i- \3 Z
    9 k. x: v. L9 O6 [0 d
    导入MNIST数据集: p8 W) E5 q& d6 x4 t. W  T

    4 h$ H% G) z9 b1 e. z# Loading the MNIST dataset in Keras4 O$ o% s( x/ I! }, ?7 j
    from tensorflow.keras.datasets import mnist
    . q" S: _# C: ?8 f0 Z% }(train_images, train_labels), (test_images, test_labels) = mnist.load_data()7 ~( q& w( e- t8 \' E
    1
    , y  o+ S9 o3 i& x7 h8 T" ~! L9 p2. s! m! `$ _+ e. c
    3
    0 u4 N; E# |) j: r- K  j, M$ w5 M看一下训练集:  z8 P2 I  d1 ^# I% ?
    , B0 i' T1 v7 a9 `1 d3 V# I
    print(train_images.shape)0 }2 C; \. b, N( d, j' s3 n& s  ?5 F
    print(train_labels.shape)8 L& ?+ b5 `  K. E9 w9 T
    train_labels: V* l$ B) ]! n6 L% R
    1
    $ V2 }$ y" u" G7 t2 K! }, ?25 Z- X6 `2 d- d, P4 c- m/ C
    3% n/ B% T& _, T: _4 ?
    输出:. F. K6 x4 x7 k2 M

    ) _3 c$ L! Y) Q% Z7 O( L" `, u(60000, 28, 28)* }6 ?1 d9 Z# F: i9 p% p# o5 }
    (60000,)
    7 @2 e: g4 Z7 X: C  W
    3 d6 d- J3 l& T8 Z6 W+ warray([5, 0, 4, ..., 5, 6, 8], dtype=uint8)( I5 }1 t0 J. t! s( l$ w# k. V
    1
    " X" b( H8 F$ I# d1 ?2
    ; b( F3 _9 p  Z) ?+ }3  U3 s( t# D) R3 n' ?
    4, \9 n8 l- V; ~8 ]
    这是测试集:7 B; G: h! M8 [5 _
    9 {2 T& \3 c. c  X5 h
    print(test_images.shape)8 f: V3 }' b& s3 P0 H2 v# N  u8 c
    print(test_labels.shape)
    6 X. v- o, E! y4 x* {, [" Ctest_labels0 c; ?3 K( a0 I: n1 K* L& N' a. f
    1) T( z0 _2 H/ _" B* W6 C
    21 }9 V8 b$ [. C  ?
    36 _. o  Z3 A" y
    输出:2 z: c! \3 @; p, C+ p, r6 l, p$ A
      L# x% ~- L, U. R
    (10000, 28, 28). f1 {7 r* w& o% R* G. l: W
    (10000,)4 z5 d1 q+ G. i) |

    8 `3 U1 z1 [- m% G1 t8 Sarray([7, 2, 1, ..., 4, 5, 6], dtype=uint8)& i4 ]+ R, C+ J! b% }( w
    1
    6 r  C7 R# s- A0 p/ Z2
    4 z8 z$ |) |8 ^. C3, O1 T7 N, Y/ A9 c/ D
    4
    2 l8 A, i) K9 _) I网络构建6 Y) @( s' N% m4 J6 {: ]" X) T
    ( A" y1 n$ x- R
    我们来构建一个用来学习 MNIST 集的神经网络:
      y( f% o$ C# o) }9 p9 Y  n- e) ]) W4 ]* R2 {7 `
    from tensorflow.keras import models
    1 p: I& M" h. x' J  _1 v) [% }, D2 [/ Dfrom tensorflow.keras import layers
      }1 m$ s( K- T. f9 w5 |3 Y& q1 ?% ?% B% G5 v
    network = models.Sequential()
    # c6 {, r4 _% s' k2 @network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))
    ! |! b. h3 I8 S! Znetwork.add(layers.Dense(10, activation='softmax'))
    7 D' q* M7 t3 K. P1  [1 V( [, E( O7 B) M# y$ T0 X8 K
    2
    0 w4 u. m: B5 }6 z7 {; {" v! m3
    . ^+ R5 b8 k1 `7 F4
    , D. p/ v% H6 Z5
    ! d( Z% y5 P6 K6
    3 V4 e5 ]- F! D2 G神经网络是一个个「层」组成的。
    0 u9 m, I3 ?8 p) Y# t9 N一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。' X; v7 t  S0 P3 N0 k1 _

    " ?! P  m0 b- X1 u8 O这样一系列的「层」组合起来,像流水线一样对数据进行处理。. ]1 q9 `7 W' c% n
    层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。! R$ H+ H; w" p
    / [% s8 f& g2 d2 c, N  T2 g
    我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。
    5 a8 q/ ]* |* E! |8 e2 g6 v* C$ k) N: a0 q0 E3 P* b  ?/ B2 z
    数据到了最后一层(第二层),是一个 10路 的 softmax 层。
    $ h/ Q3 t1 w/ o这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。2 V0 X  S: P9 [( a2 i" h
    事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!
    9 ~. k" A9 u$ G# S% h/ R
    ) u* e! C( G: o; Y编译4 n! Y0 k4 {* D" q, Z  O
    + ]9 v1 f3 Y/ C$ U9 T& x" ?- L
    接下来,我们要 编译 这个网络,这个步骤需要给3个参数:+ D# j5 V' M( j* S
    : f1 `/ _$ D' y3 c9 c- e
    损失函数:评价你这网络表现的好不好的函数
    * d0 L# d3 m3 Q# i3 R" L% l优化器:怎么更新(优化)你这个网络
    ! A6 i$ ^& @0 y" t- f训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度
    % ]$ d) S2 f1 {) M  [% G' ~network.compile(loss="categorical_crossentropy",4 @5 n: M+ D$ E$ ^, [0 w
                    optimizer='rmsprop',  C5 K$ e- y' L
                    metrics=['accuracy'])
    " m1 p/ r" C& k7 V. }; W9 P* \1. T. y2 U. \" L/ t
    2) W# P3 a( u8 C7 x% A" `2 n- }6 X
    3
    / f: Z& J: l" Q+ W预处理
    , N8 X5 G) L  Q- F$ R( D
    7 {& D& G* Q) R; |6 j! W图形处理; O' Y+ @0 W3 G3 d5 _+ {

    % Z7 U# C: R: u7 E$ U我们还需要处理一下图形数据,把它变成我们的网络认识的样子。! ?& Y7 l& M0 e7 G: ?0 q4 [! c' w
    % {. O, q* ]( S( j. m" [+ x
    MNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。
    , ?$ ^3 Y$ `. a; i而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。
    # h* S- \" _! ~. q" w4 B
    ) ]. M2 i; C( }5 etrain_images = train_images.reshape((60000, 28 * 28))
    6 r8 {. [3 A4 H% d0 Z$ M5 O3 C4 l' {train_images = train_images.astype('float32') / 255! j, F) h$ U& C  E, i

    0 ^2 u5 _2 }9 T; D* ptest_images = test_images.reshape((10000, 28 * 28))
    8 W' d% ?' K! E( @# Stest_images = test_images.astype('float32') / 255
    6 ^# t. C( N' ^7 e* {19 u. ~1 k: i9 ^8 y. Q  ?: d
    2
      H1 ?6 o9 L- S+ P35 |, q9 ~8 C. c5 r- X& t6 @1 R. y
    4
    * d9 c' @2 q3 \7 C- B5. B- M) K5 I) E6 T
    标签处理) V' j1 Y) T! i7 \

    & s) y% h1 X9 U5 h同样,标签也是需要处理一下的。
    " D" u( R/ I9 @/ r% K3 r1 E9 i, l" E+ v
    from tensorflow.keras.utils import to_categorical6 ?3 e, n1 p" i# D/ r. b

    ( {- X- k. W- [; ptrain_labels = to_categorical(train_labels)3 A: b2 ~! Q6 z& o) n
    test_labels = to_categorical(test_labels)( h- O  y% f% ]8 `% d; `
    1
    ' v& l* j" J, q: Y; }1 r* x29 ^; `# [1 z$ ], y
    3
    ; j) V5 `6 H, b) N: ^8 d( {5 P4& x- F0 ^( \- {
    训练网络
    7 e( U5 a) s/ s) V" H% r1 e: n5 s
    network.fit(train_images, train_labels, epochs=5, batch_size=128)7 z# [) ^6 }+ t( F1 H$ o& O
    1
    1 _. q; k7 f8 l1 d) Q4 e/ l  ^8 A输出:
    0 m" ?* O4 u, @6 \
      z! j/ K$ {/ F3 C, {$ YTrain on 60000 samples! ^' M$ y8 O1 A0 p+ o+ p# P" h
    Epoch 1/54 ]9 {% y7 C# M* s9 n* W
    60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254) I8 a1 ?2 Q, \* S/ S
    Epoch 2/55 @9 C  B3 I8 J+ Q" O$ Y! o6 m
    60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693& s! u9 n$ i/ n, r
    Epoch 3/5) ^9 i' x' o7 j8 J8 b9 B
    60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800
    6 A2 R1 @, y0 B% K4 H- zEpoch 4/5
    ' ?+ c7 f# p8 ^9 b' l! V60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848
    $ G: {  A) P( t$ D' Q" {2 fEpoch 5/5
    1 N9 ?7 z$ H* D* T$ e60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888
    ; M" \9 t7 z; T# j2 s8 F7 ]3 }8 n, |, {: F% L+ X. G& p
    <tensorflow.python.keras.callbacks.History at 0x13a7892d0>7 ~$ K  ?" {1 T# ^. k9 {
    1
    * e/ c) t+ g) b/ |4 A. `. ?2
    ' J- Y6 j0 H" B9 S3 V3$ ~$ Y  j% k" {% V' c/ f
    48 N+ F8 [" B- N8 Q" }
    5' S6 Q; l0 A) {" |
    6
      ]- k# i3 B1 w2 c( D# I6 K75 T% \4 z  e5 t3 p
    8
    # p( t  r4 \4 A# E4 ]2 e90 f$ I% _& B2 r( U3 ]
    10
    : Q" @8 i3 x  w1 _* M115 C( L9 c# K6 T9 o! a" I; x
    12
    4 [( J4 y3 o7 V6 [! U1 Y( n13
    9 `! L! g, y% `- ~可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。
    / I7 m1 p! S$ O2 z2 c
    0 {% f- j+ z" x3 S再用测试集去试试:6 Z+ P( P" b0 M% v; p  Q$ C

    + Y& w" o+ R9 I, d! f; ~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
    , V; f, x8 I. _% V' t$ C# t. ~print('test_acc:', test_acc)1 j8 n6 S" L; l% Y6 y
    10 W! y4 B  r( p: m' I
    2, d, M- {: N& `$ \7 k
    输出:
    ; l  S! f6 H: T; ]6 B0 |% ?6 y7 V4 d& M
    10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789
    3 d% y6 R5 o% k3 Vtest_acc: 0.9789
    6 R: m; a2 B4 }' ~6 L0 S1 v) T1! ^: _2 a' T  j
    2- u( `5 L2 x9 i8 q2 n( `# P2 D( ^
    我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。) Z! @& v# @$ a( W
    , {# w6 I$ G+ y8 f
    神经网络的数据表示
    . f( r$ l; d) V5 k5 m% l8 B
    0 ]( r9 L5 r# UTensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。) K6 f$ ]4 q; u# b+ b3 B
    3 n; D7 I7 X6 }3 e# Z9 m5 Z4 i5 w& k
    我们常把「张量的维度」说成「轴」。2 i# S' ~& W, n( R4 b6 f9 J0 r+ G

    4 @0 V9 N" I" V. V$ g4 K认识张量) e1 g1 z7 L2 J8 [

    " [; u* `, e) D3 V: I# @  k标量 (0D Tensors)
    $ s& M1 s( X, B- u8 I% ?5 U3 k  C* ]; ?9 ]0 G  D7 r9 L7 W
    Scalars,标量是 0 维的张量(0个轴),包含一个数。
    ; }8 H* c2 o2 U3 R6 s* x6 I* F1 Q3 B! g7 M& X
    标量在 numpy 中可以用 float32 或 float64 表示。& ~8 t; E  t" W" }  \- s
    2 T, Y& i3 {4 F& h, v' o% w
    import numpy as np; c' ^+ C# J5 A
    ; p" l5 T4 n/ T8 Y
    x = np.array(12): u+ p2 z% e2 @
    x
    $ ?- x! }& x8 h8 t" F- o4 Z% j1# a, ^) v1 U5 C/ r
    27 t8 K- @* z' P5 d5 r- P) M# l0 I7 H* m
    3: f5 P& C, n' m, q
    4
    & U% J7 e0 b8 Q输出:- g' l; A8 k: `8 z* p
    & ]. z" ?- e7 {6 N6 Z" C
    array(12). ]& e% C4 o' s# X0 U
    1
    8 G6 y; D" S$ h: s: Y( jx.ndim    # 轴数(维数)( e* S  Q! m& S# \
    1
    ! t+ V" [9 Q$ N8 h5 o! e& U输出:
    # U5 Q5 O; `( D1 k4 R7 P  h: n& u4 ~/ Q
    1
    : e- R  Q) G+ c; J" K: E+ A1 r5 q0 J4 w12 D4 G; T. l, L- @8 K  Y% R: O
    向量 (1D Tensors)2 V3 [$ ^* i, c' e) ^; _9 Q1 i
    6 U& I/ m5 ~5 X/ B' d. S- h
    Vectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。
    : A' L6 U4 K+ o6 l' _% |4 Q  z* |! I8 t9 l: n
    x = np.array([1, 2, 3, 4, 5])% X! v0 @* y- _! Y2 g6 d) b$ M
    x
    8 {3 K% \/ n7 A- _1, z2 U; N1 s/ S, f: e( y) G
    2, n" I+ P' q2 P0 f, W* Y
    输出:; R/ @: G$ ^; C# R+ y6 o

    # T9 n3 y" @' u, e5 B! p, n7 N. b- Qarray([1, 2, 3, 4, 5])/ z: ]) D" y) ^7 O- o3 Q
    1, z7 I2 S7 v6 k/ C% R2 }" T/ H( ~
    x.ndim* D$ I" H! y9 x, E. e2 q9 Y
    1
    6 Y* D, F# O( m输出:# v- m0 Y+ _+ k7 d, \, j# v

    + S" q: f; j! O. p" ~1 B; W+ y1
    - O$ Z/ X0 h2 {+ j" m1
    3 B+ v- D  O9 q5 N! d! J我们把这样有5个元素的向量叫做“5维向量”。" n/ l& t% H" s/ t4 ?3 E) }# N
    但注意5D向量可不是5D张量!$ {: T! u- g0 H
    # }/ q$ u& @6 k+ Q* m- q
    5D向量:只有1个轴,在这个轴上有5个维度。5 }$ d2 g  C0 X: `+ j+ l% [+ H& O) S7 j
    5D张量:有5个轴,在每个轴上可以有任意维度。5 i+ f4 N. X' v: Q9 ?! R$ l
    这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。( j8 g1 M2 w! e( K1 A! ~& P$ ?
    ; F6 G( a1 f% V  {
    所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。
    # \: N* f" k: c5 O7 e* m
    0 p8 X, r1 h- F: Z1 K- q9 J5 g- n矩阵 (2D Tensors)- g- S1 V% P! Z* [$ F/ @. s

    ' t1 X0 J: E; WMatrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。
    4 X% F! }% y( O( w! ]$ L( i8 x
    ' j- {; I$ Q! ^0 d) Bx = np.array([[5, 78, 2, 34, 0],' b3 w( d0 _- l, W
                  [6, 79, 3, 35, 1],% l& ]( X: M& i& a( @
                  [7, 80, 4, 36, 2]])- P. v7 Z" W, o- H0 r
    x
    ( ?6 {4 [3 Y4 V6 o- {' v1
    ; V( w% m2 D2 z8 e2
    7 B) o4 N4 L7 ]7 s8 U0 A& A! E+ |3- u; l) y8 @3 A
    4
    8 Q7 W3 g6 K5 r& `! {  A" Y* q0 p输出:- e1 @. ^, z( |0 k+ i

    + o# x. C7 k, T* J* z3 x. _array([[ 5, 78,  2, 34,  0],
    9 ^5 w" B, m1 A       [ 6, 79,  3, 35,  1],
    9 M. ~: G; k0 Q9 W, r& o       [ 7, 80,  4, 36,  2]])
    + d! s) T  H( S( s) o' q1
    . ]' r3 J+ U3 D  W2 A2+ u- k9 g* i8 [5 k; ]( f5 ^
    3
    * j8 d- S; q4 p5 jx.ndim
    " d2 |$ W/ _/ {3 j+ X0 ?7 X1; s( u: V% a2 B! P1 e8 w% R
    输出:
    0 ]: x9 N3 x6 N- Y! M5 s" ~6 T* F* R6 a# d- I1 {$ A
    2* k4 B' D. o5 Q: a! U$ }4 R3 s
    1+ D- z& D# P% U% k8 F) N
    高阶张量
    5 ~% p# ~$ i+ X* |8 ~& w
    7 r9 J% {/ T. J: \( n& c$ p' O  t' u你搞个装矩阵的 array 就得到了3阶张量。
    % ^/ {# S0 E* b5 L( q( h8 D
    2 P; a2 P3 C/ H再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。
    8 S2 b6 [: x* W  f% Y) N0 ?. s+ ~% j
    x = np.array([[[5, 78, 2, 34, 0],
    4 [4 q6 t* z4 \6 k, a& P! ]0 G) ]               [6, 79, 3, 35, 1],
    2 V5 S& [0 S8 s; S/ Z               [7, 80, 4, 36, 2]],
    . i1 E7 O' B! @# `* O              [[5, 78, 2, 34, 0],6 @( \0 L/ w4 M$ q# Z
                   [6, 79, 3, 35, 1],
    3 ^- T4 G1 |8 N( c& i               [7, 80, 4, 36, 2]],& I& b, b' ~8 J, L# c) U, a
                  [[5, 78, 2, 34, 0],
    * S" X. q+ p& ~0 \: G               [6, 79, 3, 35, 1],
    " [' {2 n7 B9 D0 t               [7, 80, 4, 36, 2]]])0 t7 @8 z) I: L8 P
    x.ndim, b9 o; `* N7 W( A# }4 w9 s8 l
    14 b4 M. o( X5 K. ^  {6 ]
    21 J  ^( b, N& i7 @. _
    3
    1 g' z% V2 x5 o( h7 \4
    & g0 K! h2 z- X% E' I* @; {58 m. r# W$ j& n, _
    6. \6 x, H; i2 J' l& ^" `
    7# J5 V3 Y0 i" c' U
    8
    + P+ ]/ ~- \4 s1 i9
    6 n# m: @- R7 n* z10/ x) @! s$ P. B/ k  N% S) K* J
    输出:
    : z. E0 e9 g+ \6 m- A# e- L# d; _0 g9 m& ^( W% `2 |+ Z9 o7 `
    3& Z$ Y  T  r) i1 A
    1
    5 \! |1 n, Y; m0 e5 j; y6 s深度学习里,我们一般就用0~4阶的张量。0 \7 n/ r/ j1 b! h: \1 Z# D6 ?: N

    $ v6 F# y: x1 U1 q" i) ]$ l张量的三要素
    3 A0 F' ?( x7 v+ f3 _$ C2 Y
    9 F3 [0 i+ E6 g8 @6 N阶数(轴的个数):3,5,…  q1 l9 p# \5 S+ S8 v, ?! z, h8 U
    形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…
    + Z+ W# w3 E4 H1 h. r数据类型:float32,uint8,…
    # b: W0 A  J2 X5 ~我们来看看 MNIST 里的张量数据:3 V- Y0 z$ Z! I" t

    % W- u4 r& D6 I! p- D. E7 vfrom tensorflow.keras.datasets import mnist
    5 U8 M/ B- n5 z! U(train_images, train_labels), (test_images, test_labels) = mnist.load_data()% r1 H/ E" O8 A% E* q8 v
    - T. V% ]  V: S$ M" a
    print(train_images.ndim)/ V2 n& R2 E$ O4 ?5 K8 y0 X
    print(train_images.shape)9 t. K$ B8 `5 T2 r: I
    print(train_images.dtype)6 c0 a/ ], ]/ S; ~) {" E" |3 F+ O
    1
    " a2 X4 s! C; ?2; {0 O8 P$ R- s. o  I. M. g
    3
    9 G3 L9 f) z& o4( i9 ~3 v: n+ Q* z+ y
    5* v9 k  Q: u7 w( K6 K. L
    6: K! x; o* O2 k1 S! L* F; s
    输出:* y$ n3 H8 R, w! L" K8 Q

    * _! S& i8 `' S9 T7 ]/ ]3
    : V1 q' w: J& \6 I(60000, 28, 28)/ P* u  H' x( l8 W( B3 ?
    uint8" J6 k# ^2 @, L1 c( p
    11 j% d# m6 i4 D
    2; v9 D0 ?3 L' Y/ a3 [- M  b2 R
    3
    6 ?0 Z- U  y! u' b" D6 ^8 r所以 train_images 是个8位无符号整数的3阶张量。6 E. u* Z5 W5 h7 y+ \
    ! d2 K! r# U" V3 N) g: z& n
    打印个里面的图片看看:
    2 w" }/ {. ~4 w
    ' `# g/ ]2 [) B4 ?# y7 ^digit = train_images[0]
    8 W' g1 m2 P9 J2 C% K% B+ P
      D9 \, O8 n) zimport matplotlib.pyplot as plt
    0 v- L" |: [4 w) R
    % Q+ t7 {6 I2 K6 g8 H" eprint("image:")
    - {/ Z: f# ]3 Z: M8 p; Xplt.imshow(digit, cmap=plt.cm.binary)! f, ]/ |7 t# G
    plt.show()
    * c( K, g3 B9 @! s" Qprint("label: ", train_labels[0])
    * }8 U: A/ ?' ^. D1
    : J( L7 f/ F+ N) L0 _0 E21 |! ^7 e/ F) Z; f+ x: k+ t: u
    3% _) C. T$ e" L- s4 t
    4
    + N4 v/ J4 ~  a3 T' s+ \$ }3 r; L5) w/ X1 D2 d1 [' T# U* u% v
    61 Y- m% \/ O+ G! M9 X
    7
    % o: x$ J9 O: P- p81 A7 r' K: f  X. y
    输出:3 A+ R* H4 N4 [3 h$ v- ], U

    0 Q. |' ~9 |- l3 n 1.jpg
    4 P* t: V% \1 n9 j, T9 Q- Y. T0 ?0 [4 Q" {; u, r" a# J
    label:  56 z; e; x. ^; X$ }* F( C! }- b8 D
    1
    4 y% B7 ?0 W2 v" J$ J( ^# @5 dNumpy张量操作
    % Q9 }3 }1 E9 u' X2 G
    & Y) a+ C1 ?/ W' f' a7 U8 q4 W- R/ e张量切片:: E2 k. s; ^6 D7 N, W1 q

    2 @, R( X2 P# N. ^( K' xmy_slice = train_images[10:100]
    # S5 l$ `( m  G* @print(my_slice.shape)6 g1 f) W" S- L
    16 d3 P! ]# O# z5 f1 U" d
    2& S6 o" h; b1 y# u; G! {: c
    输出:/ \- v9 b" A/ z0 B6 f1 J" d
    2.jpg : b/ {" A& c* R, w7 l& m
    (90, 28, 28)+ ~( `7 H6 V) [9 M% q
    1
    4 H. |4 k- O/ a: |3 o% ~等价于:9 j9 A! i5 ~: P
    # M  c( ~7 f' R' N  ]: A
    my_slice = train_images[10:100, :, :]
    . T9 A; d5 u  e7 {  m7 {+ hprint(my_slice.shape)! s& a3 h) _* E3 [) |) z3 J
    14 \  {$ D5 _. C- B
    2- u1 h7 B) k9 C' Z. y( n. C
    输出:
    & |2 c( {; J( q0 a3 k) I 3.jpg
    . g$ }  T4 i9 G(90, 28, 28)7 J( g8 O6 J% `1 l3 N2 T6 [
    1
    $ x" q. {4 U$ T9 X8 S0 C4 E4 N也等价于8 \7 B" P$ I' b! W8 w

    6 S! c! |# V2 W  \my_slice = train_images[10:100, 0:28, 0:28]" }3 `+ K, [8 ?% W9 R" z! d4 J
    print(my_slice.shape)
    2 M) o5 |3 y/ J  n7 Y1
    + N, y& L  y0 y* [1 d2
    5 f/ w0 ]. {1 w* u; Q  T5 P, N) I输出:
    ; z( }: j/ U; f) Z5 Q6 A8 J
    * N6 [! c! D4 v: y" _  b/ L(90, 28, 28)6 Z+ t4 m3 r/ ^7 X. Q  z# ]
    1" M# s* ?6 c2 y- n6 l2 R- o
    选出 右下角 14x14 的:. d8 F4 Z% @8 R- b

    2 B; \: C" Y+ lmy_slice = train_images[:, 14:, 14:]
    ' `$ J/ k) B3 Tplt.imshow(my_slice[0], cmap=plt.cm.binary)
    6 ~+ O1 }1 R9 f8 L8 L, }plt.show()
    ' N8 J) k! Z: B, z8 i& a1
    8 |7 T3 ?  f( S! @% T5 g! d2* k; O8 z  B9 i. D8 u  K6 O
    3
    , L7 Y+ i, |% i% h6 z输出:
    * E: |+ |) V4 O# X! R6 j0 L2 H" }5 f
    0 t: _6 x1 }0 c4 n
    ! ~3 Q4 Y' o- R$ g8 P# P
    选出 中心处 14x14 的:+ x8 ~3 k8 i+ k% ^: a: D& Z
    * m0 f0 `5 o# W
    my_slice = train_images[:, 7:-7, 7:-7]3 [" q9 X4 v9 ~' T% j, v' o
    plt.imshow(my_slice[0], cmap=plt.cm.binary)8 Y4 r1 `& J& E! w) w; p
    plt.show()1 B) L  [  g1 q6 t
    1
    % D6 m% @$ ]: a) f" D* w2
    2 y6 X: C% t  p6 E0 u, r3' L1 z6 o0 o4 @, I, n
    输出:7 X" q. t, }* G

    " o% }: D! k) Y+ \9 @9 y" g! ]0 H3 J3 o; F' ^
    1 U9 `* n& ~4 n( C
    数据批量# S$ w$ _6 O8 D; e2 Q' _/ Y; O
    " V7 |, N  l+ U# X. A: q
    深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。
      Y' H6 o$ s$ Z% G, Q, N9 `3 v. }! v. B& E  C, o. K- O- f2 P
    深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。
    : T' x5 j+ Z; Y* y
    ; _0 H" @" M1 R) p  z在 MNIST 中,我们的一个批量是 128 个数据:
    3 j; M3 l2 j& Y7 D+ O/ ^6 x. A6 V# a4 m/ p/ b
    # 第一批
    4 y3 |8 }! [) |' b) p5 A7 Q+ cbatch = train_images[:128]  O' e& K( J* C# x
    # 第二批
    8 r" C# T# r9 e. X2 S8 y( pbatch = train_images[128:256]$ Q! W/ Z; r0 e9 s
    # 第n批
    , a& S& {/ K$ S; {0 D* o' u2 kn = 12
    / j- x, O  i1 i; Ybatch = train_images[128 * n : 128 * (n+1)]& ~; g" @( q) {
    1
    / M  o( v, q- G9 N2
    ) i# L0 c' R% R# p4 V3
    2 m) u7 N4 _5 s2 f: e/ o4
    5 e$ g* Q* h& }. A5
    9 v' }9 v' A) M5 Z3 l+ j6  G/ w7 K; q( l' S! Q. u/ I9 T7 |
    71 ~5 y% I, ^$ [% }' q$ o
    所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。% w1 }  S" X0 D; O) d4 P0 e+ \
    : C3 e5 t# O" I' k0 W3 Q6 a
    常见数据张量表示
    6 y" P  x0 ?/ K5 t# I0 Z% v* R
    7 J2 y8 C. W$ a/ x3 x! Q数据0 M+ F0 h0 H0 ]* `
    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 12:10 , Processed in 0.422421 second(s), 59 queries .

    回顶部