QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6595|回复: 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/ L( u) T- v& O1 u
    Python深度学习之初窥神经网络
    - y8 F/ g  q, W% B1 |9 H0 {% l8 U+ U本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。
    ' b6 N; v1 H, d5 x6 z0 w) y! Y) Y* l' o  v3 [$ q) _8 {
    本文目录:2 B2 }, a0 r/ I3 F- E/ q

    . \* t! w4 _# F文章目录
    , w+ b; O& a' a1 m) ?2 A
    & n! v2 B- y3 k1 Y. JDeep Learning with Python
    + O" \& A; E+ C9 J; u初窥神经网络- i' n- j" P6 u3 s' A, X
    导入MNIST数据集
    ; ]- S/ n6 x7 W$ B: l- [网络构建
    6 |1 K$ j5 C+ q. S+ E编译2 l6 o: P) Z8 T: f6 S: e+ S9 d
    预处理* u! V) u; K0 h+ A" H
    图形处理
    ( ?" V4 V+ ~4 o- [4 W标签处理
    & W. L$ [! {9 p+ q: Q训练网络
    & v" C$ A$ J: ~9 F- D6 k神经网络的数据表示" }' B" b- |7 [( N" Y6 ]
    认识张量2 f) X; H+ O* t/ _& ~% r# J/ c
    标量 (0D Tensors)
    ) G4 {' i/ }6 e向量 (1D Tensors)6 u2 I: B4 n/ E( f
    矩阵 (2D Tensors)1 c: b4 ?3 l9 ]. q) u# S) F
    高阶张量
    0 p& b- ?5 P/ c) \) t张量的三要素$ h, n/ Y* D, v
    Numpy张量操作
    + g  m& e! u, b* }6 U张量切片:% O7 I5 K! K" a+ G5 c6 {
    数据批量, j, j* R8 t4 [8 R: B
    常见数据张量表示8 I6 F6 [3 m( {. k. ^: \
    神经网络的“齿轮”: 张量运算1 b. a  r' ~! K; _+ M. A8 x
    逐元素操作(Element-wise)
    . \- u- r8 e% G广播(Broadcasting)8 M7 y; \3 E2 O! q% I& g
    张量点积(dot). C, E4 l4 v; F- I1 _% L- f
    张量变形(reshaping)
    7 c" {% }4 i$ q0 z+ J3 s3 e# O3 ^神经网络的“引擎”: 基于梯度的优化
    ' ~- \* G- m8 W0 I导数(derivative)
    ' ?7 s  G0 M8 g5 z# m梯度(gradient)
    4 O) E" \9 ?: E- g8 t3 b随机梯度下降(Stochastic gradient descent)
    0 q3 G) s6 Z. |/ Q8 o反向传播算法:链式求导
    4 X4 c1 J7 Q6 T3 W本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。
    2 @! R9 V" H& i) e2 E
    3 n5 u: B" P$ N! W' I9 n4 ]( [初窥神经网络
      k) R5 @+ P2 J/ @# r* @0 S3 ~. d6 R4 u1 ?
    学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。
    $ ^+ u, t; M8 z
    ' P# w( ^' i6 a9 TMNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。. e! [7 R6 I( h( ]* C) m1 D
    : H0 {. M2 W0 C5 z6 i3 V$ M+ i
    导入MNIST数据集" j; U3 p9 m- J& A! l6 ]1 o' H

    8 t! f9 y: N! b4 J/ J5 I# Loading the MNIST dataset in Keras( \6 x$ ^' q/ n8 c
    from tensorflow.keras.datasets import mnist7 h2 ]+ H9 f% M9 K! [* ~( K% C
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data()
    4 g# Y3 b; c5 h; g- n1& B7 |* I8 P$ `
    2% ?, F; y; D+ N
    3' W, n, F, }( A# G8 x
    看一下训练集:
    7 V9 d, j0 }% r
    , K1 w+ k1 S7 s$ [print(train_images.shape)
    . O5 G+ r* Y# ^8 J% }8 W9 W, Vprint(train_labels.shape)
    % y4 ^# E1 l# L4 a, U) O' Ktrain_labels
    6 v8 r9 t( \- F/ P0 A. w1% V7 G0 E9 x2 h" D; ?5 k9 X
    2% y/ _9 V6 s5 q' x1 p( G" g
    3* G( F" P, `& ]4 B
    输出:: C& f8 B3 I( z( ?3 e  Y
    % P1 e" Q1 D/ G  U5 U" Y. r: e
    (60000, 28, 28)
    1 ~2 ?  _% h8 J* {0 D(60000,). K4 |1 f2 O( v. @' y# Q3 \& x

    * e- p1 c) T+ _, u5 y! ^* uarray([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
    ! f2 Y5 c, X0 s11 w& c  v5 L& b+ G
    2& {# u0 `3 E& i: M! U# G8 E
    38 D6 d, u, E- y! d: z3 |1 P: W: s9 `
    49 ^2 D4 X! v! G$ ~( Q
    这是测试集:
    # u9 ]9 n, k& w( j& k! ]$ H; p" f
    ( E" Y6 v; ?& W  z, q% pprint(test_images.shape). D9 `' d" W. l& k, C  Z4 \8 [
    print(test_labels.shape)' G) @7 g/ ~6 s8 g
    test_labels
    / H! T: s& B! s9 z% u* t; G2 g; t6 [' O1
    ( P5 E+ U7 X. ~6 z; Z2
    7 @  I4 ?2 u2 \9 ]) H1 P3
    ' Z: Z. Q8 c/ y8 I  q输出:3 x8 Y& s  e, e( X

    ; A1 `3 n* C. `# z8 r* g(10000, 28, 28)
    6 `: D7 l1 S" l7 u& ^- T(10000,)
    ' |+ {8 S0 f9 L/ T7 |6 f$ T' H
    array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)
    7 o$ I& l; p/ d1 [$ [0 J1
    1 S% Y6 Y+ u) t2( O/ C8 |, b0 j8 z' A& @. @# T, S
    3
    % j+ e1 ~1 B6 J: S. |: q4$ h! q, u% C+ z2 t' d
    网络构建
    8 y3 R  ]7 K& u" G6 Y% U5 A6 ?7 J- T& x) |! E
    我们来构建一个用来学习 MNIST 集的神经网络:" J" ^! f* \5 _  h& R

    6 g! Q4 F$ k  F0 |from tensorflow.keras import models4 a! [/ ]5 [5 y+ {; ~' A& g- [
    from tensorflow.keras import layers) b2 s- K7 p8 K1 {: }* o
    ; I9 T  x: l  ^- _  U! q: q& K
    network = models.Sequential()( i9 _3 M) T' N' g$ o
    network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))$ v" p! k, D+ `8 _) C+ K& r
    network.add(layers.Dense(10, activation='softmax'))
    ! z6 G7 |: u7 I3 G" d8 R! G18 @5 ~, Y6 Z& E8 y. S
    2
    # x* |. U  q0 R. F, u* n32 z9 d# N4 P) k/ B
    4! o/ J2 u' W: c  e7 h
    5
    8 f$ G: A+ G+ s& S7 o( U0 ~: J6
    % I/ O" @3 K  V; w3 b& {% E2 \神经网络是一个个「层」组成的。
    , J6 R& }" v# T0 C. }一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。3 j. d- G9 U! a& |" T
    * T2 K4 ?; O4 h
    这样一系列的「层」组合起来,像流水线一样对数据进行处理。
    2 H/ j/ h, q$ ~层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。
    8 q9 t7 x' {0 _# B8 b3 I) ^# k
    & `+ R" a3 u) K0 N" y* A我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。
    6 A- C- j& M& ]0 t# a# A; \; \- l; h9 ~% ~
    数据到了最后一层(第二层),是一个 10路 的 softmax 层。
    / Y5 P" a; @2 g- {这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。! e$ O; K7 b, ?4 [
    事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!+ T0 B: @  n3 B

    ! x) ^- |. ?! R1 i编译! |2 i8 V: a. ~6 m5 d/ Y6 q
    9 }+ m  r4 w2 b6 K/ Q
    接下来,我们要 编译 这个网络,这个步骤需要给3个参数:
    7 R2 q, ?1 X% X! Z" j; _4 d: X, Y' e
    损失函数:评价你这网络表现的好不好的函数9 O% s1 D' K, H! o/ Y
    优化器:怎么更新(优化)你这个网络6 x% _# h$ s* V, m5 z4 Q+ j" b: T
    训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度, h1 P0 }5 H, M' n( }! {
    network.compile(loss="categorical_crossentropy",
    7 }) l5 A! n/ I, I# W                optimizer='rmsprop',
    5 y( u( a& v; l3 b" N/ R. j$ C                metrics=['accuracy'])
    , A: R# r( S* m" M) S! `' k1* w1 l8 w5 n1 R+ ~8 m
    2
    3 p7 R! s! |" h32 a1 v% ]3 q& |( r! i0 _4 r2 i' }+ H
    预处理; [5 s1 S% n, c2 o; d
    * Y# M5 _9 f# W" x
    图形处理
    2 u' Z9 t/ N% H+ d8 u2 v( k# k& p; L& t: s7 r. U
    我们还需要处理一下图形数据,把它变成我们的网络认识的样子。
    , }% u6 W- m8 C
    # }% y% d- B/ t1 [5 Z2 rMNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。
    0 G- j$ s! ?- i5 s- Q" ~而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。2 K" ?; Q  K( n, E
    7 f  M0 e! l5 D7 C
    train_images = train_images.reshape((60000, 28 * 28))
    $ a- E* n3 d7 T1 Btrain_images = train_images.astype('float32') / 255
    ; O* a: J% @! d3 V, y  u% k$ F# c, @# x- d
    test_images = test_images.reshape((10000, 28 * 28))- X' j5 t4 D1 I) ]; q* q4 |
    test_images = test_images.astype('float32') / 2554 f: G0 J; ]7 l5 s4 \' Q
    1$ r5 U' C. g3 e
    2
    3 {, B5 Y1 B" n) K2 _. n+ [9 j& Z3; w2 D, u4 w/ L4 b
    4
    1 c& y- Y  w2 {& `3 L/ W5( a' w6 F9 p" X1 q* S0 F4 f6 ]
    标签处理( G, X1 D8 _0 O$ n9 w
    - j0 b+ u* e" C! n6 R3 ~& C1 i) `% d  o
    同样,标签也是需要处理一下的。) n2 B- K& A5 ~* C6 Q5 K
    ' V1 L: `4 R5 w: P
    from tensorflow.keras.utils import to_categorical) r, ~( h8 x+ f' i+ Q* F8 P

    & Y# d7 I3 A4 N2 {# U. E0 ttrain_labels = to_categorical(train_labels)5 Q  I8 i" L  c% e3 s0 T: D
    test_labels = to_categorical(test_labels)
    . F1 W% g+ w$ [6 W2 `8 M8 U+ p1
    $ f; I# \, h3 v" ^( a8 E2
    4 Q, k0 p6 T( V9 M# l$ o) y3
    7 {+ u; ?/ G1 e9 b3 z4
    ' D! ?5 W3 w; u  a0 b( W% H训练网络# n1 o  H5 v+ {  [% G. S( H

    * {1 A2 F8 x* }& b; `network.fit(train_images, train_labels, epochs=5, batch_size=128)7 y9 h1 W: b# D, |6 L0 g2 [: C6 w
    1* B! S9 s$ B3 i* T
    输出:2 J9 A! o; B6 \6 x( _/ Q5 r* M& H

    % D1 |/ l/ h- JTrain on 60000 samples
    " ^# J  T- E4 Q/ @( n) j. [Epoch 1/5
    % K# k4 i; E9 o- k60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254
    % `8 |: J* }) w6 hEpoch 2/5$ x. ?' k7 ~/ o
    60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693/ f/ u6 O: \  p% Q+ f6 c5 J
    Epoch 3/5
      ^/ e8 H6 i2 w6 c7 ^& R60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800" l+ P" S. A! {
    Epoch 4/50 v1 Y* C6 p- G" U
    60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848
    ) S5 J2 L  v8 _7 DEpoch 5/5  D1 S# l# W' R' N+ m2 i( w1 R! W2 z; ?
    60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888- j) g- I! V! P/ \# C
    + m$ ], i# V) P, M+ J( n
    <tensorflow.python.keras.callbacks.History at 0x13a7892d0>
    " p) f  R5 k9 C  `6 B# ?% O" z# H1
    . i7 O7 ?3 b$ y4 m5 L. `2
    5 ~2 l& ~) Z  L- h* f' W+ M3
    : i6 F  p7 g+ m( `& B47 F0 `! Q/ s, z8 T3 r: {( V0 E& D
    5
    1 U4 Q: _$ @& e! \$ {6
    ) K. [. i7 S* }. p  u( ^8 X& R76 G1 v' I* G4 A3 i1 s- P
    8
    # n5 A" ^* ~; m: O. W, z8 O1 p9
    ; k# t2 I5 _9 H, ~& L+ y( f  X10& x3 I2 i- }6 p. Q( R/ e4 J
    111 C( K3 w* j! I$ U  u1 K+ L
    12& F7 E" J" `( X5 S* ~4 F& `( H; U
    13
    3 Z& [5 L+ ?" S) }; E' K可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。
    / `4 o/ U$ T8 o- A8 H  q
    - `+ ]4 g5 {+ @- b* n1 S" Q0 F再用测试集去试试:) z" J+ c, F4 w; \7 q2 p2 d, ]

    % h( E2 M* o4 h! B7 ^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
      R5 f0 U8 @7 Zprint('test_acc:', test_acc)& I3 C2 }) n( L6 ~9 t
    16 E! C- d& g$ U* C6 R# A$ n6 B
    26 Y$ P- B6 N. y4 t
    输出:$ Z' e$ K' k" J+ Y" Q5 ]# i! K
    # v% A& u3 _" x5 P
    10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789
    + Z( I& D3 M+ Z6 i/ A: i# ntest_acc: 0.9789) c6 B. ~) L; u0 X; b% A# d! G
    1# P' E7 u. e" j# s, W3 j$ [7 B3 q( G
    24 k5 B1 q: w6 t; n0 h
    我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。" e8 a7 W/ Y  ^3 Z# }
    ! a3 K, P. B- N# c. D9 t. e! p" H: U
    神经网络的数据表示! z6 v0 v) j# O
    : B- H, q# G2 J: \: s
    Tensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。$ ]3 \: A1 ?, L/ t* {$ B) |+ s
    3 D' D" F. V% L
    我们常把「张量的维度」说成「轴」。* I+ x3 t- Q& j! s" T

    - M3 `% T! |, P' z7 ]认识张量3 j# M3 M2 I1 Y% l* u3 s0 n

    # C' q( d( T3 E3 J7 B标量 (0D Tensors)2 d0 {* D3 |4 u* b' ]

    7 J! M6 k( X4 V+ r1 [Scalars,标量是 0 维的张量(0个轴),包含一个数。
    * s( ^: [; N0 E' [. A/ a* v$ N
    - q2 c% f7 D  r  h, j标量在 numpy 中可以用 float32 或 float64 表示。
    + J. e+ i) R: m
    : R6 p* k4 P* E5 a9 _7 p/ limport numpy as np9 E- q% k: [5 I4 j8 v

    , Z+ |( y& U) a6 y% v2 Z9 w; L. y, vx = np.array(12)
    ; q1 f. ]' j+ M$ Zx
    9 a' C# ~" Z6 e- `0 `- ?4 n7 @8 h1
    + o- L' V! N& B; y# a6 r% `* S2
    0 W( Y% _1 q) X; L4 Q34 Q% ~4 V) P; D" B8 V$ S
    49 ~( g# F* E& P( g5 X0 H1 F, F
    输出:- I$ f* u9 g5 d
    1 S5 O2 G# o% e- j: L# L" A* b
    array(12)
    ! \4 s1 ?: v. i& W8 f! Y17 s  N: `9 a- l
    x.ndim    # 轴数(维数)
    7 x0 D$ o% v* E4 a$ ]1 b5 Y! U1- K2 C+ c8 C& j
    输出:
    " R3 ?! j: e% E4 G  W8 ~
      ~% S3 K" N! G5 f1 S# g1
    0 _; g2 c! T; Q/ g& J' G* |1
    - Y0 E2 Y% K% ]7 x% v向量 (1D Tensors)
      i5 N8 }1 L: s2 r1 r# h( N4 W) T4 s
    Vectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。1 B7 C/ o# X: U5 O' n, J( W
    1 e7 P, l! Z3 j# x
    x = np.array([1, 2, 3, 4, 5])
    ; s% T, ]9 B6 d7 s2 c: x2 F) @x
    9 _* r5 ^9 b  d) \* q8 ~1
      @  \  @5 \5 s5 R9 B2
    # m/ Q# {! _7 p输出:) k3 j' z) N- ]  |5 \5 x$ g, @
      `( j5 s  k1 x" u2 `1 d  H
    array([1, 2, 3, 4, 5])
    & n) ]1 \5 ^" n$ s" f# J4 ~1: U# L$ o- d3 `# S. K5 ~' W4 D
    x.ndim+ j6 j" ~9 D9 e' \) g
    1
    " Q' Y' U$ Q, ]3 U/ ?0 |$ V输出:
    % a9 z: W' L2 x$ R9 I: Z, s; @' R
    ' L% w  g% n# Y6 n+ x; S/ t7 i1
    3 G; m5 a' N* v5 Z17 K/ i  A7 g, J" r! Q
    我们把这样有5个元素的向量叫做“5维向量”。
    2 \& a. z- i3 ^& Z但注意5D向量可不是5D张量!# }" W, l, N/ ~; ?

    & m/ y; f* f$ |( |' y* e5D向量:只有1个轴,在这个轴上有5个维度。
    % H+ @# ?( t9 ?; K, x$ d. n; H% m5D张量:有5个轴,在每个轴上可以有任意维度。
    # E4 J4 Z1 g. B6 M0 C这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。$ j7 R0 O; ?  }/ _5 _  L& ^
    1 E& a  ?5 m& u9 y# x4 ^$ g/ ~3 y
    所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。1 h) q6 i8 E5 y: D2 Y% O! \5 {' H

    0 c! i" c5 S% n& W+ c矩阵 (2D Tensors). K3 L. r* [- X

    % t% d% E7 Q3 hMatrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。: k5 v; o0 K# R6 t+ e" U

    : }6 a: b! X2 y1 ~x = np.array([[5, 78, 2, 34, 0],+ J+ Q+ [% `3 Z# _: p9 ]8 o
                  [6, 79, 3, 35, 1],( @2 ~, [8 L9 O  c
                  [7, 80, 4, 36, 2]])
    ) s2 [; R$ r1 D; f- @/ v2 Dx) P7 U. c' v% \1 ]9 J
    1
    8 b% Z8 y3 Y! {( |2
    ( |( v! J, ^( i5 P) p3
    6 C6 D5 F. t6 V48 Q/ o0 ]- r$ m- p4 i
    输出:
    2 n4 K& o9 g6 ~# k' a" H! K- U1 J" [
    array([[ 5, 78,  2, 34,  0],+ H$ e% w2 ]. H& n
           [ 6, 79,  3, 35,  1],
    * x+ b- F% E; E3 C  c  z! l       [ 7, 80,  4, 36,  2]])
    ( ~8 ]/ E( x- w; {  \/ g4 z16 \0 J( O  Z$ X1 z6 ]# T4 g
    2
    / I$ ]9 r* {/ L& X& r6 ^0 n: \3
    9 ^8 B/ s4 k: k- |5 @" Px.ndim
    4 Y. I9 [9 ?7 G7 G! b12 c9 D" D6 r1 z' X
    输出:9 i* X. F# ]2 z3 W* i; p5 A

    9 H# X; [/ |  K. w. ?2
    & H! {- d5 Z+ x7 D+ |3 z+ J5 N1
    2 u& A! s' S, R5 e1 x$ g; p( G0 w高阶张量
    * ]! r7 j0 c- o' D1 v% t
    2 A) o: s% ]1 D6 w9 q你搞个装矩阵的 array 就得到了3阶张量。5 j: I# r9 h1 |8 R/ v2 w  {* {& Q. t

    0 s" M8 P  X! @7 t再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。
    : y0 k# h  h1 a, [7 `- L
    % E! u, N4 ?$ p1 Ax = np.array([[[5, 78, 2, 34, 0],) ]7 _- p9 x9 S: e6 d% ]2 D
                   [6, 79, 3, 35, 1],
    / O% J# V$ E+ z8 E0 n' Y, ?               [7, 80, 4, 36, 2]],
    , i- X0 F1 e0 n- @, a& R              [[5, 78, 2, 34, 0],( V' N' c; P0 M: ?2 G- ^
                   [6, 79, 3, 35, 1],4 c) P& Z4 r) V/ A  X# c$ R
                   [7, 80, 4, 36, 2]],0 K& A* H: H/ C. ~. t$ X
                  [[5, 78, 2, 34, 0],! A8 C" K0 O3 `) W
                   [6, 79, 3, 35, 1],: S7 N( |: b7 L) P
                   [7, 80, 4, 36, 2]]])
    ! J0 d0 Y! S4 n' R2 M' F& Vx.ndim
    & q+ m1 u% R* K2 g1  C) l4 ]. L" X* H  E' A7 n1 i
    2" G% s% r: r9 Y# Y& r$ h! M
    33 N3 |0 Q/ g$ R. ~
    4
    & G0 \+ w2 I5 c8 E5& k8 W8 }' L% t* J
    6
    & W) i! c% ~- n2 F7 B+ g9 i7  L6 ], s9 X, s
    8) E& J1 x4 e8 S3 O4 C) J
    9# N0 l& q+ u  {  x- ^- X
    105 ~9 e3 k$ A1 ?
    输出:
    ' v- Q5 `9 F+ l2 u* V8 N4 E8 u' C" j8 g( z3 s7 |8 K$ i
    3
      g3 ^9 @+ _. ?/ \' l) V+ e* D1
    " E& v: l0 [) Y* g4 n3 x深度学习里,我们一般就用0~4阶的张量。0 ~! b0 _' ?, k* `

    - @* q, Q3 k! W张量的三要素
    1 i2 U$ O' G( Z5 P7 ]. G
    1 @( a& F  w! Q% z* p/ n1 a阶数(轴的个数):3,5,…
    % s2 n- V8 x, ^形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…6 d# s# x5 {1 G/ e7 i+ d; w( J
    数据类型:float32,uint8,…1 k# \% }% ~  [* Y
    我们来看看 MNIST 里的张量数据:) b. v! ]1 V: [, h7 P- y& @
    4 Y- s! o* A5 I+ J" T" {
    from tensorflow.keras.datasets import mnist! Z1 m( Y0 Y1 ]) V, |0 C  B
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data()6 h. l2 R3 b1 V3 r

      N, T5 g. M' rprint(train_images.ndim)2 J2 [/ P' o* }+ N
    print(train_images.shape)
    ) K' [7 N/ c  q3 Y- Gprint(train_images.dtype)9 s1 E$ w1 x+ W1 T: V+ F* s6 \
    1
    ) X6 C3 f& X$ z" z' f( ]2
    2 u# L; S! h8 k( j0 a! S3& i/ ~. O+ s  U& J3 ]  I& o
    4
    # M" n9 z$ X4 @  g" z3 w5
    $ v( `  X1 b8 c3 R. r6
    ( Y% @; [4 j7 P& U! [输出:1 I. x0 q1 ^% v% U# f

    # q3 |. [  `8 W- Q* t6 E: X35 ]0 T  \3 L9 B" P$ ]  u
    (60000, 28, 28)
    / @; S  n7 n- d' Huint8
    % J4 H# }$ R8 }" Y/ T# a14 w% k9 _1 N6 _1 W& C" D( I0 k
    2! G7 w! L& \1 f& r, `; m1 r
    3$ Q$ U4 E1 a- d: m) z4 x$ b( }) x
    所以 train_images 是个8位无符号整数的3阶张量。' m% @& r, v, F2 w: b' M& M& `) O

    2 X  ^8 d' @) ~! P* y1 `- f打印个里面的图片看看:; Z0 Z+ W5 w3 `. r# f' q
    & f& r% P6 a% C% U- V
    digit = train_images[0]
    , E1 [- {* X% \; I7 b9 h1 F" i) G5 E, W5 C
    import matplotlib.pyplot as plt
    . q5 W/ K( o  V1 v7 u% l* k! H# ^2 w. `% R6 p5 T
    print("image:")
    1 }9 f0 z. R3 ^; ?2 `- X% W9 X! wplt.imshow(digit, cmap=plt.cm.binary)
    ' j8 p$ i4 \' |2 U! G/ z2 Q% |% ~  g2 ~plt.show()5 I/ b: n8 G! [; l! V) \( G8 h
    print("label: ", train_labels[0])
    4 ?9 ]( |! h8 n$ R9 `" U) a1
    & F7 j0 K6 B$ _; C/ Z2$ G5 k7 x0 R2 M( O+ z* w
    3
    " T6 I5 X' _( O5 m' x4
    0 h  o: p  X1 R- f) d56 s/ [# l! u( _' @
    6" Z  d- T) U* w) L( g) E& X
    7
    4 S) @% e. b' ]) x# a) S/ V8: w4 j0 p( [2 C
    输出:5 M: `5 `. O% E
    * _( g1 J) Y" _2 l- c3 C
    1.jpg
    - }1 Z! ~$ K) N& q. L: S6 n. E: e0 W- b' N4 {" N6 @% y" J
    label:  5
    1 i# s. s& w1 w1 p: K1% K( C+ M1 n$ N% h; o7 |( R5 g6 x
    Numpy张量操作
    / E) k9 U! [0 w1 o5 ]' s  w6 q1 I6 N: n" J
    张量切片:" N( j4 M/ W5 A8 g0 }0 ?

    : A3 n# v0 D, _% |4 R. Pmy_slice = train_images[10:100]( p# R& f1 A) |4 \' X6 z
    print(my_slice.shape)
    ) y! z# O2 v/ t! |4 h2 w1% E9 C" c, y8 J) l
    2
    $ x5 I7 j+ {; `5 n输出:
    - V; w% ^1 L$ U3 E- y 2.jpg
    ' \: h, D& ?& q3 K0 d(90, 28, 28)
    $ m7 u' P: V, y1
    7 F9 E. s. [2 K! T2 E等价于:! Z1 }# V: b! y# |4 l( I
    " o* L: a/ e0 i; [: V
    my_slice = train_images[10:100, :, :]
    ) D( x; c; z" h- V& _6 ~& ]. Nprint(my_slice.shape)
    6 V$ Q" i# {, t  ]1
    7 Z/ Z1 q: X  T+ @8 ?  E2; J6 ^5 M+ r& Z8 z  D: L
    输出:
    7 B4 w' K+ r6 J* Q7 ~$ P 3.jpg
    * M* a! \7 H7 ]* H, i. J6 W  l(90, 28, 28)  }/ C* {0 A. I' }  K) r6 @4 W/ p
    1
    ( k# ^& Q) p9 Y2 g; u也等价于& t) L! k' v6 G& x" p

    5 I+ j) k, N' Mmy_slice = train_images[10:100, 0:28, 0:28]3 A1 M8 t1 Y4 Z/ p" ^
    print(my_slice.shape)
    5 `" J+ W* U. g3 s1 z+ [$ @1
    8 [; J# L- ]- L1 e- ~2* G4 Z, D' X+ }
    输出:" T$ A% G% _& E+ O  c/ I1 X+ p

    2 E1 j$ m( P" q; d(90, 28, 28)
    . F1 M; K9 @1 L$ [% b2 G1
    1 ~: w3 J& T4 l9 L选出 右下角 14x14 的:
    , t/ q9 z% a/ }4 w& r/ Q: W+ M1 `9 M6 q! i
    my_slice = train_images[:, 14:, 14:]  B8 D6 T8 V3 v' F" F: h
    plt.imshow(my_slice[0], cmap=plt.cm.binary)
    % s& `6 c3 V2 }0 S. Lplt.show()2 q& D# g4 w( o
    1
      E! F, z7 K- Y" h# d25 p( i, v) u' g
    3
    ; h$ c; S3 c# N输出:
    " Y$ J( x6 v5 w& B! h! _4 [" D2 r: v4 E# K

    # C. V0 a( T% _( a4 N! [
    4 b2 _% W$ p8 `5 J& \选出 中心处 14x14 的:
    % h4 W' j3 K5 A" X1 ?
    0 |! ]6 K* c; w2 `my_slice = train_images[:, 7:-7, 7:-7]
    . `+ i6 N; a+ W, j' {plt.imshow(my_slice[0], cmap=plt.cm.binary)
    ! {5 a- C: N7 v% [! W0 w* Nplt.show()
    2 d& v, {9 k/ L, O% w2 t, W1
    8 u3 L$ t( S# o3 ^! M+ c- H( R2, b/ G% Z% W7 N
    3
    & a" `1 @; q6 |" D输出:4 x6 l; I; G3 Q7 z! m
    9 t& J$ U; }4 E: V
    9 m" K. Y, z: `$ t' {
    ' M( f& ]( ]' o! I6 J, L
    数据批量
    4 m4 o; R1 F0 y3 Y0 D% m
    4 ?+ d4 w2 g/ N8 f深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。$ N( Z, n$ `4 M

    : n# E/ }) e- q  [9 L- m9 I/ {, \5 \深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。% r: ?  T( f6 J

    + C, i5 `/ Y7 m% Z  [1 W4 X在 MNIST 中,我们的一个批量是 128 个数据:
    4 {0 M* V" G0 |' @
    . r6 {& D5 k3 j+ [! _/ b2 E# 第一批
    ( Q  I6 o5 H$ I) M3 P! Lbatch = train_images[:128]) H: a5 C+ `+ O& L7 q
    # 第二批- ~5 c1 F4 M7 h8 w! w
    batch = train_images[128:256]
    : d7 w2 k* @, G( O3 [# j# 第n批
    & r) q5 n$ N" L  C3 On = 128 t- N$ Y: _( r, [
    batch = train_images[128 * n : 128 * (n+1)]& g* z; }0 o1 p5 n1 Q* z
    1; l" |9 r; s/ S( v1 W
    2
    ! [& r, I) y. N7 z3
    + |7 X9 c* B& E; }7 C# e: H. P4; X* X% e4 i' J3 ]
    5
    ! |6 u+ {9 ~) R3 [$ o6$ `# n, h) j9 o5 s8 _
    7
    , \. L' s" T1 I/ }4 z6 g" k所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。
    & {7 H6 G/ ^  `; i: o" V1 e+ C  h5 g* I6 S$ W( s
    常见数据张量表示6 n6 ?3 M+ D  N' c# k" I. O! [
    % F& }2 a8 [3 ~2 B# I
    数据) i8 x9 D2 L1 U8 d# V5 I9 R
    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-1 21:31 , Processed in 0.544290 second(s), 59 queries .

    回顶部