QQ登录

只需要一步,快速开始

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

    , X" {6 o1 G: ?0 N8 l+ n$ `Python深度学习之初窥神经网络1 }' V2 j1 V$ Q8 S6 ]/ r( u: A
    本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。
    " t. y  ]# q- W7 @1 A3 S
    7 z; N2 w$ x# _. X# n本文目录:- G- A- p7 z) x

    , v4 U8 u: {& k2 g& L/ Y文章目录1 v3 V  l6 `4 _) K1 u& s8 I

    9 f4 A8 D8 g) X( p) B% ^! ODeep Learning with Python! v( q2 r; L$ U6 C
    初窥神经网络) q# T$ P4 g; q: I1 T
    导入MNIST数据集% B2 p+ @+ f9 W( e3 }
    网络构建
    2 i" x5 K1 Q& p7 ]* k7 L1 J编译
    * t" c2 C2 V& V- l- G8 o预处理
    ) Q8 T# m$ H. a) Y" J; B图形处理: p3 X- U0 ], R' U; z
    标签处理
    # u3 U; m2 R0 [+ G训练网络
    8 J: ~$ P9 e0 G! l% K神经网络的数据表示, d/ a3 ]5 J" @; s4 J7 q6 X/ K
    认识张量5 R8 O+ R8 G  Y1 \" \7 ^( K
    标量 (0D Tensors)
    8 @- C; }" x" G2 n6 h向量 (1D Tensors)! k) u, H9 ^$ F1 E
    矩阵 (2D Tensors)% G# K3 S3 z# q: P  B
    高阶张量+ d/ ]. d5 B8 M( ~
    张量的三要素6 y) g- ]1 k/ m2 P9 S  n7 y
    Numpy张量操作
    + }; f  b% k. f" @- ^8 ?张量切片:
    % y; M6 Z" {, W9 H- D数据批量
    1 d; k/ G4 ~, N, s) N# h9 m8 r常见数据张量表示
    2 w  H; y- T% Z2 m, s+ A+ e神经网络的“齿轮”: 张量运算
    1 Z" G5 O/ u2 A逐元素操作(Element-wise)
    1 r) ?' {$ `: w, A* X广播(Broadcasting)% r( b8 w' C9 c! l. H
    张量点积(dot)  O2 X0 Y- H' {5 C
    张量变形(reshaping)
    6 b' Q$ z. X9 v, M, D1 c神经网络的“引擎”: 基于梯度的优化" `- s: Y4 B9 G% l& {* b
    导数(derivative)  Y( {& o+ S! t$ B
    梯度(gradient)0 S& T, t: t3 [5 M( u6 I, D( F
    随机梯度下降(Stochastic gradient descent)
    # s4 w% \9 W0 Z5 n3 z5 X反向传播算法:链式求导  n& ~9 m& [3 F& c& V# T1 d
    本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。  V9 ~5 L% B7 f. B! M
    % N  V, X) r8 L
    初窥神经网络6 _# [+ x! k  q  O1 Z# j

    6 h/ l. Y$ k% E; J  A学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。
    + d, Y, T! Q" n0 {: d% Y+ X# n; D; }
    1 M7 Q3 _% v6 pMNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。. l3 c8 j; y/ O( {$ D+ N9 ?/ f

    % D' [7 L8 `) ~导入MNIST数据集6 p6 i6 }9 ~! Y1 a) J" ^
    , {) c0 n  D& \9 T
    # Loading the MNIST dataset in Keras& j  K6 e1 |* D* @
    from tensorflow.keras.datasets import mnist8 t( [1 R! j- n& ^
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data()
    6 k" @# ]) W# C- z6 k% T17 g# C/ M/ b: l8 o  }
    2
    + B" C! i4 o3 C+ z" g2 S- H. ~3) u! Q* y5 x7 m4 G# M/ B5 K6 h
    看一下训练集:! a( E; }7 ]7 z" u

    # L, t& ]# x8 g0 }- Kprint(train_images.shape)7 F! S) ?$ e0 v' q
    print(train_labels.shape)" R' ^( v; A) n$ |' _8 u
    train_labels
    * W# Y; N! `6 @$ b( i% }1
    / g8 {$ W3 ~3 s7 A5 b2# a0 b1 ^! @+ e
    3+ @6 z& h2 q$ l% ^
    输出:5 F* h' L3 |! G* z7 B

    8 b5 x3 a+ W2 E. c/ ](60000, 28, 28)
    ) n; R7 y9 E4 ](60000,)9 \9 R, f8 @! S

    6 e' n* [3 ?, f1 A, warray([5, 0, 4, ..., 5, 6, 8], dtype=uint8)* u' e% f+ E- g# I
    1) Z, x- X! |9 k* B# W4 j" f
    2
    & y' z' J( x  V" n+ @, ~# b3
    * d6 C( U0 v4 E1 D4 r$ {4
    - J2 y6 d' s7 j这是测试集:
    ( x3 c1 V: i& w1 ?$ S  d5 p- j' ]; D7 s! e2 W0 g6 {7 z6 ^! s3 `
    print(test_images.shape)
    % U7 T: L. K. L- ]0 B& j+ zprint(test_labels.shape)% l& T5 o- v% t. T/ e
    test_labels
    3 u' o7 \0 t1 c2 N5 i1
    # h: L: q' L  }! H. V0 E25 y* @1 R, f" i1 p1 ]) V# n1 L
    3, o9 S; C, l* y) L% O1 t
    输出:: Y' P& J" Z0 O! A3 C

    & m& I: \! Q2 h(10000, 28, 28)+ a1 Q/ |/ D6 l, h7 x: x
    (10000,)
    : D/ I: I6 g; Z! }$ o5 s& j! u, a, q* X% W
    array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)
    0 ^% h, K8 |. o! m$ X1
    ) Y$ b. J0 [5 P, I/ g+ A* J9 y# n2) c. T2 ?9 @; E+ I! [
    32 K* O0 R9 M& g3 P! `
    4
    - P4 M7 ^# S" _" v! y% o: t网络构建( ?, [$ s# \3 b: [

    ' @% b. F+ u, u3 P' Y$ y* j& T6 p& }我们来构建一个用来学习 MNIST 集的神经网络:8 r" |( h1 [+ `( K

    / }# Y, }, Z: _% Jfrom tensorflow.keras import models* g' @. I; {. r. M8 x9 }
    from tensorflow.keras import layers; y# W0 _$ {; o, U0 z* [: r

    * |  b& M! _* z, onetwork = models.Sequential()
    % }# u8 l5 O# Fnetwork.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))
    1 M% a# ]8 O% |3 G( U0 z% `5 ~& Jnetwork.add(layers.Dense(10, activation='softmax'))( o" }( Y5 [- O
    1
    & ]( `! ?2 T+ Y% H0 O, H2
    ; n  ~! @' W& ]3+ {1 _) Q& ^* }9 m# J* p2 q- l# B
    4
    0 Z8 ]; {$ G7 n5
    & z! \+ L- y7 s: @68 Q4 ~* z5 o* m! P+ t) H" V
    神经网络是一个个「层」组成的。, F- |) A" ^7 m& d7 m
    一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。3 Q. h+ X+ s8 B" F7 n/ l5 H

    ( O( e6 M  u8 X3 _这样一系列的「层」组合起来,像流水线一样对数据进行处理。" `1 H+ O" O7 i1 J! O$ A
    层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。
    : c* F) |' T0 I+ X7 H3 ^$ @+ U" J% B* I: h/ g
    我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。) q! G9 p/ u4 o. }+ h
    # i; @8 z4 V" ?) E
    数据到了最后一层(第二层),是一个 10路 的 softmax 层。
    ' E/ d* y, P, |1 d这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。
    * D0 G6 k+ w: X7 H) O) R事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!
    # I/ J! m# |+ r1 _! H
    0 v, v) G5 H0 a% F编译
    6 N2 p5 ~9 T5 n: l8 t2 X* q  u. b2 g" j! X# N# J- R" T, b6 F% [/ V- d
    接下来,我们要 编译 这个网络,这个步骤需要给3个参数:$ L- c5 L& u( R% d# ~; b/ X6 `% n
    + L6 K$ N4 z9 T# B7 e- E/ l
    损失函数:评价你这网络表现的好不好的函数
    * n' l8 a  E! n, Z- ^+ u0 F优化器:怎么更新(优化)你这个网络
    0 P& {5 y' u# x1 X训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度$ I$ ]7 j! ~( w  i
    network.compile(loss="categorical_crossentropy",: c5 a1 L$ a2 N% o
                    optimizer='rmsprop',
    - G5 q* t' S: E: |                metrics=['accuracy'])8 z/ V5 K) d2 B1 X. S" M7 Q2 g( V
    1
    ' i, b' F! f& X& [9 Q/ E; P! h0 z28 j" ]6 @# ]8 ?! u: A
    3
    : G& K2 s* q8 t& U% K预处理
    - ]' n9 Y6 y6 D5 K( g# A: s' f8 Q  B* k, Q8 L9 [& T' |
    图形处理
    ; ?' U! h  W# Q% X( y
    , j. Y  O) Q5 h2 j" f# Y我们还需要处理一下图形数据,把它变成我们的网络认识的样子。0 a% {) j/ o) |7 j; L
    1 k2 |. r* |" _6 j
    MNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。
    ) Q, l8 h" V; ?8 V. t而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。2 {# ^; ]2 u8 ~4 J# E5 N# d

    6 P, P2 O& v2 ]- E3 Itrain_images = train_images.reshape((60000, 28 * 28))
    / M; y* S$ I9 ?8 w9 c$ s. ytrain_images = train_images.astype('float32') / 255( O$ A3 E+ Z# P1 f5 P
    % p1 ?' l! L5 l/ l0 f
    test_images = test_images.reshape((10000, 28 * 28))
    : Y, p: g8 g7 B' ?4 Y) ctest_images = test_images.astype('float32') / 255) U4 e/ L* m( x1 q; z6 c
    1
    7 H+ w) S' @! p& y2
    6 ^6 g% `" g2 ]: e: s3+ V4 {# v3 m5 K2 ~) R
    4) M: @# G6 q1 B) l3 W! h: O
    5
    ) e. H( ~; v& r- O标签处理
    ) G' M5 V; W4 J) J# s- m* S  D4 d& L* T' X9 }+ U
    同样,标签也是需要处理一下的。+ W9 X% K( R8 S9 F) d! t

    : r1 k7 ]$ |2 ?from tensorflow.keras.utils import to_categorical
    + x/ v# T; r  z' O/ K; t3 b8 p. r9 C5 P- V. p& h) m/ `  s4 T# f2 j6 X
    train_labels = to_categorical(train_labels)0 M4 Q* S/ E: u- N
    test_labels = to_categorical(test_labels)
    ! p7 Q+ {- T+ C7 `17 @4 T# d5 ?3 A! j* g, |) D
    2( [- d3 q/ e5 r) W# H" X, o
    36 ^4 R& w1 S2 o1 P# F1 j  ]! f# b# P4 i6 g
    4
    9 U0 S$ @7 r9 s+ t2 l. m训练网络
    0 W" n" x5 M& e, e  r1 u7 u
    5 f+ z% X2 m2 E. G. }9 T2 Wnetwork.fit(train_images, train_labels, epochs=5, batch_size=128)% N, f* v$ t* F2 w& ~
    15 z2 y4 K4 U" K7 G- k! p; H
    输出:
    - ^* j$ r: ?% D7 c
    . q" j9 U3 ?5 T+ M" a6 d9 OTrain on 60000 samples* D7 e0 X3 s9 O' r2 i2 @
    Epoch 1/5( U3 A, U* B& ?' c+ V* T3 U
    60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254
    1 t' r; P) I8 h% T" g% IEpoch 2/5
    6 F5 z! B. p" c& }6 H6 P$ g1 u  b, d60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693
    + p6 m( h, g' a6 g9 @  e" X, {0 k( ?' AEpoch 3/5
    + z6 Q3 M; L7 \8 `: e- k60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800
    ! B. B4 U/ i3 @/ ^# `* Q) LEpoch 4/54 x5 M$ _5 O4 @1 ]' T2 ]4 N
    60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848  S  D, F9 T, j
    Epoch 5/5
    ; v! @# y7 h5 a* v60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888
    6 ~& m) f0 T# X' i. i
    7 d; c% z% r0 T" L$ ]<tensorflow.python.keras.callbacks.History at 0x13a7892d0>9 |1 k3 @& \* k. L
    1
    / W$ \& Y3 J* p+ k* L9 l4 N3 t3 y2, `( A7 H$ S5 f" M! i
    3
    $ G3 f5 ], w. d: h% Q% T% j4) |' L! J+ L4 {5 q# q
    5/ z& \4 ^' _0 N/ ]" a+ j4 o
    6
    3 J: ~( m+ a! ?71 T5 f3 {# M6 C: k
    8
    0 j4 ~8 N0 Y; ]. L9
    . Z" Y$ g' O5 [8 O  F10# J7 b) g/ D3 n$ }* j( X1 H7 ^7 T" H8 C
    11
      J% G" M) L+ a+ v9 E3 Z12
    4 E  c7 g! V/ l+ V! C2 `133 E" Y- k5 Y3 t- F# D1 g
    可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。% `# Q3 ]1 p# D

    % D/ G7 n# B/ m# {" g8 u再用测试集去试试:
    - J! [6 }2 C2 ]6 Z
    5 B! K2 ?5 }: u5 H- itest_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: j) J4 k8 N0 s6 p0 l2 T" C5 z  R
    print('test_acc:', test_acc)' i0 s6 F" Z5 p
    1( `1 v9 q. P$ A9 A! ]
    2
    8 U9 c$ Q% _% K输出:, j* K! P/ n# N

    , f7 Z0 Z, z9 G10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789
    3 K+ F8 o* q, @$ v* T" X! ktest_acc: 0.97899 _2 V( y4 p2 [8 `
    1
    - I  T2 ]# w- S2
    $ L6 r+ i* y  T2 _! v* d" C我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。) V9 J$ d3 J1 ^/ W, g' J

    . z1 l* S) D$ O* ]神经网络的数据表示, t: I9 {- y4 |7 n' `1 G; D3 [; @$ O/ a* L

    0 T. J  f6 h9 ], h# [& }  O( x5 m" fTensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。) Q. k6 ~7 d; {" B) Q" h+ |4 y

    9 K3 |4 H  n1 x# [- f$ t我们常把「张量的维度」说成「轴」。
    " G/ C7 Q) m+ v$ ^! Q. _
    6 }. ~$ ^8 x+ U- e& o' j/ P" |- \认识张量
    * Y4 o9 H$ u" g4 s+ i
    ; Y6 b) K2 k6 r: N" Y8 D标量 (0D Tensors)
    7 a8 p; S; i$ R# g4 e
    # G4 b/ r4 }+ b5 OScalars,标量是 0 维的张量(0个轴),包含一个数。
    4 {/ D: N/ ?, ~' }% A2 o
    ( T5 O2 @" z( x0 i6 Y/ Q3 h标量在 numpy 中可以用 float32 或 float64 表示。, I/ x4 b2 M: D
    / G# m* C& z6 w* L) l6 G* n
    import numpy as np
    4 c8 |5 x9 b  r- O8 O. ^: i0 K, P4 [+ X# D9 u' B# j  c0 K! W
    x = np.array(12)2 k; M6 N8 u& V1 w  V
    x1 w, O2 _# l# u9 E- U
    1
    1 F% w5 d0 |) k* l, V% x0 z9 i2" Y# S! v- @! y# }9 e! x3 [
    3
    0 w' ^/ S  N" K4: A0 b& D- h1 k% B9 J  {
    输出:
    , L6 [3 \1 |& S0 {! }0 H% c0 D" p" N! q9 y/ w, y) ~
    array(12)
    8 O8 y- Y& M. L% I1/ V6 M' d/ ?& u7 P/ Q% v
    x.ndim    # 轴数(维数)
    ) H. u8 f- z4 ^: C" W- @/ Z13 C$ A1 b: N! L; H8 d) R) ]
    输出:/ u: _4 q5 v9 @

    2 E8 G- i% u$ U9 e& g1
      o' y3 r6 C" ~7 k1* w/ l% H' C  [! x/ t- v
    向量 (1D Tensors)
    0 M, |0 A" V( \' B0 \; [% Z
      Y* e( e7 e; ?7 ?1 o- w( ^- cVectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。! b  p3 x; \9 [1 A+ G0 @

    2 L6 D# c; ~8 M# k- O; Gx = np.array([1, 2, 3, 4, 5])
    ) F; a. m& W! C3 T' G9 t, ex
    * c. a4 d7 o% l5 m1; @% C" `) |% ?7 z, |5 U! f& S
    2
    6 d+ u+ L/ h. F输出:
    , W3 G5 M! {0 ?7 l6 B! P- W) c2 ?6 W0 k
    array([1, 2, 3, 4, 5])* ?: C* K* L7 R8 @# N
    1
    * a; d3 |- H- g0 j5 Q7 Ox.ndim
    7 {& M) O: K& a' w1
    2 S( @+ V, r# M输出:
    ) }& g, c: }5 i. Q: u
    * O/ z' T; M0 w9 |4 K1
    ! s+ c0 `+ ^! i9 l, a2 `1
      T2 D% I; u; I" e我们把这样有5个元素的向量叫做“5维向量”。
    * i: @1 `2 Q+ `+ o但注意5D向量可不是5D张量!
    # w8 d9 ]+ h0 c5 o; ?4 |1 v3 X5 H5 p6 m& e) \5 E+ S
    5D向量:只有1个轴,在这个轴上有5个维度。! {8 l% y8 r! f# p5 v
    5D张量:有5个轴,在每个轴上可以有任意维度。
    ; n5 ^7 |8 A7 I( f+ ~! X0 [) b这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。
    2 G+ ]+ Q$ j9 ?" }& s. J- e' e/ h( c1 y. Z5 l( Z
    所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。+ Y! ?3 n- m) p1 c2 H, c6 Z

    6 n' J5 f7 Q# L5 Z7 B矩阵 (2D Tensors). x5 S3 ]- Y4 V! M7 c1 k

    ; r- ^+ b8 n# U1 Y) m' Y  l3 z% fMatrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。
    " G# d& [+ z$ y; g
    & u5 b+ F* h% b2 l9 {) H1 cx = np.array([[5, 78, 2, 34, 0],
    4 O6 b& z, |8 J  R' v              [6, 79, 3, 35, 1],
    ; b/ m! C* @4 Y; }5 Z              [7, 80, 4, 36, 2]])
    1 b8 L$ |9 a% t! Xx
    # Q  ]5 d5 {; J7 e9 E( n2 a1
    " s1 G# f$ x& u2+ Y+ F& J8 n$ g" Q" ~  Z' I% Y
    3- X, p1 i8 x1 g2 ~8 d4 F" B9 d
    4$ g- [" h+ z4 q1 l/ b5 `# G8 c
    输出:0 B& _$ E% F+ o& ^- u* E  [
    , j/ b1 r9 f7 A5 ]. C- h
    array([[ 5, 78,  2, 34,  0],
    8 J, ^. g9 `3 x7 R5 d( d       [ 6, 79,  3, 35,  1],
    " K& b( ?& |" G; A       [ 7, 80,  4, 36,  2]])* W, l2 I8 u( g7 ], z
    1
    ( f; \2 Q, W' {) w  Y2  O  \2 E8 W* r; q. H& K4 i* S
    3
    0 d( p! N6 M$ Y& b% {/ Nx.ndim) W  s" y  A4 d' R* ?
    1
    * _# D4 G$ A8 \. b% l% _& c7 ^; j输出:2 ]+ l  }9 p0 R+ O0 L$ H3 i( t
    ) g! r+ O3 f6 }2 r
    2% t, o/ f/ ~) ?& {6 ?! i1 P
    17 ]' b. c* g* F8 H$ ~
    高阶张量
    + B( O" O* J, S5 n: G4 e3 I$ }/ |: h' ~5 [
    你搞个装矩阵的 array 就得到了3阶张量。
    9 @$ s. g7 t* D4 Q% h8 C. `$ K/ l6 z6 m. @8 @* d
    再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。* o. t& G, {8 c/ X( N6 ^

    1 R; X0 D1 p7 l% D0 O4 r" g& ]6 fx = np.array([[[5, 78, 2, 34, 0],0 C0 r( j1 X0 Z5 O# s8 [
                   [6, 79, 3, 35, 1],0 p1 g* b" {) _6 q
                   [7, 80, 4, 36, 2]],& ]0 d0 {6 X3 }5 ~" k/ V+ e
                  [[5, 78, 2, 34, 0],
    . {1 e$ O/ y3 a' A               [6, 79, 3, 35, 1],
    % Y6 x5 S# W! ^: P9 P               [7, 80, 4, 36, 2]],
    $ a' @5 o/ ]) n+ r              [[5, 78, 2, 34, 0],
    4 r5 o, A* W. w' j, n& n/ f! N  |               [6, 79, 3, 35, 1],
    5 O' f; q/ m5 H) M0 Q               [7, 80, 4, 36, 2]]])  j' f2 s  A  C) L+ s& s5 D
    x.ndim
    % Q( L! N! D/ V' I9 q2 `1
    ' h9 b/ H% \. z. M% o, K( w# s3 w' z2/ l1 f, I' L- R8 }
    3
    ) {8 y# B: @/ Z1 ]2 _; I9 M3 c) S; E4
    $ t" ?. d6 M$ [  p  O) t" e* U3 Q5( W" h; Y7 j1 I% X, a0 K& |& |
    6! J' E+ c8 D( Z# m
    7
    " K, g! C. \6 `8: Z. a  k: d; j0 R3 I. u
    9
    % P% j' |" M" p& l& M0 N) c10
    1 A' ?( e/ l+ Y) P输出:
    5 _$ Q, M6 R4 q4 v0 C( ^1 J" g; M5 j6 [6 ?8 d! ^1 {& ?/ M7 r8 c
    3* g( S( d6 C# z0 P. G
    1) c( d7 e# I# ~: _6 F7 [. d% F0 L
    深度学习里,我们一般就用0~4阶的张量。, R3 A+ c6 f5 ]% ^6 b$ Z; z( f& M
    ; \! U% {' z' q
    张量的三要素
    , e3 ]/ R! a1 q: Q* U' Z' {3 n1 s$ S" W6 H: h; O7 i
    阶数(轴的个数):3,5,…
      h8 H% }( w4 W  O6 S; T形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…
    + k, V  o4 A0 @  i) w数据类型:float32,uint8,…5 B1 v7 E( H" \! Z0 z
    我们来看看 MNIST 里的张量数据:
    5 z1 ~  r; m6 S8 X/ j6 W3 y, f7 h+ d& u; q' i6 h) ?
    from tensorflow.keras.datasets import mnist4 X) S( P0 |0 ]4 \
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data()" A$ e8 Q, X2 Q- P* \9 v  r

    4 V7 S7 l# N) s% K- Uprint(train_images.ndim)/ {4 G6 e, Z1 B! R8 X. @4 r
    print(train_images.shape)
    / u4 O; z& G7 S% h8 b, m) ~& `4 dprint(train_images.dtype)4 Y8 A7 O( a7 c0 k7 t
    1
    $ O4 p: b4 ], s# V+ l7 ]* ?8 y2( [2 K! q: ]  T4 S- `
    3" b5 ]9 M$ T/ L2 n) p
    4: B/ q" b! v4 S1 x; x2 ?0 T! ]% ?
    5
    ) F# y( X/ }; O* U4 }6
    * O3 ^0 A4 w% z$ y- M7 K输出:3 z! A. J1 W1 G4 {
    # Q* f; t+ V. C: z
    3
    7 B  M7 d. @* A" r5 p(60000, 28, 28)
    . k& k/ c" g  g6 u5 c+ u3 auint8
    $ N. ]  i9 E2 w- [' g2 v% W& j1
    ; h* I( z+ B5 x9 `) i28 P6 }5 s' q! N" D
    3* @3 x% A  J" r- g; v# @# ]0 }* E( i1 d2 k
    所以 train_images 是个8位无符号整数的3阶张量。
    - `- z, k" M& E! }5 v* W; t( a3 P4 j4 {# D
    打印个里面的图片看看:4 ?! f8 n8 F5 s1 j+ y4 S

    , y" B2 p" b; U" R; i3 _! H4 Adigit = train_images[0]
    $ Z$ Y- x+ S) J/ f3 M0 v$ \- P
    ; {/ r) x2 R& ]& s7 v# dimport matplotlib.pyplot as plt# q+ _' I$ l0 ~  W; H1 x6 M

    ; |' S5 ]/ y' Qprint("image:")
    1 p, {" y$ ]  L5 T: }; m+ D3 E9 ^9 ~- l. Yplt.imshow(digit, cmap=plt.cm.binary)# i; |& O9 {/ P& h
    plt.show()
    ! d9 N, p& `5 F# b) uprint("label: ", train_labels[0])
    3 k6 S4 y2 l" w4 C' X* k1* X1 p6 Y. e4 ]* |! P) l9 ~7 l
    2
    ( y: [1 S  A' H( F& @7 \9 ]  H% A3
    5 X7 J- Q) p+ c6 B! j4 l) o+ x4
    2 x, P% }& \, y* U- ~! o! t* i7 X5
    # F! h* K; }. ]6# B4 L8 c# O! M6 {9 N$ M
    7
    % |5 d0 c6 ]1 \7 E' x" \+ U8
    : q  R9 w+ @. L输出:
    8 E& W4 I7 U' ]; N
    " Y& q+ s' _) z* x 1.jpg 9 w) r3 k5 B4 ~# _5 u2 b! |

    + c) n& ~" }3 a% @+ P; O1 L' olabel:  5
    & G* C8 y3 b" d- K1 n1
    & f# S0 _# x( eNumpy张量操作
    5 [& H0 T9 u* Q  f3 y5 a8 q/ G. G) s' y0 g1 s
    张量切片:
    7 i; f- U6 C/ [2 l0 g- P# E
    3 x; c4 D5 a+ p4 w. smy_slice = train_images[10:100]
    $ b1 x  K' T5 \4 Rprint(my_slice.shape)
    3 M3 u1 [6 T) `3 G1! M' z( c& N6 r
    20 G+ N8 v7 _" u" J7 i1 F+ I
    输出:
    4 h4 @6 X  g% P2 A; V 2.jpg 9 _' U2 A7 N! N
    (90, 28, 28)
    ( ?, X* K! J+ A: T5 ^" K$ U  ^: A6 S1
    # s7 W/ G" i6 I9 x等价于:
    1 L/ M6 |- p" n* i9 z; J$ a5 \( V% b
    my_slice = train_images[10:100, :, :]( F+ a2 C/ Q2 Z
    print(my_slice.shape)
    / V3 w4 p- ?5 ~- w( C  _8 P1& w  A4 f4 s$ E# ^$ n
    2
    ! k+ q1 S1 x3 B% N输出:' D- Y  i( H6 f0 `
    3.jpg - `4 R. @4 y$ W( I5 K5 @
    (90, 28, 28)5 j3 t  Q: m  ?
    1
    ; r/ g1 _' B! ~2 D6 @& p也等价于
    , @1 w" q$ t! ]1 B: `2 L" i
    $ G+ B* R9 h: k: M; E- V* n0 Gmy_slice = train_images[10:100, 0:28, 0:28]
    9 v  a: e3 y! O+ e/ cprint(my_slice.shape)
      v1 L  g" Z2 r9 f$ A) k, a, L4 i' {1
    # r) m5 A) w" h4 \, L23 B9 ^+ J; U/ S. m3 c- E
    输出:) t2 v' a$ R  S: }6 N: s3 K1 p( _8 y
    * ]* p' f3 ^! E/ s! o% F9 ~
    (90, 28, 28)
    * C  v& x- l& v" n# A1
    9 {7 B, F" D7 U4 ~  x# P5 m7 c选出 右下角 14x14 的:
    7 a$ j3 J0 g9 R6 H& {
    ' q* Q1 D( g0 P+ X6 B" G1 Bmy_slice = train_images[:, 14:, 14:]
      r( p2 o+ Y& m% t+ }- Q" P! m6 Cplt.imshow(my_slice[0], cmap=plt.cm.binary)( }  D, k# D& I
    plt.show()9 j. I7 M3 l6 _8 m; G
    1
    & g3 I" G" a6 `1 }% Q3 `23 `' U* A; B. l
    3& t' x+ Q& z4 Q5 h
    输出:3 ^% p) R1 c2 z( p/ r

    ) |1 Z( h8 `/ W0 Q& D
    7 ~5 `/ e& R5 T. W/ X" d( V' F: p6 u' q- S3 L
    选出 中心处 14x14 的:' l4 K" U' @3 R" |& \

      |5 ?7 q3 M. e( J# y7 p5 ymy_slice = train_images[:, 7:-7, 7:-7]0 U* f/ o# t7 l3 H; v; k0 t
    plt.imshow(my_slice[0], cmap=plt.cm.binary)
    & R0 J( c- t  }* i8 dplt.show()0 Y  d6 B  m+ [/ F
    1
    & u9 l/ {4 ~7 @9 o2$ F/ o/ D6 H+ U' ^7 }7 ?* |
    32 B  f) T: q8 P; o
    输出:
    # N, t: n) e& }, k7 P5 v( z
    ! o5 [1 p4 c# \& u1 L) J* b) `, O+ [6 P1 E) [
    - @1 u! B! P4 B. n6 h
    数据批量: g) r" A6 v1 ~/ \% Z
    : Z) |( O+ Q1 r+ K5 P& d
    深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。
    # X1 u- z# U5 |: o4 p" \# a( e5 m& v0 G, J& R
    深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。8 T6 T. `/ N- P+ Y3 u; T0 c( b' i

    * S. Q: `; w$ r- r3 O8 L在 MNIST 中,我们的一个批量是 128 个数据:
    & l" R, m+ c! O+ N* ~. u
    1 F! e; ]% ]6 \5 S7 R+ m$ G& e# 第一批
    , E' F. R. ]! P. G0 Cbatch = train_images[:128]
    $ C7 u# @4 o' J9 c7 B4 Q# 第二批7 L, A% f, O* C0 f# W+ D" [
    batch = train_images[128:256]8 T! Y( e4 @' O0 o5 j
    # 第n批$ S  u$ I  ]' T& B2 ^
    n = 12
    $ Z0 F. B+ p5 R( k$ u& |batch = train_images[128 * n : 128 * (n+1)]5 t3 g" {$ Q) R
    1
    ' E+ g! Z0 F, c8 J  a) n/ k% s. ]1 n2
      g  _. p; U3 M% @36 {, u9 c: f) `8 }; k* S9 P& \
    4
    ( c0 M  c/ E( I( p1 c8 Y5
    ( E) T4 t; j7 s6
    0 S' H( X5 G7 E; t& [  Q) K. Z7
    7 w2 ]- m) {! x* f2 f$ ^所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。
    $ a8 e7 H' F' r3 k" S( N& N7 l2 X) ~" o. f* F3 b% X
    常见数据张量表示1 V- X# |- l1 |
    6 z0 b4 ]- X# g
    数据) |# r! y. \2 f$ P  }$ ^/ c' j" 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-7-18 04:59 , Processed in 0.494662 second(s), 59 queries .

    回顶部