QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6536|回复: 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
    - P5 N+ ^; _6 P$ L  Z, m
    Python深度学习之初窥神经网络
    7 n3 Q- ]+ O( \1 O1 U本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。
    ' T+ S, j9 h  I  c# Z4 z9 u3 s4 g! I  d3 E
    本文目录:
    : ?, x" O* F& q6 X4 N1 [3 j- L9 |
    文章目录
    2 M$ k5 s; v; a
    ) d9 F& O0 ?8 Y- H5 qDeep Learning with Python1 m9 b0 w( C8 ?, x- r, {
    初窥神经网络
    $ |% s; V# Q8 }) S( ^0 q# E导入MNIST数据集' O. S- ^& x! M# @
    网络构建( ?& e. g+ \1 s; a$ f1 O
    编译
    / _0 S( [4 d: K2 `  Y1 l' |5 W; V. x预处理4 f* ]( b6 m0 o$ h9 g8 x& s7 M- z
    图形处理* y; |2 x8 i7 ^! b0 ~! X
    标签处理
    6 d5 p+ k  r/ V$ n/ k/ J! [- F# ^训练网络: k3 n+ J# }/ L" y! Y
    神经网络的数据表示
    , l# R6 t& P1 W  ?. c7 o7 L' g1 S认识张量
    / b) S: a- W8 Z7 {( N" ]标量 (0D Tensors)* _* L' a" H! w
    向量 (1D Tensors)
    2 r- R9 m1 m* ?* x矩阵 (2D Tensors)9 p* n+ Z4 f1 M( r/ p4 v$ E8 f
    高阶张量
    ! i- ~/ X8 G& o( e$ p( h张量的三要素
    6 V4 ^* g9 n2 F) s; T& }Numpy张量操作
    / y$ v! K4 f0 C- Q7 M. G. E5 u; e张量切片:1 a) ^* ~: ]) W4 x% r: ]$ v
    数据批量
    ) J  z) k2 o- y  S' @' U& G常见数据张量表示! x0 o6 S: [( v& q
    神经网络的“齿轮”: 张量运算
    1 l) n; z. u# e5 y逐元素操作(Element-wise)' z- f0 `- Z$ n
    广播(Broadcasting)# P% s$ P5 j! @# W5 o: N7 ^; _
    张量点积(dot)' \8 s! {3 \" Y
    张量变形(reshaping)
    . B0 Y7 B, @" S' a" t神经网络的“引擎”: 基于梯度的优化
    + u( S8 e* I! B7 t导数(derivative)
    % U) D" d& C/ Q梯度(gradient)  c6 T# F. ~3 _* d( d5 V
    随机梯度下降(Stochastic gradient descent)
    0 o7 j1 S+ q% O( e9 Z7 ?. w* h反向传播算法:链式求导
    $ y* o. ?* z# Z8 c本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。- ~* U5 h  W; r/ R! K8 E9 N# }

    ; t+ U" |6 {* |' f# |  k4 ~8 E初窥神经网络' v+ i9 `0 c" A5 u; G1 M

    1 d9 E9 d9 ]8 F' P学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。
    * r  I$ M, T5 r9 Z) z& u; H, T
    MNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。
    , c5 P! u- y% k7 ?8 t. x6 {' J( |' i( v6 ~! M
    导入MNIST数据集
    0 F6 D7 x4 ]$ x" V5 \& i4 A
    " b3 l) U% v% L$ _# Loading the MNIST dataset in Keras6 Y7 b) ]- K* ?% D
    from tensorflow.keras.datasets import mnist
    7 H+ U( o* S( c9 k(train_images, train_labels), (test_images, test_labels) = mnist.load_data()$ v+ C8 u; d: k$ s4 T& }7 G* i
    1
    ; H% K! Q  a. j2 N2% a7 D) e& S) [% a; C
    3
    # R! u% _# N2 R: y看一下训练集:
    : ?3 U: Z" `8 i3 r- ~
    + [* X% G$ b; _% Wprint(train_images.shape)# ?2 e: o, ?8 C. }
    print(train_labels.shape)# }  @$ o/ a, X7 l- s# {, N' A/ d
    train_labels
    ! k4 w1 c* o' r. q7 W- a7 A1
    % R6 f- [: K# N/ `, K2
    ( W; B0 T5 d3 p  f3
    0 Y1 G7 [0 C2 X; {, d' V7 |7 R输出:
    : [& a5 g2 Y) U, \8 c( v" |2 H; y0 E7 K9 V: P+ C2 N$ s
    (60000, 28, 28)& U7 j! x1 t  C# K9 C$ `. y
    (60000,)  n5 X8 i# R" O) f0 |' g* m. ?& Y

    # M: G; d) ~) S9 U- X" L  parray([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
    1 B3 m. u5 n# y7 J' Q5 R1; R) Z/ V" r- A8 D! ?/ h6 {
    2
    6 P) [$ q" S0 z' _3
    * j) |+ [* X) s. K4/ l( Q- ~* g4 |/ _3 b
    这是测试集:: T  s9 U% F9 g

      P$ @5 x" O5 x6 ]print(test_images.shape)  g1 |0 K( A. g  N
    print(test_labels.shape)$ i$ P+ g  `1 k2 D# H0 [/ U
    test_labels" |/ L5 o9 X7 P0 C6 L
    1" w" z' n. _( @0 p1 ~
    2
    8 ^$ a( Q: N& ~  ]3
    8 A( N& p( c: A/ g4 M) K输出:
    7 B/ U- T/ s' P: ?- E
    9 X4 L, F  }+ N% n4 r! ~, E' g* r(10000, 28, 28)
    & e9 B/ o$ [8 f* |5 R(10000,)
      N4 f- V5 V. H1 D% b
    8 g6 v) ^" w. j, W, i! Oarray([7, 2, 1, ..., 4, 5, 6], dtype=uint8)
    , B4 o' o: h* W5 i* O1! u- h7 R6 u$ s( l1 m* S
    26 F# g9 i$ t- s8 k* w: k
    3+ e4 I' Y6 X1 Y; F. J
    49 G0 w! h8 ^4 q
    网络构建
    8 K3 b1 `& S5 t4 s- `1 Y+ @  D. J# F' @# l3 R+ z
    我们来构建一个用来学习 MNIST 集的神经网络:; W/ O: b/ i' r+ |6 G
    . F2 E" F9 X. x1 f
    from tensorflow.keras import models
    ! c- v; F9 h1 V9 Rfrom tensorflow.keras import layers$ l( l, W$ f$ s: I' u

    6 W8 L3 \* u* E! ?network = models.Sequential()0 w' N2 y/ O# [8 U
    network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))
    5 k9 [! R% j* ~network.add(layers.Dense(10, activation='softmax'))
    ) B# c& L/ S- R1 `( R1
    " F0 g+ T/ e# f& E$ Q3 s2$ {& V3 {/ F' C2 q& U6 R# ^6 H
    3
    : j: O5 @2 Y- C: `7 n/ ^* H4# c" z, T2 {1 ^/ j6 L( m: ?! t% m
    56 m1 d* g$ s% [7 Y) {
    69 j9 X( g0 G+ P# O6 u! G2 c( h
    神经网络是一个个「层」组成的。7 _, _! j  }" U6 c/ v: ?( {
    一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。
    : `& B( o8 |: q* m4 R" J
    ! N- ^2 P, {8 t/ v& ?这样一系列的「层」组合起来,像流水线一样对数据进行处理。0 }/ L% x2 A4 v( s6 g- r
    层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。! g4 u2 I, Y0 F

    * E. q2 @" J7 u7 b& _8 Z我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。
    3 |' u6 x+ I6 P8 [; K
    9 r9 X2 K$ @6 t- r3 B" W' O数据到了最后一层(第二层),是一个 10路 的 softmax 层。/ m$ @( {6 a# m
    这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。
    3 \. N1 f: |3 `. s: R7 o# L0 m事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!
    + s9 `1 J& Z7 v/ m2 o- @( k% ]2 g9 N% f0 ^* G
    编译
    : x2 t1 u& N% }# _. a$ g/ \/ F1 C, d# S8 ]2 h
    接下来,我们要 编译 这个网络,这个步骤需要给3个参数:
      X1 r! v8 ]% l* g8 e2 z, i/ d9 x' Q3 g6 S- f
    损失函数:评价你这网络表现的好不好的函数
    8 k  U; s$ J- A' ?0 V* P优化器:怎么更新(优化)你这个网络. e6 Z. n/ X! k6 j2 m
    训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度
    # V1 D2 k6 z/ t' z- n# }. v. f- bnetwork.compile(loss="categorical_crossentropy",9 c+ b( s! I! {; j# v& M
                    optimizer='rmsprop',, v$ P" c1 ^: G3 c
                    metrics=['accuracy'])! r- ^) Z' [1 m1 m6 d) `
    1- O( _; m  ?# z4 t1 I: r& Y3 i
    2$ P. ^! u1 k' n  e$ z9 A+ C1 L
    3/ R+ F- s: A# t  c7 u, K: P' H
    预处理/ T5 l+ E. n1 C* r2 m+ {% g

    1 }6 H6 K. G2 I6 }图形处理: t( {3 j( E+ n1 r, M7 Z9 ?0 o
    3 c( i( t2 p/ I, x
    我们还需要处理一下图形数据,把它变成我们的网络认识的样子。
    $ N# ?! k) ^: T  I9 r' N) m  A7 a. v8 v9 |
    MNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。4 x! Y0 \3 k# i
    而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。' N" J. X, x! p$ q

    1 Z5 D& k0 I, C" ktrain_images = train_images.reshape((60000, 28 * 28))
    / w$ [- U# E. V3 K3 e1 D6 O7 |train_images = train_images.astype('float32') / 255
    5 W9 S+ z+ H0 J  m/ ^( c; g: ], H; d8 _6 S( K
    test_images = test_images.reshape((10000, 28 * 28))' Q4 m" k" o' ]! ^" d1 }  \, r( H
    test_images = test_images.astype('float32') / 255' K/ F% `2 k; G& h$ O
    1
    " s* f) ]. g& u( n" Q27 Z7 o2 e# i0 ?
    3, i0 ?3 d" C- n+ @/ f( [
    43 h+ R& v9 u* ~0 @% f; y- j% }1 s9 a
    5
    3 d0 }  ^( ~+ D. G5 f标签处理
      z. G( q7 r: P5 m1 S  ?$ L6 g
    9 [5 g. x! m# w5 Y; T" N7 D5 g同样,标签也是需要处理一下的。/ X, `% W$ Z* Y6 w

    ' H2 o& M7 P/ y/ Efrom tensorflow.keras.utils import to_categorical
    4 f1 n4 B( B; W
    1 g% [2 W+ ^# Strain_labels = to_categorical(train_labels)3 G+ A% Q3 P2 J& x: A8 |0 ?. K# |
    test_labels = to_categorical(test_labels)
    $ w7 Y( e# g! _/ C, Z# S! n7 U# o1) \$ A5 g  ]8 V  p% ^* K
    2! H* t! P% J) n- {2 b
    3
    # m& F: p* G" L% Z, {# X8 o, e% W3 g" ]4" e+ |( l+ p+ V3 F3 a
    训练网络" m6 s* O* m, Z; m
    0 Y( H3 `( A8 {+ i+ N
    network.fit(train_images, train_labels, epochs=5, batch_size=128)
    " ~7 u+ C6 H1 Z5 o( [9 G1% j9 R% L( R* E/ |9 {) T( p- \
    输出:
    - |# _, w' z0 I3 P6 A* d& b! P2 y: O
    Train on 60000 samples* j) O0 r+ g# h& Q
    Epoch 1/5
    7 @& N! v4 q- G4 l8 w3 ~60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254
    , M6 I$ _0 E/ ~Epoch 2/5
    ( G0 b" r+ ]1 g" h& a# R6 l60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693
    + ]4 ^  s0 q( o+ j  lEpoch 3/5
    7 w: \  N2 T9 {+ c60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800
    " ^% a8 H; Z( C/ r/ |Epoch 4/5# y6 p1 D5 o* D9 n1 c
    60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848
    3 V9 x  `$ m% s; d$ O) AEpoch 5/5( S" U, O7 f: y) [# B/ _
    60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888
    & V: L& ~  g8 U. ?- A3 A5 e% ]; `
    <tensorflow.python.keras.callbacks.History at 0x13a7892d0>- \6 z# y) O3 j8 o
    1  V$ V" {# u, a" r1 R
    2% J/ E  L, V" d* B
    30 M  B+ `6 H* z9 ~9 m
    4
    : m6 s2 b' [8 U5 i/ y9 J5
    # f' ?6 o  P0 b+ v1 L) Y2 }6
    8 d! w5 U" E! j0 i7
    - z; ^2 I& h/ V# S6 ]; K6 {5 Q8' X, Q# b) ]6 q+ @4 [1 M; e
    9# U- s/ W" ?% L3 p2 f3 j( b% r" i
    10
    . W' f7 i% `5 b% _1 E* D11
    8 u& h1 r, y5 H+ |5 _12
    . t% ?( e9 D; d$ G& e8 V13, o7 k, ]5 W+ d3 U8 y5 ?
    可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。& D, _0 x: H; D9 X# m) B7 d, w, S

      Y. r1 O7 K1 n5 H: l7 y  Q" C. ~再用测试集去试试:! ]) Q" v) N' d8 R' R9 v. e5 `

    " k; [4 \) i: etest_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
    7 Y6 `: \5 Z' w+ }: T* Pprint('test_acc:', test_acc)) `- e/ l( r+ O6 d, B, J! \
    11 `+ K! q/ y  Y8 t8 `8 i1 z% p2 T
    2( G8 V5 `4 a" \& W) M2 h7 x
    输出:3 y2 l. \' O% l+ J* v
    9 y# e5 N$ d+ A9 Z4 M
    10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789
    + P; n7 |* r; x3 C* Xtest_acc: 0.97895 v8 ~' }$ \* o8 z
    19 I+ t$ g+ K* R0 p
    2
    - ~3 l, h* V+ R+ o5 }/ t我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。
    + E7 P$ }( N0 P* t& O: I) d, l& d* n' H) ?
    神经网络的数据表示
    $ a2 G6 @7 I  f, m% o7 `' C0 `3 T4 j' s% u. l& ]! F
    Tensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。4 ^( f5 {$ j/ G( X
    0 K3 t' F. r# `
    我们常把「张量的维度」说成「轴」。
    ! F% g9 H5 X7 G' M# _9 D  Y$ J# n7 l# t% Z1 Q0 h0 W
    认识张量. O% z! J( e' a# ~

    " n/ n0 ]# V: \& a2 j$ D, G% \3 @标量 (0D Tensors). j) j! O8 E2 x8 ?8 y9 |, m
    : T8 d% W- p/ S! ^
    Scalars,标量是 0 维的张量(0个轴),包含一个数。; W0 r" O& J! C1 D

    * i1 b4 ?( E" v5 r# k2 z标量在 numpy 中可以用 float32 或 float64 表示。
    9 d! X0 W# t4 G) i; @" K7 t, s0 R, A0 T! v) i& G: D( F: }
    import numpy as np; V0 _; s7 m  k* K

    . [1 h- d7 [  U; i" w& b# \x = np.array(12)5 W7 A' G( c* s$ p2 ~( ?
    x) q# O; I7 ]* P3 _; x
    1
    0 c' E# x, o; O7 [2" P4 l: J8 a5 H; U
    3
    2 i( w; E6 H. Q4" r2 F& r8 a0 b" D! ^0 v9 i
    输出:
    4 @7 F) w' C; B' N7 Q" `; X7 i/ x# X! H+ F6 S" f# z9 w& G
    array(12)
    " }3 a" h0 i% J+ c, G1
    ! f7 W. K9 V6 S) j$ Z  Wx.ndim    # 轴数(维数)' |7 s$ d2 E7 _+ x9 {
    1
    3 ^, }: h  w4 `* w输出:
    2 V3 I. n! |- ]6 q! A
    2 ]* q% i# A5 _: I# o% O3 s14 D  U3 B! \) l2 [: x* d
    1
    $ E7 a, H0 x( i* [  A; z- U; Z向量 (1D Tensors)
    * [4 {  B5 u( G) O" E* G1 u3 T! m+ ~8 Z4 `
    Vectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。  m2 f# z3 \  m! D7 K) }9 }' h$ Q
    1 F) E0 D9 d( O
    x = np.array([1, 2, 3, 4, 5])
    3 f: O; |. p+ i* cx' z$ c+ n5 u, n
    1
    & Q  }! |0 K# N0 j3 m& G3 S2
    : q( O: K9 t! d& I: m  e2 c输出:
    ( z& N: K9 U, e& ?! |8 y
    $ }) }# D  W# g- s7 u4 d* p5 garray([1, 2, 3, 4, 5]); l: L4 H1 d8 ~. h, I
    1
    ) `" y' M2 K0 Ax.ndim( x$ V# I4 }, ^
    1  k1 l7 v. \! s1 z8 B6 A! _+ K
    输出:* }0 y: L7 M+ q. b+ r* t4 J' p

    & P: X6 a- d  n" {; ~) |9 `* P18 z- T' u/ x! G9 B/ C: u2 m
    1
    ) ]( d# l1 |* P5 V' I5 h9 B0 }* J$ i我们把这样有5个元素的向量叫做“5维向量”。
    4 ~. v. C6 \' u1 y* v但注意5D向量可不是5D张量!
      l5 t* G: Z. H0 O* V# A- D8 p! O
    . K* {. V: ~+ V" Z7 j: S8 ~. i5D向量:只有1个轴,在这个轴上有5个维度。
    ! v' O" S. X. d" e6 c9 I' G5D张量:有5个轴,在每个轴上可以有任意维度。
    5 V9 \+ W8 A3 l这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。- Q: x/ O6 e- X/ n; v
    $ {9 t- d& z4 y2 Y  v5 f$ D
    所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。. \" R& S  }. O, o# W; j" C0 \9 k

    * ^* V3 }9 t0 ^( b6 h矩阵 (2D Tensors)% B& U9 O, r2 m

    # h- }! e9 ^4 n, [# c) D" RMatrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。
    1 r% F0 X3 t5 a% S2 B) D4 M, ?. p$ K4 Q3 A6 c- E+ c% ?
    x = np.array([[5, 78, 2, 34, 0],
    5 a' N. [3 D0 a' S& D: ?2 T. y" P; i              [6, 79, 3, 35, 1],
    0 b- V3 t% [  ?9 X  ?& {1 e7 e) S              [7, 80, 4, 36, 2]])
    6 Q; Y8 j" g" vx
    % K0 Z" N1 E; G9 q1 A1) `3 C4 W, T* Z" J
    2: J/ O4 c$ W/ X( S, F- Y- n
    3. X0 m# u4 H* p3 Y* P# H/ [* E/ O# K5 S
    4
    " d) D  `; K, b3 U输出:
    ( K5 E' s0 b" h4 c# b$ i/ o3 M
    ! s7 D# N: D# g  ?8 o, l+ `array([[ 5, 78,  2, 34,  0],3 F# D' p- `3 p. R/ A- V4 E0 u6 r
           [ 6, 79,  3, 35,  1],5 w' _0 @9 d! r3 l
           [ 7, 80,  4, 36,  2]])
    ; @" `  ]2 g$ g- m0 F6 D8 {+ n1: C; c/ [5 [7 f+ Q  A% j$ v
    2+ C5 R3 f8 S8 a- ?' y- I7 v
    3% k9 F- I# n! U/ y
    x.ndim
    ; r" A2 |; U2 ^0 }. G4 @0 t1
    ; @$ r5 P# D/ ?! h/ Z1 {2 Y输出:5 t8 ?' d' y: E4 p6 V6 l

    ) S; j8 R) j+ ?* g. A$ v2
    / I1 }; U4 r) c3 b  _  j% k1' A4 P; h: R. a! e2 w
    高阶张量4 {. k- y0 _1 f# S  P

    - X" j. A8 g- n* O你搞个装矩阵的 array 就得到了3阶张量。
    - U# F  h; K. c. J* N8 `$ i5 R" u" G3 L
    再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。
    - [7 J. C5 @* F5 x" E/ k+ k5 V9 D' ^% E, k/ Y3 ?  J, S* ~9 Y
    x = np.array([[[5, 78, 2, 34, 0],/ U( `$ B& D" f, q
                   [6, 79, 3, 35, 1],, {! e. w4 [/ f" I0 n, R/ K( k
                   [7, 80, 4, 36, 2]],9 T1 K! \$ l* A. U! r7 Q) z
                  [[5, 78, 2, 34, 0],3 j+ z' `7 Y. y
                   [6, 79, 3, 35, 1],6 N- h& R' H( z* w4 f6 [
                   [7, 80, 4, 36, 2]],: ?* ~8 p3 S( \2 I" N
                  [[5, 78, 2, 34, 0],: [- X7 L; J6 T2 h$ N1 z
                   [6, 79, 3, 35, 1],
    . N& d5 k$ b; e7 M  g: I1 O/ D               [7, 80, 4, 36, 2]]])3 n& ^) m! O& o4 O: x/ A
    x.ndim
    - V) E  S5 v* ]' o; f6 Y+ d4 z1
    - k3 P! h6 G7 {* v/ b* s2
    ) {5 \& j0 N7 I3
    5 f1 R( O/ ^4 ^4
    - L  z5 `! U& b8 L% [, ^8 p53 I$ q+ B" F) i: n1 d& {
    6" U7 y" J' H7 f
    7+ I6 h! b$ ?% B& W$ _3 Y/ h
    8
    : @& [7 L0 r1 F94 d! D* O; S/ Q/ k6 v+ U9 y$ H2 x
    10: Y' A. R% g* ?/ p1 ]# g0 X
    输出:, K* _4 U! D9 e% D

    % e7 k. W3 @/ {$ Y- k1 o, K3 L; d% L/ {3
    ! P+ M1 B, Z) r- j1
    , K( h; Q# G# ?* ~% t0 R5 m深度学习里,我们一般就用0~4阶的张量。7 Z* F* U" y/ i6 s
    & F% s. S( g0 K, G( \8 J) `, i6 Q
    张量的三要素
    ! e& W: H6 z) {: U0 C% d1 K$ J8 a5 E* q6 I  y  Z1 @: P+ ]
    阶数(轴的个数):3,5,…4 \" ^: a$ }* s2 A. }- V
    形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…" p3 Z$ V9 b' q) p& A6 f$ a4 E6 }
    数据类型:float32,uint8,…! t4 v; p. o8 ^4 k6 q3 ]9 y& n* ]. K+ ~
    我们来看看 MNIST 里的张量数据:9 V+ a8 W( O0 m$ s/ v/ D, N
    & l& l& R! t+ j6 |
    from tensorflow.keras.datasets import mnist# O' M3 g  y' o
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data()
    ! j& h/ W0 l" ~* e3 z
    % \: m; g3 n' |5 G6 N) L0 Gprint(train_images.ndim). W1 l) t3 H( l3 C
    print(train_images.shape)
    2 w/ Q$ R" s, q' Z/ xprint(train_images.dtype)
    # v0 A2 D* ?3 W, u& N- M1 V4 A1" T3 b) b. l! H0 O. W7 {" {
    2
    ! C5 P6 o) u3 I' N6 y7 U9 T+ W34 K% K' c1 u5 s7 j) z
    4
    7 j# \/ _, l) ]" c# X% Y5! S7 b' r% p0 X) }
    63 C" k+ |$ @" V% C
    输出:9 q, d. v" Q7 a) ?

    4 j: m( w: F4 w7 U) y3
    7 m1 l+ M. F' e3 g(60000, 28, 28)/ L3 \, q9 F6 j! o' u* Z& J  T% V
    uint8: w9 a% i( _3 C) J
    1
    1 _/ c2 [& I7 F2$ x! I  ?' ]4 e2 x: v' V; E7 y
    3( R: J4 @5 b. I6 `+ A5 D# z
    所以 train_images 是个8位无符号整数的3阶张量。
    7 C0 H; u/ Z+ L/ _9 A- A( i
    4 y* ~3 C0 O* ?7 h0 b# ?打印个里面的图片看看:
    6 h8 K0 Y4 z* ]- B' E" R3 l( V& A0 O+ [
    digit = train_images[0]$ N5 L" `) D7 |5 F4 }$ q

    0 o$ x: ]. K. Y6 G. |7 m% Yimport matplotlib.pyplot as plt2 h$ N! w3 C4 K1 m
    + J  @) b- D$ ^8 i
    print("image:")
    9 @& ?* R! W" c2 ?- P( r, Oplt.imshow(digit, cmap=plt.cm.binary)& L' D, K# a9 X, R
    plt.show()
      s0 u! h% k! a- t; r5 D: Pprint("label: ", train_labels[0])4 |3 N. H6 I6 |/ _  @
    1
    # N+ i1 _- P$ f1 e" S6 C3 p4 ]2
    ; u2 d5 q, d; `& k3
    ! f2 M3 B/ r% S( M  w# U7 |7 V$ s; G4; c% ^. [5 Z) S# e# u
    5
    ) E1 w9 {9 o  B# M' C# p6 V/ B6: Y5 y# p2 F( t5 r! D
    7
    ; W, }# ?% d6 R! ?/ G8
    5 L' K$ M! [2 o# L8 r输出:8 ~! n* s( q; W9 H% I

    0 A; `$ r9 l% F* ~6 |% L, y3 Z 1.jpg : \/ G6 z4 `1 r% o, i& d
    + J6 U7 x7 @4 q9 x& C
    label:  5
    7 A8 I+ K2 Y7 U  \6 {9 e1
    * ]* W  B0 S2 P( sNumpy张量操作& R+ }9 L+ e+ ]! F2 x) B1 X

    ; ]7 Q1 U0 B' L$ i+ B张量切片:: n4 O& I4 N9 r& F! Z$ H) j$ M2 O

    4 `- p& m+ H6 }5 Mmy_slice = train_images[10:100]+ [% a) c, V1 ^% `. d. \
    print(my_slice.shape)
    8 k2 u9 ^8 a% O2 ~) G19 }2 ^8 Y0 _6 x( I, O" D5 T$ q! S
    2  |1 F& }% _9 h4 B5 v9 ^
    输出:6 a  t5 G: [5 o5 |
    2.jpg
    9 e" x- ~" Y" Q4 C; R1 Z(90, 28, 28)+ R! Q# v" |- k7 n$ d
    1
    5 c. r6 m0 f( V+ Y7 j$ j# T7 \等价于:
    1 \  w+ T$ ]- w
    * [9 Z6 U! v3 |, j; y6 ~my_slice = train_images[10:100, :, :]
    % k' A/ M! Y' M1 u8 Q/ R) P/ D' L5 Cprint(my_slice.shape)
    1 ?, r2 c) k1 A* _& E18 m0 {5 \" C, d
    2, E8 y% f* G2 W. Z" p1 Q
    输出:
    9 O( {' W8 }/ x4 N' G7 d/ V6 s4 } 3.jpg
    ( n4 C0 O. W9 x5 h(90, 28, 28)6 b; U) t- Y/ o
    1
    8 n  z0 L; N' i1 A- _" ~. {& M# G也等价于6 m6 m4 |  L3 t) {8 L4 S/ u

    0 ?5 ~& K( N" q; lmy_slice = train_images[10:100, 0:28, 0:28]3 T  M2 i* {: N
    print(my_slice.shape)3 K+ O1 ^# `! c; \; H, S
    1
    0 |: z, v& }- R5 F# [) B2
    , W- ]" a2 @6 t输出:
    . M/ E, \6 \0 N  v$ ]4 y
    4 q' C$ S/ n! ]; ^, B3 o1 Q% _(90, 28, 28)) ~. z: }( o0 @7 a& v
    1
    " W- V4 H, s4 _+ C8 {2 o* f1 p8 Y- p选出 右下角 14x14 的:& f* ?+ b# D) c% K
    1 j1 M& O. E6 y2 s' |0 i7 \* i
    my_slice = train_images[:, 14:, 14:]
    $ s  F+ A1 c  u5 P* f! ?plt.imshow(my_slice[0], cmap=plt.cm.binary)
      K4 P1 g; J( z) f! F+ K1 Bplt.show()4 G; a/ P: E  e( i/ O
    19 H' v, ~) O. q: N
    2
    9 I( q- s; {% w! S3$ e' S: J) m8 F+ x
    输出:
    # B# L9 v; J% y9 I1 {, l# R) O+ K* ^
    , y: C# _3 E7 ~' k5 v2 e5 C
    ! [8 p8 g$ u. A7 U1 J, o) M1 v/ A& h
    1 s, D5 @0 I3 G% j/ N选出 中心处 14x14 的:+ e, @* ^2 B6 H) ^2 M% N
    + G2 ?9 |. B5 Q+ X& i8 h7 p
    my_slice = train_images[:, 7:-7, 7:-7]
    # P; \4 k2 c* p, Z1 Vplt.imshow(my_slice[0], cmap=plt.cm.binary)
      V7 M, g2 [1 p. l3 T. hplt.show()
    , i5 v7 B- r4 E5 f+ u( S' D1 \/ o1
    0 P' a& w' A2 `$ O7 k9 H2) c- m$ v& C# s* s
    3
    7 w: z( C0 h0 e- B+ m" }4 c输出:, v6 `  Z2 \! w  j  j! H8 n7 V

    ( Y. j  x9 `" S" }. b. K1 r. T% q7 J
    3 U0 r3 ?7 I9 u0 @+ x4 d/ B
    数据批量
    ' g' m! d$ R3 }( I& ]" F0 p% |# ^$ D
    深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。
    2 t, ^. X# G) Y- V" `) H% Z/ @+ d) N
    & [8 I9 g& K) p0 |* [/ I  s1 g' v7 c深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。
      @2 z: b, m7 M1 R7 A, k1 P( g( p# w2 j, d; s
    在 MNIST 中,我们的一个批量是 128 个数据:
    2 L' p) B: k8 h/ j/ \9 C. v. [5 e3 \
    # 第一批
    % V5 k, ?! Z. [' Jbatch = train_images[:128]; F- ?2 `: D& w2 t( E/ d7 {
    # 第二批0 O6 c, t% k" z* K' a
    batch = train_images[128:256]. U8 z! e/ ~8 B
    # 第n批
    - h% s' s1 _; v# Qn = 12+ e4 J2 h9 B# F7 @5 P
    batch = train_images[128 * n : 128 * (n+1)]7 i; y- [7 y% C. a; Z$ \; x
    1
    % u  K. ^5 n  f0 L2
    9 _* G9 A* [( v; N6 `3
    1 w; C9 c1 B/ x2 k% Y1 e, i4
    . q4 p( G8 e' i9 c5
    ( [" n8 q, i8 ]0 V6
    $ S+ e7 F2 w8 G' H+ c7) f3 a! P5 R/ Y; e
    所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。$ c- C# u3 U, M" l5 l; ]. S( \
    ( e3 r: Q2 ~2 G2 z/ Y' F5 \
    常见数据张量表示2 G; o% |6 a4 |2 m# w
    8 Y1 |* F0 R9 d. _( R% L+ f
    数据1 S- O) G# H# r! n1 a$ o
    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-6-2 23:51 , Processed in 0.492724 second(s), 59 queries .

    回顶部