QQ登录

只需要一步,快速开始

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

    / J/ U3 H. g% ]' [/ UPython深度学习之初窥神经网络
    * z$ T( |6 H- N4 t4 Y$ {8 J! _! `本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。% ~$ ^/ m) C" _+ ]

    - R3 d+ z5 D7 F1 H本文目录:
    3 U+ K6 u& v2 E- H) `* S' r! v% I9 A3 B# Q
    文章目录
    7 G( l8 y: x( a- f
    % ^4 p" u" w3 _# p+ o& vDeep Learning with Python
    ' l+ {1 n- v0 }& y1 n初窥神经网络
    4 J. j4 {6 G! Z  @+ l$ [" l, c, z导入MNIST数据集
    ' }& L4 U$ {+ [: P* P- J网络构建
    - v& d9 R% i/ x0 R编译  _! d! v/ d: f( D- W- J# `
    预处理4 S" x/ V+ n# k) ^* o
    图形处理1 z; {- l. ]7 m, P; K# B# H3 z, j% X
    标签处理6 @5 l& f& C/ O; {
    训练网络
    ! a$ j3 ?+ n9 x# B, o/ K9 d1 h神经网络的数据表示5 y: @7 Y0 r( e
    认识张量
    + Q+ R/ F+ J8 Q: W4 i* P6 o% R标量 (0D Tensors)
    : _  H7 O' O: S- ]. ~向量 (1D Tensors)+ a5 K) E% v2 w" i
    矩阵 (2D Tensors)
    7 b5 O) q, V1 Y- l6 R高阶张量
    0 e. f" q+ j! g3 _/ ], D张量的三要素
    + W& p( F, U' x% v9 F) T  G9 e  ~Numpy张量操作% v/ n# S* @9 D5 r+ J
    张量切片:
    4 T6 c' @4 d( N* d: F6 a0 c+ b2 S) J数据批量" J) M6 F% A6 D( r$ R
    常见数据张量表示' ~2 a% q9 v1 _" d" W' D: V3 V
    神经网络的“齿轮”: 张量运算; H. G2 e) e0 I$ }6 h; d& Q# T
    逐元素操作(Element-wise). _" C. m# j' q$ e0 T4 v; J. ]6 c
    广播(Broadcasting)
    5 E# k) y! K/ n- w( Y9 v1 ^1 S张量点积(dot)
    2 U1 d$ ~4 A( M1 c张量变形(reshaping)3 U2 Q8 q  ], V8 G$ f/ U0 U# P
    神经网络的“引擎”: 基于梯度的优化
    & y" r. j5 t; m( O1 @9 Q) u导数(derivative)/ `$ z9 \0 R; C
    梯度(gradient)" J# V( u6 u& ]' l
    随机梯度下降(Stochastic gradient descent)  @/ C/ k5 g- j; q1 V) n
    反向传播算法:链式求导" t& ~! F! s' j. p, j: `
    本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。
    7 c& R$ ]: U5 W! c  k( X) Q
    + S8 v. [& {# a( Z0 I1 _初窥神经网络
    9 Y8 `1 Y' D7 H0 Z+ H& ], u! i( M+ z4 Q# K- B
    学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。
    0 Z; q+ G; W- ^
    . K" w/ z2 b4 a6 Y! k/ P- g! s! aMNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。
    . N' t  c9 I* d. z4 d
    7 q" H' r0 a" q+ C( A1 h$ d9 l5 p导入MNIST数据集" d: H1 U3 w0 B5 b! {& O+ C( ?
    ! o* @. R! w" o3 T" k
    # Loading the MNIST dataset in Keras
    * e, }* b* G( R& Xfrom tensorflow.keras.datasets import mnist$ T7 _( O% X" H& ~  [) P
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data()) T; }* f+ N2 x, k% g( E
    1$ L: `; K* E+ X5 B
    2
    , Q% {& {" g% e# c# |' H+ b9 S30 j: x$ P7 {" J
    看一下训练集:
    # S7 X* U& M, {; H, C7 z3 X! W# g9 p" ?  [  U/ B' [
    print(train_images.shape), j* _( R$ G8 P' ]) f- _1 M! d
    print(train_labels.shape)
    0 \7 N# m, l# M8 X) ltrain_labels8 \' Z. ^% [' B+ f' O
    1$ ~. `- x0 [( l+ I# k% E, ?
    2( x9 y9 K% ^& P* A0 S7 O8 t! R
    3
    " Z- a2 k9 a0 ]# m4 [5 l7 b输出:5 s& h# ~  B" G7 G( H
    . N0 C" @' b# V) W
    (60000, 28, 28)( |5 p8 M: @+ L" l: `: }$ N) C
    (60000,)  o6 w8 n: S) n, p5 Z( t5 n3 `
    . P# `- Q7 l6 I0 n& L7 Y# F
    array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
    8 ?" z$ [0 L* O3 U' a1
    8 i8 l& F6 c9 q" N9 M$ L2
    & _. U, m& \' j. j) @. L2 ^1 g38 ?8 Q' z( [" ^: n8 S
    4
    # m- Z# X  p0 }2 N这是测试集:
      Q$ d: ]; M# G2 h1 J- c5 ~1 `
    ( `  Y+ M8 d+ R/ u( nprint(test_images.shape)
    # ^3 t$ l- U; vprint(test_labels.shape)
    : L  ]0 @; d9 J) p/ y0 ltest_labels
    ; l$ W1 b4 H3 R( V6 {4 E1; p9 R$ y( t6 [  r
    2
    % ^" C3 o( Y+ J% k3 t" b& S  J2 A3
    ( G+ ?9 p, Z( i. x) U- Z6 @输出:
    3 I& \6 R% Q0 P% N- K7 q2 W" d4 B
    2 m7 k, O' I& T(10000, 28, 28)
    1 Y! y0 e' @' V' r(10000,)
    & S% O; J2 k& o# p( I2 N1 e- R+ w0 |6 `
    array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)
    9 M3 `" ~( m/ t1 i# r$ [1 u: I1
    4 k( u; P" m% h% o- g$ Q# I3 s( H22 l0 W4 M) K# Q/ N
    3/ F) X4 ~& o( f, E+ Z& e* b' `5 A
    4
    , ], H, ]% |; m' x) w: J网络构建
    : Q' j5 h; ]" u/ P. A. h. d5 k
    ) [5 i" \+ i/ G2 v0 o我们来构建一个用来学习 MNIST 集的神经网络:
    " f- s3 l6 l$ |0 g9 z
    ' H8 \& {7 L$ E$ g. ]( G  sfrom tensorflow.keras import models' \8 {0 J8 u2 J: E: h7 `
    from tensorflow.keras import layers
    6 U" N1 Z% ?( r9 b
    4 V; a" r8 Y1 W/ N& Hnetwork = models.Sequential()
    4 ^$ ]9 [* J8 j/ U# e$ W, _network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))/ U4 ^7 }) k* e5 @& _$ l7 E% _
    network.add(layers.Dense(10, activation='softmax')). p  h) U: {  G( c% w2 ^5 b* U
    1; L/ H0 z% j4 L2 x/ i8 y
    2
    4 _+ j( j+ q( X; e9 e* ]& g6 x7 |+ J37 b% o! d1 h' i! L; N# j
    4$ }) v* L5 x& c0 L
    5
    7 V8 _4 {. y; ^3 Y6 [" s$ q6
    % n4 V7 s* u7 w# x. h3 Q神经网络是一个个「层」组成的。
    9 |! Q0 m; `8 N$ F& ~  f/ p# \# e一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。
    ) J& L0 D$ L$ N4 G" o6 e/ b3 N+ ?& F3 r
    这样一系列的「层」组合起来,像流水线一样对数据进行处理。, ^& m/ _+ F. ?4 }7 N, g/ Q7 P
    层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。. b, H9 h+ X, m

    - N  R7 s  q- j3 X% O- i8 L我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。6 ?1 d, h$ n/ I3 e

    * J. s* q$ |; ~* w4 m# U数据到了最后一层(第二层),是一个 10路 的 softmax 层。4 @, G% c) N$ H4 G4 t
    这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。1 \1 K9 r: t% i% B/ ~/ I6 D, H# P
    事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!
    8 Z' F/ R" N7 T. U& U  A. b, J) F( {; W. A; R9 \
    编译
      Y0 g: v6 L' Y+ q$ O- w! d( ?% d' t7 [* W$ V
    接下来,我们要 编译 这个网络,这个步骤需要给3个参数:- ?5 M1 S  H; b' ~2 ?1 y
    : z1 C, |$ a2 s, B8 _( }# T: K
    损失函数:评价你这网络表现的好不好的函数& z9 _$ O. c2 |( O7 q  Q  g
    优化器:怎么更新(优化)你这个网络
    ' U: X, X$ g2 R6 ?训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度$ Z( a, P1 R0 x7 n( a0 C3 o% \
    network.compile(loss="categorical_crossentropy",
    $ T, _  Y; H! a0 m                optimizer='rmsprop',! T7 L2 X  ?  [2 M( Y
                    metrics=['accuracy']), I( Q7 `6 X1 e9 h, U6 J1 J
    1+ x- }: z3 M6 D4 F+ Y8 q! J0 N
    25 `5 b: u" \0 _  V5 F" x) S" @
    3
    6 |0 r* u0 {# [% X4 I# W预处理
    " N+ W# h7 l' t- @  q: Z* O1 m  H
    % F; R4 t) h/ ?" s  G图形处理
    " V: N! u. h3 F
    $ ]% ^) @, j5 r" D我们还需要处理一下图形数据,把它变成我们的网络认识的样子。' j/ S+ P* p. u$ `$ q6 y

    6 x# f1 c$ F5 P! T7 D9 [MNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。
    8 w5 L5 g6 R0 m而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。
    : o) z/ e2 H& S2 n" y7 i( H$ s8 [; t
    train_images = train_images.reshape((60000, 28 * 28))
    + N! T! x; g- T8 f( mtrain_images = train_images.astype('float32') / 255
    / B$ z; o0 P; A5 F1 g7 k. z7 H
    , q/ @+ ~7 Y# b$ X) ^7 gtest_images = test_images.reshape((10000, 28 * 28))) T: ]% L) {+ F  W& t9 G7 A
    test_images = test_images.astype('float32') / 2552 k3 [3 G# y' X, M  h) e) f0 e
    1
    2 v7 R# }$ F& ~# Q. w2
    & i* j# o' ^/ Z) s2 |* N3+ \* }& f  w- A- L( ]1 {5 G
    4
    4 l* R2 w6 C, w8 B5% A- ^$ o' E. f, W$ [) P$ K9 v; _
    标签处理5 j( n' ~: D# v4 \) @" x

    4 v, w9 P. U7 k: M! v/ r同样,标签也是需要处理一下的。
    5 D. y8 H" R7 R/ s7 g6 t; Z0 `" ]4 |# a  e3 ?4 r5 ]( M3 D: ^
    from tensorflow.keras.utils import to_categorical2 B) `* D3 Y! x# K7 f

    - j2 w& u/ P) M% Ytrain_labels = to_categorical(train_labels)
    6 v* \" \9 v& a2 N4 |. D" Ntest_labels = to_categorical(test_labels)$ r* o, p; o  g9 e* J. P# x6 b
    18 K% h. P; v# v3 w% s4 ]6 w) O
    2
    , Y2 C; a3 H" {2 A# [0 i, @3
    7 `$ T  i$ F; B7 J) O+ ?4
    % ~1 z( |; k# R: l% Z+ u9 {训练网络
    # Y" D8 Q/ l1 a; n! j
    5 k) _+ F6 k7 X/ {. w& Q' C& onetwork.fit(train_images, train_labels, epochs=5, batch_size=128)+ M/ f" h+ o9 o0 b; u2 I
    1" u' d6 S7 Y4 Q. P$ P# q
    输出:
    ! q; c8 L& t; M( t% e, A& \$ X# a) D" [! M$ K
    Train on 60000 samples
    + l; K* }+ v& Y1 v7 d" aEpoch 1/5
    ; @6 y# F9 P* f7 r$ o& A60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.92545 r  w) u( d+ z4 J5 P
    Epoch 2/5$ t" E' A+ ^8 _
    60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693
    " D+ k4 g2 \- U! d& q2 REpoch 3/5, v9 b5 k& H4 |; E) T
    60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800
    7 c) N# R/ ?: t; _0 [Epoch 4/5/ c" R" m% S" v# v" ^. _# a
    60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.98487 ?4 \2 K; e, X% L1 y% P4 \2 ]
    Epoch 5/5
    0 F% Y. ~0 v  \: R/ w* S' t60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888
    7 f6 N, F& L5 M- L' B& M" }9 m, J' n" k" ?, `2 X; x5 y
    <tensorflow.python.keras.callbacks.History at 0x13a7892d0>
    3 p/ p9 t6 C( i* n/ ~2 q1 m17 P3 ]! B" h8 `1 N8 P
    28 ^, P3 o  ?/ Q
    3+ n: ]$ F( p  X+ o( }" X8 \9 ?
    4
    : \6 B% ?4 n: T# r' h7 A5
    / h5 u4 ^3 Z* k7 e0 C, m$ K3 F6  M: v" q! f' }
    78 X& i& Y/ t3 o
    8
    3 {: F# ]' l5 Y4 G0 A. u5 n7 M9$ c8 L+ v2 q4 D- X5 P
    10* T# I4 R* f8 E! b7 l- B, M2 [
    11# P6 l* H. A% q) N! d3 P: U$ Q
    12% _6 O, s; \! K6 U8 a1 Y" S
    13. |: E& J- c5 B' Q& S3 |4 ?
    可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。! e- y$ Z0 p/ `4 H( e) n* ]& y

    ! d3 u8 p) ]& q5 R6 q再用测试集去试试:
    8 k& o# g" _  [* d' n
    - q) T- z. p3 ptest_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
    - L2 z, v9 m( l5 m6 f8 oprint('test_acc:', test_acc)1 @# f; }2 g3 v, p, o: @
    1, ]9 O9 V# E5 c, q7 v  [2 I. b2 Q
    2
    / l/ ]( n$ [# o0 J- P  _1 f4 B输出:$ X0 n* ?( Y5 |4 m" H  R( Z/ T% [

    6 s2 @8 b. d0 E+ `$ J10000/1 - 0s - loss: 0.0362 - accuracy: 0.97898 A6 B) D4 f3 }+ k! [/ K4 t
    test_acc: 0.9789
    7 Z! F& D6 k. d& h% x) g6 V1$ s. v2 {: {% y. i+ Q+ H; _- `
    2
    7 p2 P& j/ H' A8 d) r7 G我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。8 {+ q$ w) i& j  L: L$ h
    ! B. `8 H0 h3 y3 V0 J/ `" ]
    神经网络的数据表示+ Y3 o* K$ p+ s* t" E7 D
      D# N; v* _4 K3 k7 }8 q# ~
    Tensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。$ i* e# y0 y4 U; Z, R" ]7 T

    % O# U- F5 M5 p. r/ V我们常把「张量的维度」说成「轴」。. p1 x. B1 A( w; k

    . x& o' M, n- D1 ~6 t认识张量  ~$ k0 ]' N" a1 W3 |1 Y! y# N9 ], [
    ) W1 V. w* E* f" Q  `6 j9 D
    标量 (0D Tensors)
    : k9 |% J0 r' b& Y7 m
    # J. P/ ?( ?1 g+ ?1 mScalars,标量是 0 维的张量(0个轴),包含一个数。7 |: I3 U: z1 Z! V3 U$ P/ r/ F
    9 x& }; V" w6 _0 M( U, P
    标量在 numpy 中可以用 float32 或 float64 表示。
    9 {- i$ R5 K9 i0 `2 E, j1 z# ~' C
    4 [  A8 c2 ~& }import numpy as np9 ?8 g  E! ~: n

    3 {8 R" ]4 n: h5 ?, k) t, e1 |x = np.array(12)
    4 [/ e) s: ?8 F% Ax& w1 a" V) `, k7 h
    1( x7 m: K3 q7 G% Q
    2
      r/ c" K" ]1 t; M3
    " o. r% |4 z/ M0 m3 l0 B4
    " X; [/ f# l- b- T* O+ C' q输出:8 z) K! e: w4 x% p
    / w* w4 I  C+ b$ j
    array(12)5 S( M, C: e0 W* r% C& |
    1
    - `# Y: _8 u5 V& F7 o1 T2 Ix.ndim    # 轴数(维数)
    4 M+ }- i2 w7 `$ g/ Y) K# O1
    0 m3 p; d/ {# K输出:
    ) G) d3 ~! n( {+ P1 A
    ' n% O2 y5 x$ p' h! d  V) t2 \1
    2 ^9 G" h  A$ b. a9 c* \1
    $ }& s7 W9 ?2 E' E1 y  W- _& z向量 (1D Tensors)1 `3 \+ U! ^9 n$ v
    # ^: S; r" t, v7 Q4 W
    Vectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。, P- L6 |' Q, o6 H8 }: v
    ( v% f$ \5 u2 B) O. J% Z2 @% h! k
    x = np.array([1, 2, 3, 4, 5]). \8 T. c8 w9 N7 n- H8 v* f
    x
    * T; ~: J! s5 t( @1
    ' Y  @/ a/ |9 l. R7 k5 E2* i$ @0 ]5 c1 A
    输出:8 Y$ C+ g' o3 w# Y: S8 h3 o
    ! J$ |; e+ S' {" f
    array([1, 2, 3, 4, 5])' |; p* {3 k3 U% M! l6 O3 c
    1, O) n( [5 C; [( J( U! |, }
    x.ndim. V" E+ v; s4 z* e. k( C- j
    1
    9 M6 b, Y% u" U: A. z输出:
    ' w) w8 B3 `9 g# _) Q; a" H9 A/ j0 C
    11 X7 d' {+ j- X/ C( t3 p  t
    1$ a! d: `/ Y. m; H9 \( [5 s
    我们把这样有5个元素的向量叫做“5维向量”。. c) [+ X- o4 L9 t4 w  U
    但注意5D向量可不是5D张量!
    ! p9 J5 m$ g$ m* B5 A7 w$ r4 ^& Q) x# ~
    5D向量:只有1个轴,在这个轴上有5个维度。
    6 r+ ^  C7 `% _9 q* j2 O5D张量:有5个轴,在每个轴上可以有任意维度。& ?8 ?. s  L; s3 R# ]' \" `2 }
    这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。  P+ [# f( p0 G. }/ ]
    , j3 C+ S! @( c* x8 @' i% v" [
    所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。
    * L5 e0 b% o6 E# p; r. U, ^) A4 @/ N8 ?* P& r* K
    矩阵 (2D Tensors)9 N. J3 b# j; J; Q4 }& T

    ( x) y/ {2 a$ @8 k$ dMatrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。  y4 Y: x6 e  \% W% z
    + R: x* O; ]: c: e' B  m0 o
    x = np.array([[5, 78, 2, 34, 0],7 f8 q! P3 ]& `4 t' h4 p' w
                  [6, 79, 3, 35, 1],
    6 P8 |3 S& y0 i7 Q3 ?2 _0 `              [7, 80, 4, 36, 2]])* `0 E8 i  {' \( V4 g, N: Q# \
    x* B" O+ z7 y8 l6 T0 Q0 ?$ x3 d2 P
    1
    ' p9 M! n, ]0 U: I9 S: L2
    : v/ \0 g0 W, C9 L9 M" u. j- H3
    % L: E2 h! m3 G% e) w7 i4
    , v; ~+ {' `# ?) A# U输出:
    # n# d  I" g; c& [
    ) x% m" @& J/ farray([[ 5, 78,  2, 34,  0],2 o1 K2 C3 e( `7 t
           [ 6, 79,  3, 35,  1],
    5 ?' o& c5 I0 Z: M8 S' R; ^       [ 7, 80,  4, 36,  2]])5 b7 j- A8 E& Y9 z4 C" Y: k
    1
      H6 t0 q! `+ h+ t& L5 r2
    ! V5 F7 L4 W9 ^- v; R) B3
    ' y, Q& F0 ]& wx.ndim2 O0 w# E. H- P! }0 d" i/ C/ g
    1
    + `, ]' t7 }3 ?2 s8 `% @, ~& H输出:( B7 H4 o; k* U# G' J2 e) B" o
    3 v8 T% S/ }0 j6 f3 _' ^
    2
    ; v. I3 K& @- z2 m  `. m1
    0 g4 L  r3 o4 g* U高阶张量- e# \$ r4 E$ f% L
    + `( e/ u, N2 h0 e6 _, g9 C. a
    你搞个装矩阵的 array 就得到了3阶张量。
    3 j* m( o3 j3 i) ^5 h
    # K% o' `7 Y: j再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。
    + L3 k( I, b9 d* I6 v! R* n! [+ d& f. U5 G
    x = np.array([[[5, 78, 2, 34, 0],
    % [! l" v/ ]1 c  d" F9 G. o6 Q, F( F               [6, 79, 3, 35, 1],
    0 p3 f0 n5 Q: F, F. x7 D* e               [7, 80, 4, 36, 2]],+ ^7 m9 p. s" C$ F) Q# U4 p
                  [[5, 78, 2, 34, 0],
    $ v/ d0 `! S2 r) |, \2 w) U5 ^               [6, 79, 3, 35, 1],) ^; X/ e5 E, q! z0 A9 G) W
                   [7, 80, 4, 36, 2]],
    7 w0 ?, y  _- ?6 \              [[5, 78, 2, 34, 0],
    6 R9 T# {2 \9 z, i3 l) @) ^0 q  `               [6, 79, 3, 35, 1],+ B0 Y  t1 g8 n
                   [7, 80, 4, 36, 2]]])
    7 N4 T2 u+ @4 bx.ndim
    % B( j2 d8 |$ m4 N1
    - n: K+ R1 b+ v  a% v2
    . b2 T# Y5 H3 _2 h3% E- F/ N% U; f; w, C
    4
    6 ^% {3 V8 `% G6 Y) I" c59 R& \% ]0 D1 B8 D& |5 r
    6
    ' R5 U9 W) |* {- m/ x7
    $ ^, h. |4 |4 x8 r8 l4 O8
    ' E4 P) w* Q+ B9& k$ E% F; g" S5 a1 S0 |" C
    10+ W9 m7 e4 u% \% S2 g# ~& k; V1 }$ |
    输出:2 u9 m" c# Y( B% o7 H

    # N( d' x, C; i8 }. T% e: j, j9 _3# B4 p$ u% F  C1 J! `
    13 N  i8 p: m+ `8 n7 f
    深度学习里,我们一般就用0~4阶的张量。$ G( L1 a; w( A( j/ V+ b' K

    # s% ?9 x* |  l! Z8 z! E张量的三要素: F" m2 L/ c8 {  ~9 L! Y$ j
    4 f+ h/ q( K. n
    阶数(轴的个数):3,5,…# M  a' V! c4 H( R2 U- H; h
    形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…
      B5 c% h7 ^$ t6 N( t( F' R数据类型:float32,uint8,…
    " q/ {) u( z6 H8 c7 B我们来看看 MNIST 里的张量数据:; I& I) s/ c* y

    1 R+ p! d4 N/ V; f2 @6 N; }9 ~5 jfrom tensorflow.keras.datasets import mnist  f4 C- _# X8 k" l9 q6 y
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data()
    . W$ ~+ J9 U% a3 ?" s$ X# c2 }- ]% J$ `  ^  a* \& U; S
    print(train_images.ndim)
    % k- w0 F; d9 W, S- g7 bprint(train_images.shape)
    3 o. W4 z/ \! Y+ ?; i2 vprint(train_images.dtype)7 Z1 u2 p+ p- v
    1
    2 F3 u( b% X7 }3 A+ S! `& a2& w- R# z% }0 E- \; N+ a
    38 ]/ ?# H$ Z4 u3 d& S
    4
    5 C3 G4 e4 ~( e& Y1 @5
    + f0 R$ g0 ]" W9 p3 N6' q/ Q. j" F& J# m2 F% m6 u
    输出:
    ) l  f- Q4 U( |; c7 j3 Z% {' [" e
    3
    # D4 e" U$ }* i, o) S+ N2 x8 D(60000, 28, 28)# t4 P0 ?' ~& m% Z/ X# @5 c
    uint8
    " `5 T; X3 l9 a& i5 B9 m1
    ) b# N6 d# z2 N3 j: f5 x28 z+ z7 u/ U( S3 f+ T. ^
    33 h& T! ^) ^$ c7 t) o% ~
    所以 train_images 是个8位无符号整数的3阶张量。
    ( K$ _  \4 [" a) ^' T$ s; h7 [! A' ?
    打印个里面的图片看看:7 r; S. z% Q, f, a9 A+ a

    6 B! K3 T$ M1 l: t( ~. f' H$ a9 ldigit = train_images[0]
    ! u( R) P7 l" [
    ' w, U6 k; J/ G% Y4 |import matplotlib.pyplot as plt
    " d+ V# ?0 h0 k7 G/ }+ [+ |4 T
    - A# ^" P# B: v/ Wprint("image:")
    5 P" U! t% b' O; g" Iplt.imshow(digit, cmap=plt.cm.binary)7 I+ w$ i" j, `0 N6 c) \
    plt.show()
    ! E2 X% K/ I8 h# G6 q: @/ N$ ~print("label: ", train_labels[0])7 c1 `6 \; E6 y4 v
    1
      ^1 J0 I% J! A2 V& t' t  v2$ y, e. v8 G' T5 P. ]& k
    3
    4 p# E# C% }2 U& J4
    + R  d9 F- b* |2 f51 g: H9 c# N& L0 e$ K* D. `! j$ e
    60 W, t) d; e' a+ D3 w
    7
    : @$ _! Y) T) d" t8
    1 b, y9 ]# T/ n7 Y; J输出:9 A! H* g) d+ l$ `; v* G

    % i7 M# v/ l6 `' T 1.jpg 8 m  h4 I+ ?% l3 D* A- ]7 O
    . g" Q$ M& I) `# w& [$ z6 N
    label:  5
    / K7 p0 F  y' V% h& y4 g1  b3 Y+ `( ^4 `
    Numpy张量操作9 q! r0 Y! v" v* G6 |8 k
    . C- @. b' f  Q! v0 ^! V0 R4 r
    张量切片:
    ' D! R7 c5 E* ?8 U" _# v" Z4 ]: i; d5 o5 F
    my_slice = train_images[10:100]
    / K3 T! [8 O7 L: p& l4 n& Bprint(my_slice.shape)4 u5 W# E9 A, b+ }3 }
    1
    : d7 l6 a! O) _' W2
    : f' ^# ~' D' a, P6 Z$ l输出:8 R" o; S& `4 r4 l, g8 b% Q: E5 d
    2.jpg
    3 u3 J% {& {4 H! b5 s* u/ ?* F(90, 28, 28)
    9 Z* q. ~9 U5 m1 ?5 x  G5 n" ?+ `1$ [+ j* {; J( Q6 o0 s7 e
    等价于:
    ; Q! E8 D& P, q( M& `
    , K3 {, @3 |8 V; l& mmy_slice = train_images[10:100, :, :]
    # a* I7 k& t, n7 w. Z$ Lprint(my_slice.shape)
    ! m, h/ B9 M% S4 V3 s! U6 S" O8 i' `1
    ( |- G$ J, U6 m* U# `/ Q' Y2
    3 q' q7 m6 s- D; b输出:1 g1 f1 P7 p) J3 o6 x- e! f
    3.jpg + t5 O( p2 V( |- c
    (90, 28, 28)9 _; A2 T4 S$ [. A
    1
    5 }6 x* ^+ i1 n: v4 A7 l0 m( H2 u) ^也等价于
    ! k" S  E9 l  d; U' I' Y
    1 ~8 c/ V5 Q) n( `& T- ^& @my_slice = train_images[10:100, 0:28, 0:28], G( ?: K$ e  A) y
    print(my_slice.shape)
    2 V( ?5 k, |, o1
    ) y- }& _2 l( |, ^0 K& h8 A' Q23 S3 v) b, P" ]; S7 }# z
    输出:2 }  |: m; p  C% [
    . j/ c8 e# ?' K$ p; R  V
    (90, 28, 28)1 U) q: }7 j- m/ k( V
    1
    6 F5 _- P: q: G! h4 Y5 K& y选出 右下角 14x14 的:
    ! v" D1 \# N- [) c, Z: X
    * w) h/ g6 s5 {5 omy_slice = train_images[:, 14:, 14:]7 n* K0 J( z$ e$ {- |  O/ m% D+ v) L
    plt.imshow(my_slice[0], cmap=plt.cm.binary)5 s. L) a- @3 @
    plt.show()- F0 {8 K' d8 f0 B7 {9 T) t
    1: G5 ^1 I. n: T0 o1 ?' x. Y
    2
    % v# T% N# c. F! B3. w0 n2 ?' H5 d  V  h7 T3 c
    输出:2 ~6 J) n0 g9 V7 V
    ) r7 ?5 Z# G4 Q* \* S" a, C& z2 Q

    / ?! G; x* l& _/ b% O, p7 C% x8 m: s% C: v: v# m
    选出 中心处 14x14 的:$ j( V1 s0 }/ m# M
    * Y5 S7 w% p0 T0 T, x  b& T& R7 Y
    my_slice = train_images[:, 7:-7, 7:-7]9 v& I( v# z! E
    plt.imshow(my_slice[0], cmap=plt.cm.binary)
    " a* X  C( c* E3 Wplt.show()
    $ M; u. G5 I4 D) J1 |1
    4 A# a2 s3 \( V  @. X% h2% Q5 p8 Z( n/ v/ E* \
    3
    / |  K1 L0 Q4 Y. L' Y输出:
    - n" s' u% t! E" D; ^$ ^" Y% e9 @3 @5 {; m/ E' e

    ; b4 m+ m& r7 d- z- ?8 A- E5 l1 v9 r: |5 c: j+ R) B; s' j
    数据批量
    ; r* U3 x) f$ d1 G
    8 @8 \7 ~( R( Q' |2 h9 H" `深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。) b3 q+ l1 ]" N- y3 b  G  `
    6 K6 L5 G7 N. C0 m0 J% r; U' z
    深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。
    + ]# r( Z7 @/ v* k) O- g5 h- h5 D2 D/ w6 w, x# j
    在 MNIST 中,我们的一个批量是 128 个数据:
      \! ]$ Z& V9 @8 k2 r, y! S4 ?- b9 h, P
    # 第一批8 z2 u- r, E4 O% |4 R6 R' v8 R  \. z
    batch = train_images[:128]) e+ W0 k( P7 {
    # 第二批& g3 u  C0 E" v& i) X9 I# i4 F
    batch = train_images[128:256]( g; h" T2 M& t+ ^2 A4 A
    # 第n批. U- V! y4 y$ b4 o( r
    n = 12
    9 U- n, G( x4 P4 p  ^/ b$ wbatch = train_images[128 * n : 128 * (n+1)]
    & E' d/ g8 E1 N( A. `6 o$ Q4 o7 {1
    * o0 \5 g4 [' l+ ~, i. j2
    ) r: {. R: p' P7 [0 Q4 `3
    ' O7 X( b$ P* b+ ~40 }1 }" s" ^/ f
    5
    ; x. |$ `; ?1 Y& F: {; L3 ?! y6
    7 j1 {4 G8 i2 o1 ^, b5 w0 J  a7
    0 A) A8 \3 p9 m) W2 f1 {  v! d所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。1 g+ H/ |1 _  x$ d4 p; G7 i
    4 G2 y/ A% ^8 G  i  M
    常见数据张量表示5 w1 p8 u/ P, O6 X6 d. ]. z
    " m' Q' k4 n0 p( Y0 Y  y& l1 \
    数据
      X3 W$ q! A1 M$ t9 N. R8 p
    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-2 22:38 , Processed in 0.425805 second(s), 59 queries .

    回顶部