QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6606|回复: 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; \) M/ S( j7 Z; y9 S
    Python深度学习之初窥神经网络
    # J! `% v* K) D6 e; [本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。
    ; W9 U- F" ?& B0 i0 r( ?# A& ?4 Z/ s$ t
    本文目录:
    2 c  P1 G+ s+ ?( F$ o
    6 u4 W' z4 j/ Y6 f8 T5 ]3 L文章目录" H' \0 G: F/ M" Y

    9 y# M1 S9 R, a: Y" m5 iDeep Learning with Python/ e* H! Z6 i8 o" }
    初窥神经网络) H+ Q9 D2 N  h1 O) Z- \
    导入MNIST数据集9 x0 u( v& c. V. V8 t9 S
    网络构建
    / h- r* y, ^* h& K编译
    - e% ^: i1 I! v. G) e* f0 r预处理
    . _/ x) Y; {; |' i图形处理
    ! M  L, }7 o5 X标签处理/ n* r- u& a+ V  A
    训练网络
    - a, i% A2 f& H+ u9 i2 ^% n神经网络的数据表示
    8 E0 }' M* c. f7 B9 w- t认识张量, m& V% n$ E1 z2 p7 |& {
    标量 (0D Tensors): W; D* w5 E8 v
    向量 (1D Tensors)+ T2 z5 B+ U/ i
    矩阵 (2D Tensors)
    # [6 x6 J; E6 q5 W5 K0 N高阶张量+ a- X) p, i2 Y1 v& `
    张量的三要素
    : d: C! _: n3 d1 }) N) P) ONumpy张量操作
    9 t: ?0 c2 _1 W! F) C- N) g张量切片:" ]1 Z4 a( {7 N& b7 d1 T* U- u( m
    数据批量
    . b' d4 Z# s1 q7 @" o5 K常见数据张量表示2 _% d0 Z; `8 r9 u  i
    神经网络的“齿轮”: 张量运算
    0 _) i# K. h% }: V2 _逐元素操作(Element-wise)2 o0 Z8 i5 O* R2 {& b, F
    广播(Broadcasting)
    # O$ Q, p# A! M. L- y! H张量点积(dot)- q. `" d1 Q6 y/ {- @
    张量变形(reshaping)& A2 p7 K3 @* u5 _! U
    神经网络的“引擎”: 基于梯度的优化
    . ~9 A/ s% s0 ?5 X$ h# @导数(derivative)0 W& G$ w7 X- l; }' G$ S: d3 J
    梯度(gradient)
      o- y2 v' M, @5 F随机梯度下降(Stochastic gradient descent)
    % t4 P+ r& F* ~反向传播算法:链式求导2 ]) ^: @% |2 q& a: v0 V
    本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。; w0 z$ M& N  C# g! z
    - d$ s- v1 ?* `! A0 L, }
    初窥神经网络
    , V6 l! u: g5 _2 h8 m: Z/ n( z0 e: Q* I* E/ S
    学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。
    " Z7 j! T4 ?+ s+ k% ~) G& R0 ]# F$ x3 J2 K2 p  c
    MNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。
    - b; I* L. ~! N' ]9 g5 Y, O0 J6 D+ f* D- V+ e/ y& Y
    导入MNIST数据集
    + o  {, u9 y# K5 S* t& @+ b7 y7 a4 T# N0 s
    # Loading the MNIST dataset in Keras
    & L/ C1 F# g: p% ~8 T& E6 ^$ Tfrom tensorflow.keras.datasets import mnist
    - P0 C" F* k  B- h, |* A% Z% A(train_images, train_labels), (test_images, test_labels) = mnist.load_data()+ v7 i7 X. Y. g! E+ t
    12 g8 U$ N6 [' G8 V
    2
    6 K# e2 a6 c$ c  N  [+ E. E' L1 h32 T( b" C# U- ?5 I% _& X. C+ ?* U) z
    看一下训练集:
    ! ^- Q1 X% ~3 j: \. p7 j
      d# T; Q- d5 R7 }print(train_images.shape)
      D% W/ H2 M; a/ Oprint(train_labels.shape)* }- A1 I0 @: _
    train_labels
    . o- @+ T2 `" l* r% A11 D1 @5 s* P5 q; c( A
    2
    $ g! b2 I5 j: K6 X; J3
    2 k$ m. m1 c$ o  `输出:5 O4 z, |$ ~  O$ f- F5 j1 F
    ' l; H6 ]) M% g; G: l; H
    (60000, 28, 28)( z4 `# U& ~/ D& A) k0 A
    (60000,)
    - z5 O& D7 z/ n! R8 @% P
    - {# L) e- @! u" c1 rarray([5, 0, 4, ..., 5, 6, 8], dtype=uint8)" p( N1 `6 B1 m/ \! ^. B( ?
    14 l7 b# K& I5 r! j
    2, n7 d" R8 L- w0 B8 `) s9 f6 q
    3% h" G* g2 K* m; U# ~8 V1 l: Q
    4/ N9 p5 X9 ?) n6 }
    这是测试集:
    # L  d6 ?- _6 g# l
    7 X1 e- A- ?" G; xprint(test_images.shape)& f" E5 G+ T0 a! l; Y' ^
    print(test_labels.shape)
    9 A" S  W3 a/ Y! N9 D' `. M4 H3 T- ^test_labels3 b5 i4 M. p! I9 H7 Z3 f
    1/ l* \) ?! r* H
    2
    8 v4 w3 U  B0 L3
    4 x' {% y: ?' R* C输出:
    " ?$ l: F# [  @& M8 Y, n3 H2 Z# A$ g8 [; E$ p9 ^
    (10000, 28, 28)
    2 B3 v% F/ u' j' g! N& I(10000,)
    ' h  @% ^3 d7 |; z  `; s. J$ o
    4 R) C& u; _. w: I& O# g# r, rarray([7, 2, 1, ..., 4, 5, 6], dtype=uint8)
    9 p1 q5 Z6 S, Q, Y/ N' k3 P+ p15 ^0 B- ], r0 |- Q5 M% [5 y' |) L
    2  b4 R" f: P: E9 k  N4 t3 f  K: T
    30 ~7 P! o8 R+ o: ~3 ?1 b* s
    4% C0 B9 Y7 {: C
    网络构建% |* |0 o& K* b/ j+ @( y
    6 I+ E* ^7 C$ g! S1 I
    我们来构建一个用来学习 MNIST 集的神经网络:
    ; S  ~7 O# [6 ^6 Z# q
    / P5 I+ A0 N; _6 [from tensorflow.keras import models
    + J  P( B7 d& Efrom tensorflow.keras import layers. s5 O4 @+ @0 i4 S6 x5 x. M* ?
    6 @9 g4 Q4 z" z+ E: Q
    network = models.Sequential()
    0 \5 d; I0 \, t( n0 ^network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))3 `" c- K- c, _* m' H4 a
    network.add(layers.Dense(10, activation='softmax'))1 S. c" j+ z; ^( B, p$ d% E
    1$ L8 g) n6 [( ~  ?% Q7 L& V
    2
    6 c/ T2 O0 ]1 }31 o+ w; i" k0 Y/ B, Y/ H/ Q/ r
    4
    * j$ ~& F. r$ r7 x2 L5
    0 U4 s6 i. G% C4 t7 @$ T# h6# z# J: O) H  t$ E# P
    神经网络是一个个「层」组成的。
    2 p4 G" I" k7 r9 w% I+ v: |* p一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。
      v% ~% q) h" u+ O# o- n
    # K* p) ?1 Q" ]2 W这样一系列的「层」组合起来,像流水线一样对数据进行处理。
    ( B# N* }" J1 d5 @9 N" x层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。
    3 O7 E. o' B4 o  s) Q8 X
    % u6 }8 v5 }* e; ~3 d6 W- Y& t: d我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。
    % K1 X" [- e# E/ G, p5 V) H+ f1 m8 r) v
    数据到了最后一层(第二层),是一个 10路 的 softmax 层。/ c5 B6 V+ x/ W
    这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。3 M( j& p) k/ o5 T6 G
    事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!
    5 U9 ?+ W2 U) r9 f0 E# M+ n* c) b( X6 l
    编译
    1 _& Q# v1 S! H6 v8 q
    ' y! g  I2 h: s" o7 w0 l7 _6 ?接下来,我们要 编译 这个网络,这个步骤需要给3个参数:6 _" d9 m& T+ Q; @! b* V
    * v* I# Q) o$ j. R
    损失函数:评价你这网络表现的好不好的函数
      a. [9 I8 N9 ]% l4 m1 B1 ?优化器:怎么更新(优化)你这个网络
    3 g1 \( W/ _. ^& u训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度& m4 s* a6 x: j8 x" b+ M! t! S
    network.compile(loss="categorical_crossentropy",& I- Y" {* v# V- B7 g/ t% m+ L
                    optimizer='rmsprop',( C& T4 s0 ^1 G- m' o# M) i+ }
                    metrics=['accuracy'])
    : C5 N, {; b4 Z- {- R# C1$ |* X- z; O) P
    2& C1 c$ U% H0 `* L! G
    3/ n2 i8 s* m4 {$ `! ?. y
    预处理
    % g" O- S) T& k: O! e# y
    4 i2 n1 d1 X3 f. d! N1 {+ T2 n* R% I图形处理
    % I+ V. E) T5 d: u$ e- d9 R1 L7 ]0 Y7 m% Q
    我们还需要处理一下图形数据,把它变成我们的网络认识的样子。- [5 [4 u! w; F
    ! F# b! Z, T& g! K" a2 P
    MNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。1 V! Z! {9 L( m
    而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。' N8 P4 V2 ^% s8 J' {% C9 s
    ) A( ^! T& w, x& K- l6 E; e# z$ |
    train_images = train_images.reshape((60000, 28 * 28))9 p* O3 S) i+ i. p3 q
    train_images = train_images.astype('float32') / 255
    ) ~: V$ t" U0 i6 N0 ~8 y2 P- o- ?  M: U: |# e. n
    test_images = test_images.reshape((10000, 28 * 28))
    7 S9 J, l* M5 Wtest_images = test_images.astype('float32') / 255
    , A; P% F  \* P  }$ I1
    / X' A* U1 ^0 P8 `2* M/ l- q5 @3 A
    3
    . R( t* y/ h  O: V! z" W4
    2 D4 I+ Z$ K* i4 _5
    / r" ~1 r' \, x* G标签处理
    6 P" F: a6 x" A9 v0 U0 v# u2 h  [) @' O; H
    同样,标签也是需要处理一下的。8 O4 v, Z% n- ~8 o4 h$ R- M
    6 q3 X# f1 L8 b, z- [, G7 b( ~/ o
    from tensorflow.keras.utils import to_categorical/ H' V; h+ G. D' U

    / P9 u8 x8 O- H8 {0 P- d2 ttrain_labels = to_categorical(train_labels)" I1 q% _2 P; ?8 k/ Z1 ^& C
    test_labels = to_categorical(test_labels)
    $ o5 C" j  l3 ?2 p+ R1
    8 |3 E' B) `9 r9 S& \2! q) c& a  u# `9 T& B; n
    33 U+ c( _9 r: r* w
    43 v) A7 w$ Q) X, ~2 K  S! Z* ?
    训练网络1 p+ j1 S( I; v$ |- d1 F

    8 U9 w- `* E: G% ?, t3 E: I* lnetwork.fit(train_images, train_labels, epochs=5, batch_size=128)) e! O5 T5 ^1 _& Q( n4 i
    1& \" D1 g  V  q! f" d- j
    输出:5 t9 V! c+ ^$ ~% @- n
    5 e) \: m+ h! x3 Q& J, j) H3 r
    Train on 60000 samples
    ! C2 u& l8 c6 c: Z7 d" \6 U$ M. \& gEpoch 1/5
    * w$ E( _6 v  q9 D2 Z60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254, \, V" [# r  p4 S; K( [
    Epoch 2/5$ v) n1 Z3 L2 g. Q! D( p
    60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693& [) F1 i1 o$ E1 I
    Epoch 3/5! |  t( J& ]) U
    60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800
      L8 r, o9 X" \, {Epoch 4/5/ A" P8 g2 @1 f* s4 a% G
    60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.98483 b+ z* c3 x  D" A- \
    Epoch 5/55 J2 N: u( ?+ x5 z$ z* [7 H
    60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888
    $ e& w& E8 t+ {3 {) t
    * r- a, f7 ~6 \3 G7 F- m9 e- z<tensorflow.python.keras.callbacks.History at 0x13a7892d0>
    / V  X( @( N0 Q$ [; V7 \10 N* P+ u3 K$ p6 y1 N( p
    2  _( u7 q. w, W5 p7 k: }& ?
    3
    9 S/ E! O6 h' r, h6 g4
    # w! s! D* h$ ^# a; y( t% a1 n0 ]50 S' z, Y4 B2 `* {  E& u( l) d: P4 T
    67 }+ K1 i& b" }( `$ P
    7
    0 J! a8 ^/ h0 m/ O0 B86 R# z8 ?( _- `0 }9 l
    9
    ; p4 o+ ^( w: ?2 h10
    + \! ]$ T/ R3 d& c3 ^: x! G/ R5 b11  Y4 Y# ^5 x% G6 Y# {
    12
    9 K: t5 @- G; o1 x; @3 n135 T$ d4 T  p& I$ ?
    可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。
    0 }' h& f0 K. @4 n9 C
    3 E! g! @0 |6 l+ g再用测试集去试试:
    ) U# n6 j# ?3 V* V3 n8 Q+ Z! B$ h5 k1 e$ g/ m4 L5 h9 u+ G
    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- k4 g0 V1 v/ W
    print('test_acc:', test_acc)
    6 \# t5 L; X- p1
    : a( \! H/ U, G, M- s5 q2 U2
    ) B8 y: d3 D. ^) i$ t输出:- J' `5 z  _- U( `; a5 X
    , k( ?: N9 \; j! j
    10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789
    ; o* Z+ `9 J+ c8 \7 _test_acc: 0.97894 i+ d4 Z! q% D1 G+ B! {' _# ]. @
    1; Q8 ~$ f+ Y# e7 |6 }% d
    2
    4 h* I  d4 |& E- A1 I% ~我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。' G" r& Y2 }* W. V1 D

    5 A6 o* [$ Q: j. Q. r/ p7 M+ d: E神经网络的数据表示6 ]+ H6 x0 B1 |2 M3 O, B2 s5 H
    5 w5 ~) W' c6 r& i. h; D6 k
    Tensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。
    + ^: Y! A  K7 o$ f
    / a5 Q1 A) Q  b我们常把「张量的维度」说成「轴」。+ [0 T4 r! z( E, D. G6 K% c- P

      y* Y5 V7 F: n  [4 ^认识张量
    & X1 P: e% A* z% _' }6 \1 Y6 s/ F' x2 \6 X% Z+ w& E2 `
    标量 (0D Tensors)
    0 E: d: I/ _% x* U! u' T1 T
    " z( d1 B/ y+ fScalars,标量是 0 维的张量(0个轴),包含一个数。# y5 R* z# V' D1 G. Q
    6 C( |/ x0 a" T( i' ]( Z; N- ]9 s
    标量在 numpy 中可以用 float32 或 float64 表示。, @' e4 [5 q. m1 ^- q. J3 Q% c+ {

    4 O% F# {- G  K5 r8 `import numpy as np- E6 u5 d5 z# k, d# L% C

    1 Q% W+ |/ i* q! W9 ?x = np.array(12)
    0 O0 s/ {) S7 w* Yx, L# ~0 u7 z% O$ p
    10 ?  w4 j1 ]) F+ B  T
    2
    " L, |. O5 m/ Y1 C- W& H3 V5 Z3( a0 Y1 K6 J; H5 V
    4
    * S* L0 c1 T" R5 q输出:$ g9 Q) H; {, y' ^) c- h
    ; f" f- K& L) \: j4 g: A+ I: Z: N
    array(12)
    / [+ X8 R! D6 l# Q1* L4 A" D6 |$ Z4 |! p( A% `
    x.ndim    # 轴数(维数)
    ' a% l1 Y8 u9 z10 c/ M7 P: L( N% S! @4 V) [
    输出:5 v* {+ R6 E) r+ [, ~2 x, A

    . J- B5 j+ S- L3 b1- z. g' o; W0 H% G
    1
    4 d1 F/ g/ T! j9 I7 v7 A4 e/ Q' A* x! F向量 (1D Tensors)
    8 `3 w+ {3 v2 e' x2 `# j0 a7 L& W3 M* C! u) s- J- X
    Vectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。
    6 r8 L, Q; i2 P3 Y/ Z# c4 \
    + g, Y! m& N& [* ~( lx = np.array([1, 2, 3, 4, 5]), v& r  R( d/ y: d  A9 T& n
    x4 l& W* ]  p1 Z  s
    1' X9 E; X( ?- x
    2
    ( J- y4 g7 x$ n1 v, k输出:1 @$ @/ T7 {5 Z
    8 @% w3 T" g  i! u9 D7 ^3 X
    array([1, 2, 3, 4, 5])4 q% d# F" h/ `
    1
    + U" `0 B% U( Y5 s1 Gx.ndim7 S/ p/ O- C  \$ S! p
    1/ ^6 E- x' i. Q, b2 O# `% _0 j; {
    输出:1 H; B, c2 k6 t* O) V

    . t4 l+ C2 k" w/ X& Y. x2 Q6 ~6 H. q1/ G; ?$ x/ B7 y4 F8 P
    19 w; Q/ i5 V7 }7 w
    我们把这样有5个元素的向量叫做“5维向量”。
    3 _0 x2 j5 D% i9 Z6 f% |- D但注意5D向量可不是5D张量!
    6 S+ z! C9 K9 m+ w( l( ]- {$ K
    & t" C& _# V  w- O8 Z5D向量:只有1个轴,在这个轴上有5个维度。
    6 a( l- t5 _3 z4 ?- F7 z6 {  z5D张量:有5个轴,在每个轴上可以有任意维度。3 G, {" t" l  `# c# `
    这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。
    8 ]8 F/ ^% g. u0 v6 q+ X# I" A- B, ^8 Y. @4 B6 p/ Y5 i  t
    所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。3 L& o" N7 c3 E% \
    " ?: G+ S" f, r9 p' H! Z, K; U
    矩阵 (2D Tensors). ?% A5 r2 n8 E" K5 \6 J% e6 h6 N! s
    ) f# g' m( r: N3 P1 G/ D/ l
    Matrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。
    & M# m7 `, _$ i' @6 e, |% x2 l4 D! }, k5 d& Z+ ~2 K
    x = np.array([[5, 78, 2, 34, 0],
    . i: z5 [+ |: D: q3 E8 J; E              [6, 79, 3, 35, 1],% t" S2 e( B, e5 N% J, S
                  [7, 80, 4, 36, 2]])
    3 }. L: O) d) mx
    * M8 [) a  v4 h0 p& B' E1
    1 n) g* ?" B9 }. r: c+ j1 {2, X/ M- B$ ^0 Q$ U* C
    31 d3 O4 i/ V# |
    4: m: R- ^5 V; G& r" d
    输出:
    $ x1 M2 W; g+ j3 p! o. X  [: I* a. y5 c5 k- m
    array([[ 5, 78,  2, 34,  0],' E0 @1 v' ]7 @1 _
           [ 6, 79,  3, 35,  1],; D  ~: U# T% M( K) {( X* P3 O
           [ 7, 80,  4, 36,  2]])
    : `6 d. j4 c, l# j! W  v1
    0 X1 |% K0 R' @& a0 X: l# D2. H" @/ O- z2 p4 K
    3) d& e8 }' Q0 G- Q7 B* X
    x.ndim
    3 l! g( q9 y2 n$ ]) p1/ e2 b2 e3 m, j% d5 Q9 X
    输出:/ y7 ~* J) Z  v( s6 k

    % n, l4 G  v. K) S$ a# E2
    : _% S. x  H4 g2 e# \1- `8 ^# D1 j5 B; y1 a* A
    高阶张量
    + E9 {( }: g- n) e3 e
    / F. W& x, E  q2 V6 S7 [& O& A你搞个装矩阵的 array 就得到了3阶张量。
    2 D! c, J7 {) a* n2 ]1 v- {/ N0 N+ ]+ H2 V/ b4 N$ H) P
    再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。
    8 r4 `- N# j% K3 ~' |3 r/ J0 Z7 l, T+ H
    x = np.array([[[5, 78, 2, 34, 0],  G0 X1 O, \$ ]) `4 u2 p, p4 x; i6 Z
                   [6, 79, 3, 35, 1]," D7 I5 j; c. b; S! z0 l* U
                   [7, 80, 4, 36, 2]],
    7 H' q8 k. s* y0 L              [[5, 78, 2, 34, 0],
    7 I* ]9 ?) x- {; Z8 k5 @: f               [6, 79, 3, 35, 1],4 r1 H" Y: ]3 n# ]1 V
                   [7, 80, 4, 36, 2]],' ?* H" ^+ C+ ~
                  [[5, 78, 2, 34, 0],! L2 _3 H0 _; G& e; p& b
                   [6, 79, 3, 35, 1],, ~0 l) g: @/ F6 h& t) [! Z1 m
                   [7, 80, 4, 36, 2]]])
    0 M; j$ j; y& D3 t4 I3 K, q$ S4 Wx.ndim
    . @" \' ^7 w8 [4 ]1& Z, q  U$ j9 S2 P1 R$ P
    2
    3 }8 {! ~5 x% Z3
    8 D8 z- n9 ]* Z! @) I4
    8 ~) F1 h( n) |; X# j* K7 W51 r4 [3 O. x; v6 i# y. k
    6
    3 a, f# |0 [; ^0 |6 ?' R- _! |8 J& i. Z7
    + H2 _" a0 G/ \& t* N) f5 S8/ r: z: t) S; [; e
    96 Y5 {0 y. }- h2 k3 P1 e
    10
    $ Y" ^1 _. T; P* c输出:
      r$ G" e. a! r$ |
    5 @" B7 U, _/ d# N# I& n" e( P" X0 t3+ X/ e" Z) p* b. q( r
    1" O0 p% T& W; J! U
    深度学习里,我们一般就用0~4阶的张量。
    & \+ ?2 h  O- ~! U7 n) C2 q9 D. \5 U. t  C  m- J
    张量的三要素6 V7 S* ^4 ]  ]3 c# t, a

    + x) f# B. }1 d阶数(轴的个数):3,5,…
    3 f9 r. q7 m" \, K, C) I( T形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…
    / D1 Z' Z$ }. l; Y+ n" \, s数据类型:float32,uint8,…
    4 c" g3 Q5 g4 G5 Y# ?; m我们来看看 MNIST 里的张量数据:5 x1 W  f" D. |- H0 L/ t9 Q

    % R- W/ h6 T3 k8 ^from tensorflow.keras.datasets import mnist
    " g! z" ?6 j6 z7 q' V(train_images, train_labels), (test_images, test_labels) = mnist.load_data()0 ^) Q. p: T. E" r8 Y0 q3 i: }7 ~

    , j" N* f" H$ i+ P! z0 V* F$ {+ cprint(train_images.ndim)! ?. `1 h6 y( V- k2 [5 y
    print(train_images.shape)2 L& V' ]% E" g& l; h2 `: x
    print(train_images.dtype)
    ( {. b# P9 u. R5 N# t17 R% y2 ~7 Z; l/ E; C, z
    2
    , x" C7 x7 m" w: q$ ^( j% B35 @/ g9 W9 {, D% Q, Z/ g" W
    4( B4 f; g8 {+ _6 p1 Y
    5
    " v8 a. s8 j5 D6
      h; W& j$ [; X输出:
    ; P8 f5 U) d8 G" }
      D% m) m) J4 b# c3
    ! w; ^2 U1 C. r' o(60000, 28, 28)* r, I0 b3 R1 q1 w8 d& _  l
    uint8- C9 y; c: s; v. R$ s8 s- x  N
    15 h* a: F0 f% T6 ]
    2: Y0 W+ e  J; S/ M) C) @
    3
    ; T6 {5 }: J! z& D. b- p# W所以 train_images 是个8位无符号整数的3阶张量。
    ' N4 I; \  s4 ~, r4 p
    ) |1 K- [3 N' ~; Y; w4 X; \) |: O打印个里面的图片看看:$ R; _* a9 c+ D6 ^* x. n% L
      }% b  C: z0 t: v" G) E
    digit = train_images[0]3 ^, Z2 U' N; q: B
    1 K; \" @( A" }, @
    import matplotlib.pyplot as plt
    ' L1 j3 |: Z) e  G3 I# k& U9 Q+ `# ?) b/ ]8 J' s( W
    print("image:")( q5 K0 k9 W+ t" R7 O: z
    plt.imshow(digit, cmap=plt.cm.binary)" A" S/ @/ @6 [" o: m
    plt.show(); `1 w, ~& w' h3 z, `9 t; O
    print("label: ", train_labels[0])
    . }  T# D/ G3 ^5 v$ ^/ n( q0 R1
    ) q" `, V- s" u: m  ~2 z2& f& ~9 V, Y  m7 U! o( v  O
    3+ X/ ]6 ~/ ]' s2 n( `
    4' S6 [: R6 _  v, C2 w+ L
    5
    ! U9 o0 {; o: k+ b. K; n! ~6' y$ u+ ~# @8 R" G! c* G  r' H
    70 x" a( n- [  z" O  A( _: E: R2 a
    8
    5 E9 d, ~+ J2 o/ @6 c# o/ x! f: y输出:0 u9 U+ v# o; b) Z2 G

    ( \9 {0 ?; w) c 1.jpg . ?# ]: q* ]/ R' u  f
    + J$ I$ O( v. F+ M4 l% H
    label:  56 O- \5 [5 {! }+ O+ s- s+ Z) G
    1# |) U- y& f: M
    Numpy张量操作
    1 L; W- L- S1 u* c/ f
    ; J7 [$ i2 L8 Q! m) ]1 ]7 h# y4 n张量切片:+ F- |, U( Q. @- M4 F' A, J
    ' B+ u& P. W1 ^
    my_slice = train_images[10:100]  _; N$ y/ U8 w  g" ]. f
    print(my_slice.shape)/ }, k: v( N% y0 w' @  G
    15 L; I4 y+ m5 _1 l
    2$ n9 x' \$ o/ w9 C9 O+ O9 t
    输出:
    ' v7 E+ ~. z% w$ l 2.jpg
    + j% D/ F  T( E/ ]# ^* M! F(90, 28, 28); L* [9 Q7 O: E! C3 a# @- s
    1
    9 L# A$ P1 c+ _7 ?. b; i& Q等价于:
    / Z1 I! a: M, J7 ~! Z5 a( h
    : Q( g" o: [& h1 x" f4 ]$ nmy_slice = train_images[10:100, :, :]; @2 o. O5 u- h1 B- ^. n5 U
    print(my_slice.shape)
    % R" `- M6 Q6 t+ P14 R0 P! c2 W- s, N
    22 O$ N, M6 B6 J' C9 {- f) `; h
    输出:  n1 u0 H, @; R2 e8 u* M5 h' V
    3.jpg 3 s8 A5 a6 {& f" [9 B
    (90, 28, 28)7 z& z' o8 l( ?9 O: q8 x
    1
    $ [# d( {. M- P, q/ Q$ h9 B: t! v1 ~也等价于
    8 ^* g; n& G2 q$ x  ?
    ! l4 T6 _" e  hmy_slice = train_images[10:100, 0:28, 0:28]9 D. E2 X3 D! W6 B+ a
    print(my_slice.shape)) @" s3 D8 F) A8 c# b
    1
    8 U$ Z7 s9 s/ O! g5 u3 R" ]2% R: g9 S& q9 S. f
    输出:5 L; k% J/ p  F( L  Z9 L

    7 E+ H, ?8 |8 F(90, 28, 28): m) z! c, f- W
    1
      j; O$ t1 `! I选出 右下角 14x14 的:/ g+ }4 \8 D& T# z4 q6 ?! m' i

    2 Z1 T  u7 R9 f: ^- Y( {my_slice = train_images[:, 14:, 14:]
    ) l3 s# z1 K3 ?plt.imshow(my_slice[0], cmap=plt.cm.binary)
    6 b$ Q& L  a3 Qplt.show()
    : ^1 U: s/ ?. e- @/ h1
    5 [% D" Y7 d5 c, r+ V2( }- N  V) |1 |: ]4 Q/ ^. g
    3+ ]: |, Q! F7 J
    输出:& e' j1 t- t8 w/ ^: m$ O! q" ^

    ; W' Q* }! v' z0 `: ~
    ! ?+ `, w9 v# G
    3 d9 Z0 h4 V, Y5 g5 P" C选出 中心处 14x14 的:2 L6 W0 q) _; H! ~$ [2 u
    " G* v7 }/ S. R* O# ^- {
    my_slice = train_images[:, 7:-7, 7:-7]
    / S$ J+ X+ ~! F8 w' @plt.imshow(my_slice[0], cmap=plt.cm.binary), N; A4 l" L, t2 g* F
    plt.show()
    3 C# n4 A6 u4 h1 [5 v1 i4 x* w6 A1
    ) R2 P( K$ c9 k# K1 ?2
    / G( I  x4 s% o, q; r+ A3; M. Y" h. A$ w: I* r2 l/ s' I) S
    输出:
    . I1 P% _8 l# g
    4 R  d/ @' h0 O- H1 l+ a0 T! W- K# q5 q2 f8 A2 L1 {
    2 q/ v$ ?  N4 W3 M: F
    数据批量
    % L5 R$ V0 `% E: y6 y: X/ ]4 A# n0 ~$ H. i/ W
    深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。2 C0 r! Z. V/ Z. x9 G  g# X- O4 }7 o
    0 x' S/ l  P) J  M4 H2 ^
    深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。0 A- g3 }# U& v2 I

    * L6 m3 i- X3 g, Z; m在 MNIST 中,我们的一个批量是 128 个数据:
    9 }0 M" P0 `8 R& j4 F) D- R6 C/ O, W1 P
    # 第一批1 i1 g+ W$ C2 S9 u
    batch = train_images[:128]
    3 \* K, D' C6 l1 |1 ]2 g8 L# 第二批9 a8 D8 ~$ l* X6 F
    batch = train_images[128:256]
    4 `, `7 P" W) m6 Y0 h# 第n批9 I0 k: `$ _, o" E4 {+ O
    n = 12
    , b+ t. N4 s4 V( q0 L* O& N+ C: J3 Ebatch = train_images[128 * n : 128 * (n+1)]
    ' a5 {# G/ h$ Y1 D6 U1
    3 ~) c/ l- v: L5 N0 q- e: Q2
    " Q. g, J" I) @4 {, |. Z) s3: e2 U3 T& o) T3 R! A" @
    4
    % u4 E  J5 b. x; d- _4 m5
    7 o$ O  U9 h; j# `; v" F$ K3 L) B6
    8 `7 t+ b; K+ }7
    % V! f6 x2 z3 [所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。1 t6 B3 p4 |- s" Z( Y  ~" i, _
    ! `# K" _: C, i
    常见数据张量表示3 ]& ?( J/ ]( F6 g
    % O4 N6 p/ U: {+ v
    数据
    ' R2 j; f$ D! y2 `3 v  v
    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-9-3 12:30 , Processed in 0.474622 second(s), 59 queries .

    回顶部