QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6537|回复: 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
    - ?, M& H! h; S
    Python深度学习之初窥神经网络
      q" A/ W  F  s, w本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。
    - S' B! W6 x' O  x1 E6 o3 [: R! P$ m. ?: o5 U# x$ u
    本文目录:
    , R! {% j# f& q: w" A9 y) r0 m- n2 d* F: @# W. D: g
    文章目录1 F0 ?& D! M( ~* W$ k( S

    ) J8 U# u& \! H& N# U! i7 vDeep Learning with Python
    . Z+ C; p( H- I: @初窥神经网络/ f# S$ W$ V0 u6 [3 y4 C) ?7 A
    导入MNIST数据集
    % @- S$ c, l0 f0 w% @网络构建
    2 c( Q$ g0 ?( c1 P# u' M: @0 n编译2 N1 k2 c6 U( l2 O8 L
    预处理
    : e0 s9 B/ F5 N4 Q* U$ P% R/ _/ g1 n图形处理7 ~* s- e( P) S; m% N* m2 S
    标签处理
    ( t* C6 Z$ u2 n% |训练网络' N, }9 ~2 k0 P! `, V
    神经网络的数据表示
    % a( j! c3 L/ _* h9 ?! `认识张量
    : d* x3 b2 h5 `) h; x. k( |+ o% M9 A标量 (0D Tensors)6 k9 n" x: e  L% Y
    向量 (1D Tensors)( M' U$ g# H5 k, m( x7 L
    矩阵 (2D Tensors)! d% ^% P* J/ y& T* |; ]- @) F
    高阶张量( L) u: R5 _" u% A$ n' x3 j
    张量的三要素( E5 f' v6 K6 w8 p
    Numpy张量操作
    9 f# e# @& ?0 Y3 `+ F张量切片:
    9 F& }! n2 I$ \; c8 |& D- d( \& m5 O数据批量
    9 L& g( _2 G! t) d5 e" q! Q常见数据张量表示
    ( R# A. D& l5 Y/ r, K$ o神经网络的“齿轮”: 张量运算
      [) I; n) n5 C/ c3 T0 P6 S逐元素操作(Element-wise)
    2 E- i; l1 F7 E广播(Broadcasting); \( c+ J- D& V# s$ o+ H& j, [$ O
    张量点积(dot)
    + `' Y0 q' y2 w5 ]4 N  M张量变形(reshaping)
    8 ?" R. D5 ?9 @# x神经网络的“引擎”: 基于梯度的优化
    % Q& I( r8 \0 m* ?4 @导数(derivative)
    0 ]  l* I! j+ f$ e, s; T梯度(gradient)
    ( n) x+ z2 v/ b3 g1 D# M# c& F随机梯度下降(Stochastic gradient descent)5 p5 ]7 T1 c/ z! ~5 M
    反向传播算法:链式求导5 h+ G  i7 _0 u  B9 H* w
    本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。* m+ v% B* U8 C/ U8 ?% W
    . i4 G# D' {+ N3 |4 g
    初窥神经网络" J$ w6 \" {8 A
    ' d6 x. h& h) v* y8 \6 C  }8 H
    学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。
    5 `7 f- X2 y6 p
    ( r* Y, B; P0 X7 Z% U9 |! y+ MMNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。
    # F0 a/ `; }& J2 E# O3 Z# R, s
    ) ^# _8 T4 o$ d; U导入MNIST数据集
    2 o0 K! y' q4 r0 I
    / E/ W% `$ E9 W3 Y& g5 A& p# Loading the MNIST dataset in Keras
    - ~/ s! Z6 n! t* A  Ifrom tensorflow.keras.datasets import mnist
    4 A3 x. m5 @! l7 F1 M! S0 O(train_images, train_labels), (test_images, test_labels) = mnist.load_data()' L4 ]* K. r! I* `
    1. k3 V" |( y0 ?8 M
    2
    4 b# ~7 F: i: D34 i* \8 K) V2 m/ J/ U
    看一下训练集:
    6 H- m( w- |# g2 U- P
    " v' Z8 t6 c8 E; u3 Cprint(train_images.shape)
      v1 L4 ?# M7 [9 e+ i9 vprint(train_labels.shape)
    ! Q' p8 I: P. j; ]3 Jtrain_labels
    2 {/ R- c3 D8 T- Y& Q1
    $ ]2 ?, o7 p  K/ m. V1 w( O9 t2) J2 _, I7 I2 g+ [, b6 D6 o
    3
    3 t( Z  d" M% p3 P( W5 z输出:
    7 Y1 v" D7 _, `! V5 |. a5 Z* K+ |% d5 L2 j4 g" D
    (60000, 28, 28)
    - n: }% ?4 v7 h* d( R1 N- U! b$ b(60000,)
    " C5 s! r0 b4 t3 Y" q* ~( F# X, [7 @+ k! |
    array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
    - b* C) M3 P) ^- I# s; u1- x9 _7 s/ F3 `: A! s
    23 }# s! g/ g; o; E+ j+ M
    3
    / _% G" w* W; H5 v+ ?( b, |4; T, f2 I" U& t$ W9 y2 t8 X
    这是测试集:* c. f8 ^+ v# m/ N) b" k+ ?
    0 u4 d8 a( i9 ]
    print(test_images.shape)4 ?/ k( V. P6 }( N
    print(test_labels.shape)
    9 {/ M0 B; ]1 c4 Ztest_labels2 G( ]4 s; {0 h  q
    1" v' Q& b6 w5 t" B! K, M2 M
    2
    4 C! X1 k, x" h5 V3
    ! K) K1 |! H5 ~8 X* y/ v输出:. q1 Q! v/ r$ ]/ e. Q% d
    2 C1 X) p1 _/ K! c- {; A5 B2 j
    (10000, 28, 28), M$ l/ N1 a8 ^* l# U
    (10000,)
    ( u2 y1 s4 O0 `' G2 J
    6 s0 W' d2 r- ^' T+ W! j% farray([7, 2, 1, ..., 4, 5, 6], dtype=uint8)% O5 J$ `  `0 c' v- Y6 \
    1; `4 x4 n! ^0 c% C: w( V( I* x
    26 ^: w' ], [- g: T1 `" }
    3
    . a& f! P. q( u& O* ?- ?9 ~& }4% B) g8 M/ H- G, \) P
    网络构建. L& M  H7 ]- t0 V. M

    1 s6 O+ c7 M0 O3 c5 f, }; v& x' A我们来构建一个用来学习 MNIST 集的神经网络:
    7 Q2 ~  d: I9 H3 l' {- o8 Y3 g% g4 N$ o# a- `
    from tensorflow.keras import models% ?4 u0 }7 P; S5 K4 T& k
    from tensorflow.keras import layers- \5 {$ H# g5 T  p
    9 f7 W% {. f0 X( ~& T. `" R
    network = models.Sequential()
    - e6 s5 V) m5 O( V. Pnetwork.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))
    : M0 f9 C  [; b, Unetwork.add(layers.Dense(10, activation='softmax'))8 e9 K9 x7 g5 L* j0 l% v
    1
    4 j5 ]$ z8 f8 O+ S1 V9 f25 j- T4 G+ \, _5 H6 Y* d' F
    3
    9 d, b" J8 I: i* D& P4& y( s7 V: U" q0 ]$ Q7 n* ]! E" |% c
    5
    % l& m; @7 r/ n4 T5 q63 S, e6 |% s& B* m! Q/ o2 h
    神经网络是一个个「层」组成的。
    $ ?8 u+ ^- A% G9 \8 L# F一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。2 t8 I$ F6 i" L. m

    2 {. C$ E# h6 f5 m! q这样一系列的「层」组合起来,像流水线一样对数据进行处理。( Z5 z2 G' L* J; D" N" A
    层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。5 O! S) c1 M% J0 ~" d9 }

    + D% m0 u. R: v: Z- \$ w我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。
    , ^( e- T5 ]  d1 E) W; Q8 C9 t) @1 Z' I  u
    数据到了最后一层(第二层),是一个 10路 的 softmax 层。
    " {7 P4 c- _- Y; t这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。" r4 S2 S  B3 v
    事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!
    9 W) |  _1 @& a9 R: m7 p7 ?4 M; ^& i( {$ ?$ a- w) y
    编译8 D! t9 k8 W' l; _' M

    ( }$ w+ L) M2 E5 J# r! s( p0 K9 ]接下来,我们要 编译 这个网络,这个步骤需要给3个参数:
    5 h& `' V+ f, g9 I+ E
    / W1 ~6 r1 v, k" ^0 e3 `损失函数:评价你这网络表现的好不好的函数; D0 r6 d9 b  C/ Z# v& `6 T
    优化器:怎么更新(优化)你这个网络
    & j  B2 Y: w  U6 d训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度( a4 ~) b( p9 U7 z0 a, R
    network.compile(loss="categorical_crossentropy",: x# L. y1 u2 y* g. F
                    optimizer='rmsprop',, J: e0 x8 `: z; Q- ]" M# T  t
                    metrics=['accuracy'])! x  K6 X' {$ X& F
    1# a/ M; Q- y6 v+ y- E# Q/ P
    2
    : Y4 H. E3 ^' L& |3
    3 ?5 a  s4 v- x3 I$ w预处理
    ( d2 I; l6 l: U( n( d9 V) k8 Y- A3 m* c, I- L- B
    图形处理
    2 m' \# c+ H# \! P7 K8 b& M- t
    1 Z4 t$ H/ |2 o& d* z$ y" O我们还需要处理一下图形数据,把它变成我们的网络认识的样子。
    + a" y# J2 s  ^  _; s
    + D: `: D3 A  V; N/ bMNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。" m2 y+ B+ q5 t; A/ e2 s7 J
    而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。
    . Z; y7 n+ H3 o& ?8 a8 D; ~2 A( D1 M+ q
    train_images = train_images.reshape((60000, 28 * 28))
    - m  F+ A6 [& Rtrain_images = train_images.astype('float32') / 255
    $ l$ A, K+ X" b+ t9 W5 ]/ O' A
    ; G/ o, K! V2 J" H# |test_images = test_images.reshape((10000, 28 * 28))
    % ^4 @  M' n+ v3 d& Z3 ?test_images = test_images.astype('float32') / 255' ?6 Y: V$ Z0 y
    1. e+ X3 u+ h3 b
    21 |% H1 O2 @, ~' S0 s
    3
    7 o5 F- S4 k8 ?; s# a4
    . B; k% E: S$ z& @2 C7 b5
    , g% J7 B5 |& E2 j8 H标签处理
      ]9 d3 p: N+ S% |
    - |: P5 G* D# c同样,标签也是需要处理一下的。
    / [1 f0 y; Z- j- j5 ?. r
    - Z$ h0 d; V% x$ j/ }  jfrom tensorflow.keras.utils import to_categorical! C0 w$ e$ m3 f8 o

      z9 L% m% O, g, |, d. Otrain_labels = to_categorical(train_labels)
    8 l, T& N% T9 j8 W- X) D! M2 Ctest_labels = to_categorical(test_labels)) q* `; m, P4 }# F
    1
    - g5 ?' s1 K1 q, [  I9 h, c2- B2 b/ i+ w) Z3 S; d& d7 E
    3' l) h( {- o0 z  e# T! d, Y
    4* D2 `& m+ z% q1 P: }9 d
    训练网络
    # s5 T( H. W7 O2 g# z* A! Y
    6 ~' K7 s/ [& `, A/ t  ]# Tnetwork.fit(train_images, train_labels, epochs=5, batch_size=128)
    * m# L$ v0 u, B/ j7 Y1
    ! B- i- I, [5 |" W) B输出:: w. F5 {7 z4 V8 |5 w, U

    ( F7 J" `3 C6 d4 z9 J) NTrain on 60000 samples2 z) T- G1 M: v  [9 P* r9 J9 U9 i* y
    Epoch 1/5
    ; G' E# A, Y* [. v) [% I8 E( ~# T60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254
      B4 Q! K1 k8 T2 n* r$ OEpoch 2/5
    . ?6 c  T! s# \) u( O* i: w, {60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693
    ) z8 i* M2 Q% j% W% m0 ]$ eEpoch 3/5
    + v0 i& {$ V) |" d5 Z60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800- S1 @/ A; Y# j( v
    Epoch 4/5
    ! @6 X: [  y, m7 g# G$ [, P60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848+ ?4 I9 p& T! {4 ^9 x, z& U
    Epoch 5/51 ~' f% W$ ]1 P: D- B1 q# u
    60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888
    ! N7 w9 r$ {. {: E6 Z% ]7 W9 j' [1 e" \/ k# F) C% W
    <tensorflow.python.keras.callbacks.History at 0x13a7892d0>
    : n0 ~' c; x8 g) u- u( o, J, \11 M* t4 n6 x9 y5 K3 Z$ _
    2
    ' l, c& l: V8 ^- l, h1 S  U8 N! i. q3
    4 {6 C6 q6 n: j3 Q  R/ G' h4
    " Q* s1 k8 @& g* r- J) ?' T5$ T; q* K9 B) l% s+ ^
    6( A7 \) n7 M6 D# U: ^0 b
    7
    $ g7 k, l* D( V# n( Q, d7 J8
    6 b3 N& p8 f; z" U. B) k* z9
    - Q' q# x! L' _+ n# O% r: r) r# J109 e7 v/ l4 _$ q9 j& b
    11
    7 G1 |: C1 R# O/ x' y12
    ! o0 u4 r; @2 p; p1 s5 P' A# {13
    * g% c; U$ d/ _/ K. R0 s可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。6 [+ }  g2 u0 A' p1 d( `
    * o3 N. P5 t1 p- K/ D) }
    再用测试集去试试:
    % b1 d: e' m( H6 Q2 R% H5 ?# K1 M8 y  P" H7 \6 Y2 M+ D8 m
    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/322862 w, g2 k2 ~$ j
    print('test_acc:', test_acc). T1 q3 H9 f" p  G
    1' g0 ]3 \& ^" I$ w
    23 c9 E9 N- g; z2 \& D
    输出:, y5 t! y5 o6 ?: h6 v, E% C

    2 h  R: v4 c& V8 ^( P+ W- z9 I5 N10000/1 - 0s - loss: 0.0362 - accuracy: 0.97890 v; Y) l/ p6 Z# m/ {. x
    test_acc: 0.9789
    & Z" G+ c  g% b7 i0 [( n1
    . B/ i, J  D4 Y9 d/ y2. {8 {$ p7 _4 {0 ?5 `7 E
    我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。5 W/ J) ]& X* ?4 E+ ^; m+ h, F
    6 V( J0 E% V- `* o. H& Z
    神经网络的数据表示' k& t9 |0 i" Y

    7 I1 V. D: N- R( |. G1 KTensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。* n8 A; h9 \: ?, B
    + z6 r2 a! a; ^+ ~% H) f3 m) ]
    我们常把「张量的维度」说成「轴」。" L2 n( e; R' ]# e$ F, Y8 `( O8 I3 D# u
    9 S  I. A0 A- J0 Z" X
    认识张量# \3 A) I) N- i+ H$ F* S7 E' R
    # Z0 x5 ~  }) k; a$ m0 B
    标量 (0D Tensors)5 p/ i9 o; h/ F& o% o& O

    ; s6 ~/ f0 }5 |  TScalars,标量是 0 维的张量(0个轴),包含一个数。
    7 T% c/ v$ c" ^5 o- o8 ?- f$ N0 D" L7 R( m# y$ e
    标量在 numpy 中可以用 float32 或 float64 表示。% |. x+ K. s+ I' @# t  f% z
    ! _6 ^0 ^5 E& X; B- j- W) g" K
    import numpy as np
    6 v" ^% y* x; ]4 Y- [2 \. \* b) R% D  ]# `4 y8 K4 v0 ?& }
    x = np.array(12). \. u- y) d; p9 ^6 m( u  l
    x
    # v! g! `. o6 L' i% @9 w1& T' l& y- {7 b* [8 Z' K0 ?7 x
    29 T2 K; t. K# n+ v! ?
    3, y; Q" N: B2 D8 \3 C4 z" q% k$ ]
    4
    - T& U. ^# F! q$ H- ]  j/ d1 D9 k输出:) r: e1 m1 w$ ]) ?0 h+ d

    8 C7 B# U& Y$ J! s+ d  t7 m# sarray(12)8 ~' x5 i1 u1 [2 [  u0 `) l
    11 b/ U  T; x, m
    x.ndim    # 轴数(维数)4 T5 V+ V9 L8 F
    1
    + w. u' j. b  A3 t2 i输出:
      t, v0 G2 ?" w6 j% W9 z
    ( v" B! b+ f6 _. [# \! A/ w1 h11 Y4 Q( T9 w) C
    10 ^( ?0 E. c- }/ e6 T& v2 o
    向量 (1D Tensors)
    + z, `2 w; X8 l2 f& [) ^1 A8 ^) B2 ?0 S
    Vectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。
    , M% M& {9 `# V9 w
    $ j( W  F( d4 f- d3 d! s' d  Ux = np.array([1, 2, 3, 4, 5])
    ! K) T+ l, ?( V/ r, ~( l# S6 Px
    * Y  S+ N1 \$ {2 k# @1
    , ^& Z9 P5 ?4 t; X$ r' j2
    # O5 @6 F" p1 h$ i$ z3 v3 M! f0 i. h! }输出:
    & C* d  v+ V# J4 T
    # |0 U+ C4 D" n& }' S2 z' x) Warray([1, 2, 3, 4, 5])2 }$ N1 m( P/ Q& M8 ~  w  a& S- k
    1* D: Y1 t3 m* B3 H& ~
    x.ndim
    : _  Q1 [# T$ U7 B/ ?7 Q1' H% a1 N& ~% J/ U! a' Z
    输出:
    2 c* Z8 ]$ I( h0 d9 U1 g( m- V: |1 {1 O' T3 j# Y
    19 ?1 P3 {2 [! P- D
    1/ J- n, R; F/ t4 u' E  R" O+ u) x
    我们把这样有5个元素的向量叫做“5维向量”。
    8 ]! q7 F: r% o5 J6 i但注意5D向量可不是5D张量!
    % E. ?0 O0 s1 C( m& X/ |. W1 Y* K8 a" y+ A2 [, q
    5D向量:只有1个轴,在这个轴上有5个维度。* x7 @' q; B9 ?: p6 |- j5 }2 r
    5D张量:有5个轴,在每个轴上可以有任意维度。0 v  o: G7 [3 ]
    这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。
    ' c, ?$ M) E1 E7 |  L, ^% w, a/ ?8 ^4 _6 B! c# r  p
    所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。
    % B/ P! s$ L. h8 v+ |
    ) B$ g% m' Z. J7 N# w矩阵 (2D Tensors)/ y/ W4 c" l3 y+ l( b) b' m5 q, p

    ! P! S; r: @, H+ t( ?% h% r, gMatrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。
    # k, [4 ?; Y& x+ P
    * V# l& ?( L- V! I1 Y  ]% xx = np.array([[5, 78, 2, 34, 0],# d3 _5 K+ y) W" @" _
                  [6, 79, 3, 35, 1],
    0 F# g$ U4 T+ i              [7, 80, 4, 36, 2]])
    * j; J/ b6 j' O4 F& s6 px
    ; _" A  Z# z: U6 N1
    $ y( L4 c* k7 h- @' W4 \2
    ( ^& o; V' r" `# @" z35 d, }' d, j+ @( `. ^/ R; w0 n
    40 g/ w7 ]  Z# Q! u2 M6 l& o
    输出:5 s. A) k( f9 m4 w* F7 Q( f2 Z
    ( V3 F1 A- U7 i
    array([[ 5, 78,  2, 34,  0],
    9 `: N$ j' Q6 q$ ~: U. c5 g       [ 6, 79,  3, 35,  1],. h3 X. Q% y/ A- G# C, t! J/ X
           [ 7, 80,  4, 36,  2]])
    % g5 f% G$ t7 Q" A! Q  r% G1& v8 o% G! m2 t6 }, j4 A
    2
    6 H& f+ x+ F* V# [7 {* c0 L3
    ; n' E% m# W8 rx.ndim
    $ q; m( T1 m8 b5 h+ V3 _1( P0 H0 e" l# f, e0 e0 W; g) D0 P
    输出:
    # w  E7 ~3 I0 M( H& ~
    / J  [  _, x' n( i$ j' W$ j8 b2! s# @3 {8 |+ }3 o& Y/ l5 I% ^
    1
    7 Y6 S6 ~3 B% g# `2 }- x高阶张量
    & D' _- c9 z7 Q3 [. e1 Y7 `% B8 s( v; C  i! E* l) s- \
    你搞个装矩阵的 array 就得到了3阶张量。
    . m( E# j! ~- ~
    4 `3 V! K" k# n/ i- f再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。' t" q8 ^& y0 H3 ?* @' T' P7 \

    ' a0 `% x# o& }; m+ H% R; nx = np.array([[[5, 78, 2, 34, 0],% I7 ^9 [9 \9 P* L4 ?. M$ \! _3 R
                   [6, 79, 3, 35, 1],0 q' ?' M# Q" _) \* T$ d: U0 |/ U' }) [
                   [7, 80, 4, 36, 2]],
    , u7 m% D9 b  k+ b, y6 {              [[5, 78, 2, 34, 0],$ k5 C/ E. _" w2 g6 ]  x" O2 m4 j
                   [6, 79, 3, 35, 1],
    % C0 T0 M% s) I) d/ X               [7, 80, 4, 36, 2]],
    3 m9 u% G' n# D- a; t              [[5, 78, 2, 34, 0],
    2 \( H  d- K7 T% S4 Q, ^( G/ e               [6, 79, 3, 35, 1],! v$ B9 f0 l7 X" a* d$ [
                   [7, 80, 4, 36, 2]]])
    ; Y* l; N, D2 Y5 }& X0 B7 q, ix.ndim
    ; V6 F- j5 H* ~( ?2 s13 x0 ^/ V$ v) i) @  x! @: E
    2
    ' M+ S& \5 ^& J/ P* b0 S3
    + r; Y& g5 Z3 _$ b/ m0 P  \4
    " w- |( \6 _) S  D5
    + }% _0 o  @" D5 [6
    % e) v0 ^: Y" y. T# o4 o7
    - _+ X! M* d2 g8$ c/ `# W8 @- o: K
    9
      |; H& o9 N$ j- c6 O10
    ; Y% z! z- U6 V" K7 W- p! ~1 _6 F输出:: W' s1 y% s& S6 ]$ b: x, u$ Y  H
    7 J: h7 W: q3 \$ X# j
    30 c$ [0 u( u1 R  b
    1
      k6 A0 Q! |, S" K0 P3 {, d( @深度学习里,我们一般就用0~4阶的张量。4 l2 {, B# \/ L" L" u* Q; ]

    ; ~1 W: h( L8 L! I0 m/ T; @张量的三要素4 D9 Y& k2 e1 q8 J/ E5 s
    . Q$ w0 t) t' X" {8 T: I5 U
    阶数(轴的个数):3,5,…
    ( U+ P' d2 d* |! U$ h6 @0 J+ E* u形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…
    ) I( h# W8 Q0 b# G& a数据类型:float32,uint8,…
    3 ~: _8 y6 Z( q+ [' I, b% P- N我们来看看 MNIST 里的张量数据:, Z( I+ H) ?1 D2 s  Y

    " B; M- W' m; [* `) s0 h/ d5 ~6 Bfrom tensorflow.keras.datasets import mnist
    7 N: }! e% _2 Z! p; D( p7 l" b+ Y+ L(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
    7 U, U0 A& t6 H( K8 x! y$ ~( v8 `( Q! ?8 W, f- S5 ?
    print(train_images.ndim)
    . d7 e: l) U# Z: Rprint(train_images.shape)2 r4 D$ I  v; p* [! j9 f  m; @
    print(train_images.dtype); c) E4 I) o/ C
    1
    # h! V; n% f0 h. B! }; c2
    1 m9 r; L1 C8 f) f/ I5 o3
    " S1 I$ d; d1 }4: \7 r5 b& ^  C1 H7 c" [
    57 f9 s: p7 ?7 K1 o- @6 p- [
    6
    * o% N* n  O7 ^输出:
    * R- m% I# _3 d8 `3 p4 e: F- F1 M
    5 \7 `1 g& _# A8 I' c3
    ' l+ m* ~0 @3 ]5 G(60000, 28, 28)* D  Y; M% v, s& U
    uint81 I: U* }, d2 L+ r
    1
    0 a+ I" l% X3 R3 C" p2
    ! j) f- A8 o; D" V9 M/ Q  s3
    1 n" x& l  ~+ ^% p* V7 A所以 train_images 是个8位无符号整数的3阶张量。( _- s, b+ l. x* ~/ o" K2 k
    2 u7 a. X0 {3 Y8 ~; j# _( s2 v- Z
    打印个里面的图片看看:% u* X1 k& }0 Q- \
    0 s, A' Y2 e. E: k5 v4 g/ y& Q
    digit = train_images[0]  F. z0 f1 I% Y1 h, V/ b
    # L' V) f. i# j3 S5 R
    import matplotlib.pyplot as plt
    8 U  C) U) j" b. t0 N. N& G6 U/ L
    0 H' N  R  b) q9 V! a5 p) k8 v" Jprint("image:")9 S# `& r7 _, ]9 B
    plt.imshow(digit, cmap=plt.cm.binary); O8 l/ u$ h/ t. m- f: }6 j
    plt.show()
    ! }/ _- ]7 p/ ?5 Jprint("label: ", train_labels[0])
    . u) z) w2 C9 F1+ J% D0 Q7 p/ A* Z
    2% {1 y+ m: j6 U0 t& c3 A
    38 ^1 o1 `4 i3 O7 Q; P0 v* p
    4
    , K/ ]; t. s0 H3 w0 F; B0 t5: P, W! }5 ]+ e0 K% g+ [2 Z7 V
    6$ r6 P- X& b. g' h2 E
    7
    : `" Y% U. {0 R, v3 d80 U1 q5 w/ a, C" Q6 h5 b0 r
    输出:4 M8 t1 c+ n* `8 M% s8 o2 d
    ) n* M- W( ]  z7 D! D& C+ `& A
    1.jpg
    , o2 ]5 M: j. i& B
    7 O, K; Y$ j% _3 Z3 J, N1 \label:  5
    $ K8 i" T* `/ L# j  W; b  ~% b6 q1
    8 S3 D; P* y% h( `& UNumpy张量操作
    - t- m* c/ @' K1 y
    * v; v  I$ v- f- `! H0 d9 g张量切片:
      r! e, S7 q) ?4 `3 q' I
    " \+ h% \4 g. a; {! Amy_slice = train_images[10:100]; [2 v1 z4 s% O
    print(my_slice.shape)8 m: q4 D' y( l7 w& ]0 a
    13 \  z5 c' E' s7 {
    2' A1 A5 U; E: J1 w" N2 d2 E3 o0 n5 M: S
    输出:
    ! K; O/ E, ^# b% V5 U; c. Z5 n 2.jpg
    + p2 Z4 C8 ?4 ~+ e# j0 M! H(90, 28, 28)9 e) f- K8 B$ H  e  Q6 W
    1) s8 Z1 Z6 K. C6 R
    等价于:1 k2 _! f4 c# |( r" X
    ; b$ z- r7 P7 P0 Q8 O, ?. y) c
    my_slice = train_images[10:100, :, :]
    5 V/ ]; t6 R8 P8 d; l& Y/ }print(my_slice.shape)
    ; G# X9 T+ [* c& x1 B1
    + }, R* Q/ {6 _8 j; ?# G2
    6 a5 Q+ v. B" W# ~0 B3 v输出:
    $ _3 @5 x6 y- C$ {( U! R/ o 3.jpg + Z+ O  u1 L1 z8 Q! p
    (90, 28, 28), U" n' E' n8 N- T; o) q8 [# s
    1
    + m2 }/ S4 r) o# g' y, ]也等价于3 x/ k4 J  S" `. \" m' i4 b
    ) n3 Q! v* G, W5 C3 ?1 i1 e
    my_slice = train_images[10:100, 0:28, 0:28]
    ( f$ y: S7 Z, Mprint(my_slice.shape)$ `. d3 F  J, Y; f; v
    12 E) h5 @7 A: L9 Y+ _
    2
    % Q( s: P3 l  U$ j: @: I% H0 [输出:* D" s- Z+ \- ]6 A. V1 B
    ' v, I0 R% I9 A. D9 y$ C# w3 Z
    (90, 28, 28)2 ~& |4 h( f, O1 [4 R  ]+ I
    1* S8 K/ P: v; }) A4 P  \  B
    选出 右下角 14x14 的:
    # ~. v; v; \9 o! z" C2 {! d$ }1 s3 E! N% ~
    my_slice = train_images[:, 14:, 14:]: {7 V# W" l% b' `
    plt.imshow(my_slice[0], cmap=plt.cm.binary)
    0 `, \- P' P- t9 w. F& U4 D0 fplt.show()
    , _3 J2 S! I0 e  g" Z) {9 b1: m; C* w& y% ^" {% C
    2
    ) R( R1 X  Q. x& Z: ?% c4 A5 R32 K+ l* Z; U; \8 A0 J/ X, o+ g3 B
    输出:
    + d" J! H1 e. d) J" o1 b1 p+ O; I  @3 S* m. t$ N2 n( s  H& l

    0 k! a2 U9 q7 n0 L3 A" e" Q
    - E/ [& E' _- n  s. @3 [; j选出 中心处 14x14 的:* ^0 [3 x2 O7 {' z

    9 C' _/ P9 e( \1 E) V' g, omy_slice = train_images[:, 7:-7, 7:-7]
    : @/ j7 B: J- u+ x1 r6 l& \5 D4 iplt.imshow(my_slice[0], cmap=plt.cm.binary)( l( r: Y0 b, {2 O/ P
    plt.show()) o! N' Q! t* O5 A
    1/ B7 ]& ^% w5 u
    2
    # j' d# p. i- F  R. D; {- O4 f31 F% D6 @9 Q9 A3 W" n9 G: N9 W
    输出:2 n$ V! t6 f# c8 h3 v0 @

    4 E$ D5 ^, @& F6 Z% K
    9 w% [5 ~1 U0 @+ i
    5 I& y: c' K: ?数据批量
    5 {( ^) |2 \3 @  k+ ?  ^+ D" i5 t0 Q5 T8 W' W0 U
    深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。: Z) C0 P, r* I) v# v
    / v2 K% N, g8 \/ ?3 e6 {: y: O
    深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。6 b# t$ j. ?) M+ C2 @

    ( E& W+ v$ o7 S$ b. a4 y. M在 MNIST 中,我们的一个批量是 128 个数据:
    4 R5 R/ T  k* d
    + j. o( {% x( G' O8 m9 |( U9 W3 u# 第一批5 M4 X# U' ]. Z3 x7 S% x4 W$ u
    batch = train_images[:128]
    5 M1 T" c8 ~# ?- H# S1 ~* V# 第二批' J# b( `2 d0 J8 F5 F! Y7 p+ k9 l" y* w
    batch = train_images[128:256]4 V7 N6 E5 R7 Q
    # 第n批
    3 F+ u3 X; U/ J0 f- kn = 122 m/ Y- J" o9 z6 c$ u6 }8 D6 H) A9 g
    batch = train_images[128 * n : 128 * (n+1)]; n, z$ K* {" ~# i! X5 S
    15 y1 C9 f1 Z2 Z" z
    2% }8 J' S: L2 [) @5 a) Y
    3
    # J& v6 \! n6 G# b* I4* g, X; p/ \' l" A$ o
    5& ^& M6 f1 ?0 S6 l
    61 m5 ~  B" ^1 C& S% G! w- e
    7
    5 g% H( z# k6 s3 f. W* A8 }所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。
    4 M# u6 E, Q0 u" V- y( d4 `  c  {
    8 _" U9 ?8 h0 \' M- u常见数据张量表示
    ) g5 f& G, M( j7 {4 x4 P
    3 J4 \  }: R  s! s, t8 m' k数据
    " p' L1 g5 I4 \" ~, z
    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-3 02:14 , Processed in 0.457532 second(s), 59 queries .

    回顶部