QQ登录

只需要一步,快速开始

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

    + Y% E. Q1 I* m# XPython深度学习之初窥神经网络
    5 T/ C! s+ Y3 O, F本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。
    ( N- E5 p- k/ ?; z1 x7 ^% o& ?9 ]& H0 y5 \% U2 D" \# v' R
    本文目录:
    8 x  k4 M- z4 `; g4 ~; ^6 n7 z. X" h1 b9 v
    文章目录
    ) x6 i6 i0 J6 \# S5 e' Q
    # Y9 I7 J, a) P/ h& X5 {" _4 {6 ^Deep Learning with Python* T" ~" m  B0 R" j! q  o
    初窥神经网络0 e  R9 X; R% s, E' X, a
    导入MNIST数据集
    4 m% ]( k( w6 S) b网络构建; _& d8 t# u: y
    编译
    : c+ q) k% t: ]: t2 ^预处理- y9 {3 G4 {- j7 v' w* t3 d+ ?
    图形处理: g# O- p4 E# Z0 {
    标签处理' E& @0 t+ Y! M& Z- X) Q
    训练网络
    0 ~  C( Z# p4 D. T& U* K& K神经网络的数据表示
    . m  n( \$ f! f认识张量& w' W$ R$ ?: O8 t
    标量 (0D Tensors)
    * q; W. k" Z( W; F- G9 t' E向量 (1D Tensors)
    , O; a8 K, O6 H& W1 u4 `" Z( C矩阵 (2D Tensors)
    $ N+ ^7 m$ N1 M1 I# y4 V- g高阶张量; y7 e4 D( A- q. r3 A
    张量的三要素
    ( z& ~7 `, o3 u4 tNumpy张量操作2 f4 e7 B+ E+ F* L4 ~  W* U
    张量切片:5 t1 f2 k4 W" Q
    数据批量9 V# g  z* K% q) k
    常见数据张量表示
    & T( x5 F& E) n# n3 Q0 s$ }, [2 H神经网络的“齿轮”: 张量运算% n" j; @/ o5 [
    逐元素操作(Element-wise)
    5 x  u; |1 N! a( G8 O3 u1 b广播(Broadcasting), o" _5 G% [  u
    张量点积(dot)
    ! l9 E5 _' \" o$ Y- ?$ }; [张量变形(reshaping)
    % n: L* i% I; H9 j) L7 C神经网络的“引擎”: 基于梯度的优化
    9 ^% x) _- ~+ n$ T& z导数(derivative)
    + Z4 F$ w, r3 b/ O- d1 G8 t梯度(gradient)( ^, o& ^4 }; B3 F/ Y- w9 z
    随机梯度下降(Stochastic gradient descent)6 O1 {2 X6 P0 z
    反向传播算法:链式求导2 c; u! W& O7 J2 s6 ?* M
    本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。1 s- v" d4 F% I+ \. H

    0 z5 r3 ]: C7 s4 d. Z' q初窥神经网络
    # ~) r/ m. o( I" }; m$ g( T3 ^, s- {
    学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。9 F% P! R- J9 v: ]/ w$ y% ^2 q5 L, M; m
    : h! j& G, K0 t! O# H9 K9 Z0 ]. ^
    MNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。- a& g0 j7 ~& J! s5 G

      D* ~2 G$ r" Q9 Z2 _导入MNIST数据集" O; g+ C. u8 P% a' g. @( E& N  `

    ( z6 I' L; q+ N3 P  o# Loading the MNIST dataset in Keras
      R( a; Y9 k" ]" mfrom tensorflow.keras.datasets import mnist
    - F7 q) O, C% j0 c; o" X(train_images, train_labels), (test_images, test_labels) = mnist.load_data()5 n) H; |6 Q& P* Q$ C% }
    1
    9 \2 G+ ^. ^7 b3 x3 S9 Q; H, V2
    8 |/ ~9 B8 U. f. v+ _/ y! V3& D% S9 D& v0 r2 F- ?
    看一下训练集:! ~4 Q. j' R  s! d( B# {

    " P% q- f6 q# a7 W$ bprint(train_images.shape)
    ) Y) W3 g5 G% S$ q. D8 Fprint(train_labels.shape)
    8 T# j- N- S) _+ U% ?train_labels5 |8 k+ I: O) _. K. e+ f
    1
    , x# L6 A5 z) M2
    7 y1 A3 o  U, h; u( u( L* P  a- j3( @' e& V3 V0 @1 m5 D" d4 ^; z
    输出:7 x1 K% T; h" A, _( {" i

    ; X2 }' X  w1 ^% h# v  o(60000, 28, 28)
    , n5 v8 M1 [2 n5 W(60000,)* y& B; E# @8 i4 O  C

    6 n  P3 c, ^6 N- u. iarray([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
    - p$ \5 _& c" ?. P& N+ J+ C1
    7 u' z7 k/ m( @* Q22 M% a7 z  y9 T% Q1 a
    3" F7 ?7 ~) U4 ~+ I3 f. F! g
    4
    * a$ z* ~' [% m) Z) u4 X' x这是测试集:  T$ `: h1 `, o9 q( x0 w

    * R  L% G3 Y& \print(test_images.shape)
    ; M/ ]# T3 c: D) Y6 W1 H- Cprint(test_labels.shape)& P1 |2 D6 g4 b' M
    test_labels
    - I  Z0 o) I0 D1
    & N  J; v$ G2 f2  F& n2 S6 h; j9 i
    3) E1 l; D7 V7 ]/ y: k
    输出:3 n- F/ q5 |, _' x% p

    ! ?5 U* }  e) B1 k1 F(10000, 28, 28)
    ) G& Z4 I! j' \& l( B(10000,)9 E- ~2 o/ m* v4 [
    . \) G8 V; r7 S1 z  a
    array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)
    4 C; g' q3 v, G9 Y19 ?; j6 N8 R) K# V
    2
    ; q3 v+ \& I( [. G3
    ; J1 L8 w9 H& [( d( N& J4
    $ R: U, Z6 ^4 a; l/ K  X网络构建
    7 Z0 i& q9 }- Z, x2 J# G
    . ?* Q* V( i* J* p) }我们来构建一个用来学习 MNIST 集的神经网络:; P! H3 j- R, ^; z' p

    " g/ d% u! L3 ~from tensorflow.keras import models, a" D6 t# x/ i& y' b
    from tensorflow.keras import layers
    3 J% Y, c& D) [
    - J8 D  g! Z1 d/ anetwork = models.Sequential()
    + p$ X8 H! c: m0 t" qnetwork.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))
    , u) T! \, D0 U8 {9 U- A9 a, Gnetwork.add(layers.Dense(10, activation='softmax'))+ G7 J& n7 U+ C" F) F
    1
    # ~0 l+ e9 M. L! j6 A8 T; h8 b5 W2( Q) I0 @9 @0 u( I# _3 L
    32 v% G2 i" i! g/ ]+ I: X5 g0 c- M2 t
    4. [' G1 R+ R. h3 O  A: ]0 `/ S
    5
    % a) B2 U/ M/ H4 R  r2 M' s6
    . A3 g  ^$ b: w# p  G  Q神经网络是一个个「层」组成的。" E  K) M9 V0 ?
    一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。7 ~% }9 s0 c) E, j

    $ G4 A! l+ t) C  V! G! y这样一系列的「层」组合起来,像流水线一样对数据进行处理。( q0 G+ i2 a  P0 d
    层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。# w1 y, s* B" y, c
    5 t, n+ x2 n. s( P  F) H
    我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。  }& t. P, X% B
    2 d  ~! ~2 Z* G2 I' R6 h4 Z
    数据到了最后一层(第二层),是一个 10路 的 softmax 层。
    # _5 |$ N( A- q6 P1 [这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。
    6 Y# n! Z3 u3 t2 U( S事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!# s! c1 R5 a  a3 r" Z  B

    9 T+ P7 w' K( G; H编译
    + s) v" m' o* w" ~& @4 r; J, K* _5 t2 T
    接下来,我们要 编译 这个网络,这个步骤需要给3个参数:' K1 ~- A8 t$ j7 p6 w
    % B- j& r4 \8 _2 ~1 v! |( k8 C
    损失函数:评价你这网络表现的好不好的函数: M) U: s, B  p6 ~+ g
    优化器:怎么更新(优化)你这个网络" `* \' \3 {; ?/ f# S" y2 n# y% t8 T
    训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度
    : ?5 h/ L9 B$ pnetwork.compile(loss="categorical_crossentropy",- V4 M: W, d. A* Q! K2 G- q
                    optimizer='rmsprop',- h6 p: B( Q7 v
                    metrics=['accuracy'])
    & s+ A7 \2 B; l3 [) G+ F15 m0 b8 S; m, K2 G) T( A. `
    2
    6 Q1 `8 L4 W7 w3& ]" q/ R. H0 J0 |" _" ~
    预处理; b/ a/ Q) f" ^4 r# U) Y5 T( u

    ( {& W/ g: ?% `$ M. t; X图形处理, I$ R& d0 r/ o" l# q, \9 W3 z
    1 E) H: J1 p! _# ~! }4 T5 [
    我们还需要处理一下图形数据,把它变成我们的网络认识的样子。) R" K& B7 d: \+ a5 u. j. e

    + |5 C; T# Z4 H' B3 n1 y* M2 c$ JMNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。
    7 _1 `- q& V0 l# w1 O而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。8 \& i; [# `0 F( q7 Y) M$ E

    ) O% H+ C: n4 Y2 ]train_images = train_images.reshape((60000, 28 * 28))
    0 l2 q8 P/ V5 Xtrain_images = train_images.astype('float32') / 255
    8 N  N( Q& X/ D/ w) g6 v, g8 e% _5 }9 D8 o/ B1 g
    test_images = test_images.reshape((10000, 28 * 28))6 _+ \: l/ ~/ {* b$ E: y
    test_images = test_images.astype('float32') / 255
    - z# t, s3 i$ c' n9 H+ u8 r1
    6 }3 F! K: o3 I- P& p  ^/ @2
    ; K5 t! e0 i/ q* P2 B3
    8 y' P  z% w- K0 i4
    - G; W1 C  Q8 s+ H. F1 |0 H53 n" v6 T  {. i
    标签处理7 u% f0 t7 l% F; K

    ) b% S! S) f; g1 N$ G7 k; ~6 E同样,标签也是需要处理一下的。8 q/ }) Z0 f: K4 u; _# ]8 V4 l# a

    & f: c- @4 k6 I$ C6 j" j3 ~from tensorflow.keras.utils import to_categorical
    # Q7 t; O* m2 F  h! {. V7 d% n- c* G! z$ T( m- u; T1 P8 v. G; l
    train_labels = to_categorical(train_labels)8 G) u2 |; x* J
    test_labels = to_categorical(test_labels). b, F8 e2 x( a" W
    14 v* r6 `9 o1 c
    2
    8 P: c- T7 X, j1 L3 m% a3; k9 m, r: S  ~  c# @, K
    4
    3 {  \8 n  v" j$ d+ c- A5 y训练网络: |$ K) g0 e( J( ?4 `) d4 ^7 k6 K
    - i5 X3 r8 r0 {) e3 y
    network.fit(train_images, train_labels, epochs=5, batch_size=128)7 x( g6 I) m& `- k3 v
    1/ g1 K$ w. B" p8 L7 A5 t4 [, m1 D% m
    输出:- O% _" @$ I3 n3 x2 h9 M# l, m& u' U

    5 l& p) S. _, Y4 r9 `' E% {Train on 60000 samples, L. K6 Z9 g6 w" F9 H. ?
    Epoch 1/51 z+ N6 c/ L1 Q5 `
    60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254
    # l; c$ {2 y- W+ mEpoch 2/5
    & `8 S# c' a# ]4 u  m( R60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.96933 {* a- C8 p" B1 C' M* W
    Epoch 3/5; x/ E0 D$ @, _
    60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800
    ; W8 g( b9 J& h$ f) W8 u( \Epoch 4/5  W' I; L* z" Q" L2 V
    60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848
    & j. n4 N' ]4 [; Y0 g- Z2 YEpoch 5/5* F( u' X0 G2 k
    60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.98881 `/ [2 y# k& M1 S/ f

    & a- w; G  G0 u& O! [1 ?: b6 b<tensorflow.python.keras.callbacks.History at 0x13a7892d0>& x8 N6 V( L- {4 S$ N: ^) o7 z: ~
    1& r# v- I+ e4 V( v0 \  E- _- x
    2) E' g6 r5 A* ]1 n0 Q: m
    30 i! j3 X- ^5 j
    4& \) r- q  m9 W3 ]
    5. G# p1 {& I5 b& ?
    6
    4 b! @: N0 u9 H) ]$ A74 Z5 {+ g6 a# a9 f" a/ c1 F+ ]2 m0 f
    8
    2 a# j- c/ H0 C& O* C9! {6 t' p9 X7 w; ~( w+ F/ [
    10+ \2 L' ?$ i; q8 ~
    110 Y* ^5 S9 M0 [4 ~! D9 U( f7 v
    12! B6 S) }' Y4 [9 n) k
    13
    / Y% X. J3 S, i0 j. D- f" I可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。
    + W. e  G) R. @* }4 O
    3 c9 j. v$ B  N% p再用测试集去试试:
    ; s* N& J9 _( e; G. B8 J; q, B  s+ ?- n- v
    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! y6 g$ F3 |9 {8 Z0 ?& F+ i# }
    print('test_acc:', test_acc), f4 m6 X9 C, l9 T9 ]
    1
    # e0 Y4 K* x  h% a! L! N# v: ~21 C; c1 E! \' t. S/ J3 A  Q
    输出:
    4 V5 d! h8 H1 T' ~) Q
    # D* w2 j/ Z" q  P3 s" C10000/1 - 0s - loss: 0.0362 - accuracy: 0.97899 I* P5 v5 p# l' f- }1 R4 L
    test_acc: 0.9789
    $ L$ E$ t! p6 ^+ ]1: i8 C; P2 Z/ N+ _
    2" s8 y$ c9 V0 _) X
    我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。, F# D. K# G) j0 Z6 y5 ]( w

    5 R! \, B/ Z+ s* k$ B神经网络的数据表示
    1 H$ X/ A, ]: y8 |1 Z, t+ J
    + B$ ]  |' \" v( h* A- l- iTensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。' `# J& h+ H9 B4 U$ E

    ( X7 _/ H  u- L4 \4 b7 H我们常把「张量的维度」说成「轴」。# H% _- `/ \: K& l2 l6 c' R. V" y
    6 ]7 W7 @8 k/ K( F) f) `" F2 z
    认识张量" y* r1 {' m. T& x. G& H
    0 A' O, N& S+ M" e
    标量 (0D Tensors); o# c- N( Z8 ?0 b

    7 j3 L* h; P7 ]: ]9 PScalars,标量是 0 维的张量(0个轴),包含一个数。
      C0 [! j  T7 V$ b5 D5 W1 T! \- m
    标量在 numpy 中可以用 float32 或 float64 表示。. E0 G1 G( M4 e+ n+ D7 p
    7 U. {4 h6 y7 X6 \# o& v7 [
    import numpy as np
    8 n1 l! B- L8 y3 v3 [' A* d3 `1 S! K8 d; Y
    x = np.array(12)5 Q. d+ Y8 M' {. W# u
    x& T6 C$ g  e# v; o% Y
    14 u, Z7 Z* P( l# T7 w/ V8 K
    2, m: M/ v2 V" s3 F7 k" M
    3
    $ i8 G% q* g( M4 _# d4
    : C# l; N; Z5 E) C0 v9 [输出:
    " {& @8 O, N' [0 v7 P
    / s3 G0 i6 S5 E) x% g5 [8 aarray(12)
    ; F7 R7 n. B2 u1 s1/ w' G7 _0 _+ V
    x.ndim    # 轴数(维数)) t. _! }% R) K- b
    19 Q/ s% Y% Q. ]" _4 D$ ^
    输出:# g: S# p2 M, M

    7 {/ G6 G1 M$ y1' z' G. \, d/ Q5 s" W2 T
    1
    : l$ @! }, ~6 j  A* T1 k向量 (1D Tensors)+ N: R& t0 m/ `" C" p/ c: s. Q! P
    ; F* d$ i3 ]4 S& g. i8 Y. ]
    Vectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。
    + M0 _1 u: s* A& Z. Q
    & I8 E" o' e3 \- \! A: Lx = np.array([1, 2, 3, 4, 5])
    ( e6 f( D6 }) [# Q( f5 Jx, s9 v0 t; t: K6 {0 i
    1
    4 c5 n+ b3 e6 W* P2
    ' B) a- J( W. L) k8 J. E- m; E输出:* e" H1 I: r6 ?; B" U

    * |' ~5 d) M# R' C# r0 ^% warray([1, 2, 3, 4, 5])
    ; k. L8 S& M* ]; l# w1
    7 U' ]8 `" L0 F' hx.ndim
    4 B2 P/ \" R$ k; W1
    9 R! l( G8 E5 A输出:
    / E3 T: P* x2 B, H
    0 C7 d7 j; n# M; _1
    ' U. l: L5 Y- }6 [1
    # Y8 R6 a% K; n3 }' H3 I9 W+ Y) l我们把这样有5个元素的向量叫做“5维向量”。
    5 \8 F* O, g/ d% _% o/ K: v但注意5D向量可不是5D张量!
    8 h& X+ G& n9 n1 V, X: T9 X# [& `- ~- i  p
    5D向量:只有1个轴,在这个轴上有5个维度。
    " I+ g& W% q: ?5D张量:有5个轴,在每个轴上可以有任意维度。7 _/ E+ @0 G8 S6 {! J- K+ g: ^
    这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。$ Y" ^0 r% O( [: \1 D1 L# r

    & W: {5 w+ H) |所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。
    4 a& r! f8 w# A' X+ p
    ' S# @1 x# N3 J3 S8 m0 r- R# w( R矩阵 (2D Tensors), K$ f' }4 O- E; F9 l
    2 k  t9 N5 q9 R+ b, E
    Matrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。
    " }9 Y. Z' i( b( O& r
    # l5 g0 v; x: z8 p; _8 B& F! zx = np.array([[5, 78, 2, 34, 0],
    5 O/ }# [& C4 Y- d& G              [6, 79, 3, 35, 1],
    ( D# h2 `- q; F: b" _7 F% i) O              [7, 80, 4, 36, 2]])5 u) O, s( {/ {1 g. y1 m) _2 J3 `
    x
    * j+ h8 v8 A* \1 y+ V1
    # s, P: C4 U* j$ P2
    $ m7 Z& y. A$ I  n: O  i9 L7 Y' [3  K: s, f0 e# \, `
    4
    6 v0 B3 [" F& {: {2 O4 k输出:
    5 s0 k% t! Y: M$ C
    " n$ n0 `* L/ Warray([[ 5, 78,  2, 34,  0],5 f  J6 |$ x8 n8 v$ w' {
           [ 6, 79,  3, 35,  1],7 e' q4 F2 o6 `4 n  {5 i  ]: z8 Y
           [ 7, 80,  4, 36,  2]])  _  L! I) ~- E% V
    1- z0 p9 }$ v2 z3 \, j) h
    2
    # L( B* u) E* w* L3 ?" J' k( t3
    + ^' N  q* Z5 v9 sx.ndim
    4 @; w- S9 g$ E1
    9 Y' ]: n, p; G9 q1 R输出:) H  q" C! F6 a) M& f

    & N$ |; i3 R5 H: |! ?0 ]" d* }2
    ' I3 c2 X# }2 `: V5 i15 |( Y4 @  T) v( ~% {9 r2 H
    高阶张量
    9 `$ @  K, Z! R* U+ n% B' ^. M
    1 A/ n5 k& Q$ v' g# Y8 O8 X* F& k你搞个装矩阵的 array 就得到了3阶张量。
    1 M% R1 P9 I. L7 v; G) h
    % J. @% T. |+ V, j( f" [  B再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。
    # Q7 m% P% Y# t+ Q  i: ?: ~7 f4 h% f9 N5 e1 p7 u  d% D
    x = np.array([[[5, 78, 2, 34, 0]," h$ z& R" z$ g
                   [6, 79, 3, 35, 1],
    4 P! w1 i4 G6 f( J               [7, 80, 4, 36, 2]],/ \/ R* ^) t$ S* z# p( Z. H- Z+ G; c
                  [[5, 78, 2, 34, 0],; w! ^) N, t6 l  _/ A
                   [6, 79, 3, 35, 1],
    0 F. r0 H5 r& P* Z( v& }4 H               [7, 80, 4, 36, 2]],7 D$ L. z8 M4 R) C4 Q' K' f5 Z
                  [[5, 78, 2, 34, 0],# S4 B; W3 I# r2 S% ]
                   [6, 79, 3, 35, 1],
    , @8 Y9 f* K, K, _0 P+ ]4 Y               [7, 80, 4, 36, 2]]])
    6 f% S7 g. M! u3 l! h- x6 R9 Y1 Jx.ndim
    $ G) R) M7 D% |0 x1: E" E* M8 Q$ O+ l3 ^" C9 Q9 V
    2
    2 y$ b: W5 _/ K  g# O* c3
    2 W; z1 ^& A. r  L, q4& I5 S7 X; a7 G* p( f$ _+ d4 k0 X
    5( A- w, X& Q. Z! p9 m1 |
    6
    / `, w& l' X) z5 K8 I7, Q/ W/ V) M! R- Y
    83 a% R1 L3 V. E* q) M
    9
    $ o' F- d1 G: R2 k3 H! ~9 q& q6 W; L103 c+ P7 v* l6 v+ i' |- g
    输出:' P- R6 H, s/ @4 N4 [
    , {6 E# ?" D: O: ^+ l- F
    3
    5 B/ D5 b+ Z# _! i% o- B1* X6 J. h- X# X! G& G6 H/ H" x- c! w
    深度学习里,我们一般就用0~4阶的张量。
    / \" _* Z& b- ~* c- c$ Y& w6 v/ H) x6 v; c% b7 r6 K
    张量的三要素
    7 Z9 @$ i- d' ?* M; z  r
    9 V- i: _" |) |% s阶数(轴的个数):3,5,…
    0 S2 {; ?- T& _/ N, N$ g( S形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…5 l: m  }: o, Z8 N) Q& w
    数据类型:float32,uint8,…) j6 d1 |% T- P3 X5 Z1 O
    我们来看看 MNIST 里的张量数据:
    $ G2 x. Y1 R9 `! |
    ' ^6 a+ ^+ z2 m6 f$ |1 ^from tensorflow.keras.datasets import mnist7 i- L: @4 K0 M$ [0 D
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data()( m3 L" ]. @1 q# G! K& g! y6 G

    2 S" r) n1 y  y; ~' zprint(train_images.ndim)( z$ \- R! i. `# ^# X
    print(train_images.shape)2 p3 L% j& o, R, X! B5 [
    print(train_images.dtype)2 q7 E0 s$ P# ]
    1
    9 h6 _- |- V6 m/ Y6 {% m+ Y1 G1 f2
    $ J$ X$ {/ z& t- m, d  g- s8 B3
    9 B& F& `; S0 H5 D! o0 W4
    3 c# A( }+ R2 ^) z( y58 }/ N; Q" ^) Y. f: n3 ~
    6
    ; [" h2 P5 r$ t# T/ Q' A输出:
    + {" w- S; A0 ^; W
    3 U4 f- `8 g8 s4 y3
    & T; b$ T4 r3 ?1 R(60000, 28, 28)& M0 Z' r9 O% `$ x
    uint8
    ; v) G6 i2 G1 X! Z, P7 Z7 H1
    ) A9 N/ ]& U  b( y- B7 V/ @: c6 S/ U2
    $ ?, r0 w5 g( R6 v5 M% B3% T  f2 n& W8 K% |6 ]. ^
    所以 train_images 是个8位无符号整数的3阶张量。
    * z& G* f2 e3 Z. b( z: H9 A5 n' i; e: Q
    打印个里面的图片看看:
    $ G. x) n' }! P$ E  L8 i9 ~2 i0 t9 E/ c. r
    digit = train_images[0]
    1 c# p! H' d9 o" X5 }. [
    8 d- ?2 }! X) Gimport matplotlib.pyplot as plt
      ~+ @$ @- p+ ]5 p3 p5 K9 p) A2 q: }1 I) |4 k: c6 J1 w
    print("image:"). k+ L# q; \4 }9 g7 B+ I
    plt.imshow(digit, cmap=plt.cm.binary)# n1 d/ r9 ^& b6 z$ J
    plt.show()# s  h, m$ s3 K) ~" ]/ [" N  B# ]
    print("label: ", train_labels[0]), \& w6 m  C+ Z
    1
    9 {/ R: q! ?$ U23 A: P2 }9 @# |0 c/ V/ I0 p
    3
    1 T) D! z6 Y- ^) d4; V* B' [2 J6 f2 s
    5
    2 t  C1 w( u& h2 I' r. m63 L! W+ x6 F6 _8 R9 n/ D4 [
    7
    8 `- C% |. X& U, K, ~( k8+ T2 I/ l3 ^: G1 F/ E
    输出:
    ( g/ C6 j; x2 t5 T- V+ u: B: Q0 H& o
    1.jpg % S5 `% e/ G1 z* ?0 b3 _; \
    3 U+ [0 S1 H7 X7 U
    label:  5
    3 Z$ g% L$ u. D: ~& j$ b9 M1
    ( ?8 k2 X5 F* N  ~2 mNumpy张量操作
    . h1 b2 I- N! e- W! s  x, U7 b' U- U8 S1 X( Y5 V  X) H
    张量切片:
    7 C2 g* @* A7 d7 o& K" ]2 \4 A) \1 b# a* h( ]
    my_slice = train_images[10:100]9 [( R- N( _3 G# _$ c5 L
    print(my_slice.shape)/ o1 E4 ]4 I+ ~# F& q7 t
    1  t: U, m0 g. N% C* p2 N  k
    2- ]  l. B% @; E/ z
    输出:6 p4 F7 o1 {, F+ d: f
    2.jpg
    1 T9 _) R8 R4 d. o2 g+ \(90, 28, 28)( A2 B9 i/ T! ?2 A; p) M. P! {
    17 d* N  W. ~& @7 e" n+ V
    等价于:. d& [. ]! g9 n

    : W" G$ d# ^3 _  ^. ~my_slice = train_images[10:100, :, :]
    & o) x- o' |0 ~) U! t5 u6 i( dprint(my_slice.shape)- I+ ~* j, |7 M! k) d# [& K; Q7 h
    1
    5 }2 w5 ]& L# i! G' U2. P. H3 ~7 {& Y$ u+ d( `5 u8 w
    输出:
    , w4 z+ z% L" n: g/ q. L 3.jpg
    9 N2 j& B# W& ]# L, a(90, 28, 28): ?5 q3 T, R8 G4 f7 W% r/ k" _/ n7 [( k
    1
    % s1 o0 U, V3 ^6 V6 L/ p也等价于5 L6 k( w6 K, ^- ^2 A
    / j% n' {  T7 `- c& I8 x& l
    my_slice = train_images[10:100, 0:28, 0:28]
    : @* v- v9 I3 c+ I) A" Kprint(my_slice.shape)4 x! {# }2 Z$ P% C( \
    19 r3 I4 b8 }% Y8 L+ K6 [3 T
    2
    . [7 ]! m5 |9 I/ Y; F& M- P输出:
    0 d9 k+ \* L9 A0 r; U$ f
    # T- ^% t% b1 \- u(90, 28, 28). O' {/ E) h4 Q, z$ c9 v- T
    1
    ( P2 f  D0 s) o选出 右下角 14x14 的:
    ( u  S& O/ E2 Q: d% R4 |  z/ E! P  v3 M! j. v( f/ q+ D
    my_slice = train_images[:, 14:, 14:]0 {% M: f5 d2 ^' W& }  b7 N. a5 ~
    plt.imshow(my_slice[0], cmap=plt.cm.binary)
    * k2 E% u8 F  }! ^0 M  X0 D2 T2 Rplt.show()" }  E4 y+ q1 @8 F
    1; Q9 T  ~* L4 X$ ]  i
    2
    1 i- O) H/ F* x  s& k$ E  l3' i  Q$ R  x0 }( Z& l3 r  q8 |- o( |
    输出:
    7 K) X9 a5 g* m& l7 X6 [6 v$ A) U  r) u+ k, d( q) F) k
    $ {6 Y3 ?, T8 y. ]
    ; g  i0 h8 B" X6 c
    选出 中心处 14x14 的:
    ; W0 |2 Y6 ^3 q7 I) n
    . O8 h/ S4 i& M; wmy_slice = train_images[:, 7:-7, 7:-7]
    8 y1 z2 G8 i! z' z; bplt.imshow(my_slice[0], cmap=plt.cm.binary)
      D6 t$ X/ k2 L5 W- S/ Aplt.show()" k& g7 u) `( p: o5 a2 x) e# D1 j
    1
    ' y/ G6 o3 E* K6 m28 N6 \: ]" o, b
    3
    * [2 H2 N  L  i3 K. u3 ?( Z# r: \输出:
    8 w' J4 n, m/ f4 q! n2 k$ S: P, W( `9 C$ \7 @% ~% L. n! S

    2 Q5 u. {& ^) V" _
    ! c9 w3 R* d% j" h6 R数据批量* _, G% i+ Y8 ?( n- ^8 \
    " n# R# u, {9 m  M
    深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。) e, f4 ?) I8 g
    ) }) h- c* r1 w) R( b
    深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。$ Y2 ^  k7 @' ?8 I2 Q, L9 `* ~

    7 B7 ~0 @2 k# _: U& W7 q在 MNIST 中,我们的一个批量是 128 个数据:+ z/ C+ w. N$ ?  F" {, p6 C

    3 i1 ]& X' x5 F% @6 _5 S) o7 E# 第一批: t9 X$ s. S5 r. \) n
    batch = train_images[:128]
    * t* o) i& ?% b: m# 第二批
    ( _3 s' x8 I$ K3 _( B/ abatch = train_images[128:256]
    5 e* Z8 b  K, ^: d0 K, g$ `" b" B# 第n批! j% K7 l7 |0 b  ?) }; K% z$ ^
    n = 12
    3 ^. x: c* \- h! Q, |+ cbatch = train_images[128 * n : 128 * (n+1)]
    # s. k1 c3 |7 |8 l" q16 e/ W5 u4 f7 {" G
    29 f) s6 c$ W8 U1 n3 Y$ T2 U: _
    3! }8 ], X' I3 [! Z3 Q  m
    4: _. p4 D5 J* c7 K6 u$ l
    5
    + a# ]0 h5 Z2 o! x4 h' N2 u" \" ^9 U6
    8 L& V2 t  e' x1 n7 v7$ }8 _+ _3 X/ |* _- p% K
    所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。+ n& k. ~- H3 _
    4 Y( w9 d+ e4 j8 x5 @: f, ]( S
    常见数据张量表示9 j+ t+ c# W5 `3 w9 j- E

    : n8 A. p% u6 J数据
    * S- f+ J* ^( u& T4 I, 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-18 01:34 , Processed in 0.368198 second(s), 58 queries .

    回顶部