QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 6604|回复: 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
    5 P: J4 n" t* F
    Python深度学习之初窥神经网络
    + l# T$ l8 f( n1 t本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。
    ( P) Q; T" t6 N) `  C; }1 s% w% G+ N$ q4 {7 H0 J+ ?
    本文目录:9 L/ `3 n. M0 O) N/ }8 i; k9 M
      Z  g; r5 O! R4 `+ q+ k! P% u  e
    文章目录
    # e  y0 p& l2 [9 E0 ~- g3 c5 J. _3 X+ R7 @
    Deep Learning with Python4 s& Z: l2 W) q; V3 q. n8 M5 e* ~
    初窥神经网络
    5 \+ s/ P9 L' ~7 i: n导入MNIST数据集
    * m6 `5 ~# M' H" Y7 }2 N网络构建
    , A9 D6 W) E) O$ {* x! L( T( w. T编译
    7 l5 [; g+ b) f' ~3 {. c预处理
      Z0 T* D! S4 }4 ^图形处理- w  F) o7 \8 C7 l9 ?, {* |+ s( T
    标签处理
    - |0 x$ a) O1 K训练网络9 o7 \7 V2 s3 D7 V% N  A3 F2 \
    神经网络的数据表示
    % \: Y* l! s  T认识张量
    : U; Y# f7 O0 Y* ]) _标量 (0D Tensors), |: W3 ~. w9 A* ~* h
    向量 (1D Tensors)
    3 Z% z, h8 J( x, ?% T2 J; f" h矩阵 (2D Tensors)
    9 G; }; ]" K9 q  V% @' J9 T高阶张量
    % T) @9 b7 a7 B9 J张量的三要素& H) ]- C! H1 g3 t$ v
    Numpy张量操作' f0 s: {$ W* s7 |; D' i
    张量切片:
    9 o) _3 B: h2 ^$ _% L: B数据批量
    % `/ X! {# Z, m) v' S常见数据张量表示
    ! S+ e% |1 J2 c: x- T5 Q8 i* W) X神经网络的“齿轮”: 张量运算
    3 m" a: I1 }% y3 P逐元素操作(Element-wise)
    8 q2 W' T+ q+ z0 i9 P. g$ X广播(Broadcasting)8 Q  X( w- B- N% o
    张量点积(dot)
      a- N, G8 p+ X# B6 j5 T9 ]张量变形(reshaping): s# [) \/ T! l
    神经网络的“引擎”: 基于梯度的优化
    5 ]6 D3 d) G/ B2 x* Z1 ^导数(derivative)% T: i4 p$ f5 ~9 B4 g$ T4 H, `
    梯度(gradient)( H) l1 u0 ]3 t' K
    随机梯度下降(Stochastic gradient descent)
    / g* w9 T' c+ c" e& B! ^/ l# A反向传播算法:链式求导
    ( b, Z) r. @3 ~& @本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。
    0 M9 }" b/ x' D' s2 h1 P' l
    3 j% b# q1 d& Y初窥神经网络
    2 q1 D7 m. ]. P9 n; g- I" F3 \+ i
    学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。% O0 r. f# j( x& ]: M$ |. o
    9 ?$ A' q  e) I0 _1 ~+ _
    MNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。: D7 I2 p2 L% _- U: c- I
    , M$ @, f3 R% q9 W" B
    导入MNIST数据集
    0 Q5 ?. e% M! _8 T5 M3 f" ]! H: j, {* p  {) f* A: o
    # Loading the MNIST dataset in Keras
    8 Y0 ]1 a- d) O6 i$ v$ ~from tensorflow.keras.datasets import mnist
    ( C( q; R- E. s( i(train_images, train_labels), (test_images, test_labels) = mnist.load_data(). Y1 l  ~% Q: H( ]' u' _3 g
    1
    6 g/ z; q6 g3 d: _2
    7 h4 ~; A9 y3 L3
    3 m1 D) b* O. n/ P* F8 ]看一下训练集:
    " h4 q& h8 A* f5 O% l7 Z% Y# x4 K; G) ^" {$ y! P
    print(train_images.shape)
      \) j( f" [9 [& g- T+ Jprint(train_labels.shape)
    : Y( _* s. V& |2 E) o3 ztrain_labels
    # v  W% d4 Z7 Y0 b4 g4 W1  C1 Y, o. w2 a( N; ~7 u
    2' [2 S8 e8 \4 B
    3& T" O* D4 }9 ?3 H! {
    输出:0 s1 K- t1 t9 k" k# Q" j* O5 F$ u
    % j; C6 ]6 \* ?
    (60000, 28, 28)) ^& W$ x: J1 _5 i4 Q$ k4 l
    (60000,)8 W( N6 V0 x* [( \

    1 ^/ S9 R: q! Y3 M" T- H* uarray([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
    . B4 P) G  \3 `' [7 n( F+ A1
    . w, u# s# Q0 M; w9 T2- E, o# F# @2 n
    3
    & x. u( |! h. y4 U& ?8 F0 x, ~4
      d& V8 j6 H1 S9 w3 j2 i' J这是测试集:' e) @% ]: B- r% E
    $ b6 y" t9 c2 L* _; S+ ?6 n2 J3 t- S, |
    print(test_images.shape)* g4 R: R9 A' H% c
    print(test_labels.shape)
    5 B  B+ E; O- F6 s5 Ptest_labels9 o' Y/ |+ S8 x) r2 C. E3 |& I
    1/ g4 F# B" u! J5 x1 |, d$ g
    2* i9 A. ^, V9 |& q7 ~# g
    3: Q, W5 f( N* u
    输出:
    6 G; R7 }! c0 u" _8 F1 x' r: [
    ) W' ^3 x) A. l+ A7 k5 \(10000, 28, 28)
    ' m( s! O. h4 i(10000,)
    " \/ ?/ o2 R$ O" z, {2 M* K+ S( x4 V
    array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)% R$ W; D& A- A7 D
    1, t5 M( \* Z% X) p; r
    29 D$ }* u  G0 q( p
    3
    6 o; ^9 H4 ]1 {5 V4
    , V% h9 V1 f' p5 [/ U' z) H网络构建
    , y( ^$ o9 a" A
    8 T, L/ }7 Y0 T( R" v; x我们来构建一个用来学习 MNIST 集的神经网络:
    1 l! z: X7 h$ S2 Z! U% X  H* ~, v1 ]# `
    from tensorflow.keras import models
    ' N+ \6 ~# ^% a" h" {from tensorflow.keras import layers
    ; O3 c% r; w) E" b
    # J5 ~1 P: d; i" X! y3 E" Xnetwork = models.Sequential()
    1 c5 P& N4 Z! s" j7 R  u6 Qnetwork.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))
    * X8 z/ T7 X9 E3 B! n# _1 z# Dnetwork.add(layers.Dense(10, activation='softmax'))
    - d0 B/ s7 U1 k: ^3 Q1
    : |2 G5 @' C- B4 N: ?$ w" F$ n2
    $ P7 O) b' r$ {" w3. y0 I7 A: U- W  \' c( Z$ H( |
    47 |+ S8 d+ M9 Y' Y/ w. K. }5 d
    5
    7 l9 B6 L9 t) o/ K* i65 K& G9 r8 k2 k3 G
    神经网络是一个个「层」组成的。
    : a2 q9 ~. v8 t- n% f/ Q8 G" r一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。% f3 Z1 ]  e, O" g2 V; U% Y" i

    ! z2 \( b' A( @! j这样一系列的「层」组合起来,像流水线一样对数据进行处理。
      V9 y& i! |# u7 H5 b, x层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。
    % C2 p! ~! F% Y1 b$ O- B1 u5 Y2 Q; T7 b. x" W) {3 b
    我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。. }- \# J; H3 [! A  `( B
    4 f: U& p% [! ~* \& `" B
    数据到了最后一层(第二层),是一个 10路 的 softmax 层。
    & \# O% w8 V& I- P, i. i& T这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。! d/ R6 E& _* m: q. m* q4 V" N7 y2 Y
    事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!
    2 ?2 y2 G2 P' e1 L% ^& j" |: ]
    9 U$ q' p# r9 n( d8 b编译( l$ B4 x4 t- Q
    7 c! c, ^; n* E) H) m/ R# E; ?: \
    接下来,我们要 编译 这个网络,这个步骤需要给3个参数:& z- Y. c& B) N- l; |

    8 @! \* _+ `( G: h. D损失函数:评价你这网络表现的好不好的函数
    : m) U& Z$ }# |: u优化器:怎么更新(优化)你这个网络* [' g. P' x  d$ m+ z. U
    训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度
    " |; T6 _: k: o% z/ dnetwork.compile(loss="categorical_crossentropy",! F9 j2 t6 U5 [2 |- |
                    optimizer='rmsprop',( H1 U$ s* P/ O/ ?8 H, l: ^
                    metrics=['accuracy'])
    - H, Y5 y+ E. u% n6 e17 o. N% S# P9 T7 Z- Y$ O5 X7 |
    2
    : d9 @: a8 m# ~: m) I8 k( T3
    $ r7 {/ H$ S# O) H' u+ u6 E预处理6 P" d* i" y1 T: @8 B" h
    / d- x0 B7 Y! q4 T  c+ V* U1 p! x
    图形处理3 E  u7 s/ H% Q: s
    ! f6 R, e% t) [2 z/ d: K4 j
    我们还需要处理一下图形数据,把它变成我们的网络认识的样子。5 C& ?. G- V4 X0 m" I& P
    2 V' I& f8 m5 _4 P) @5 C  w) Y
    MNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。
    - C1 k( V' g3 D& C( l8 Q* b8 P而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。
    ' r; p# g% ~& W# \( |% t0 B# z4 c: D$ e, q  K) Y
    train_images = train_images.reshape((60000, 28 * 28))
    4 n( O$ y8 ^1 d# U# _train_images = train_images.astype('float32') / 255
    $ k* ]0 ~7 b7 A# `$ e( ]# E( P9 `5 o) `' [
    test_images = test_images.reshape((10000, 28 * 28))
    " W% w1 u$ L4 U' D6 ]/ Otest_images = test_images.astype('float32') / 255
    " k0 A4 c# i$ O4 b" w12 e. w1 ^# U0 w0 x5 k) b
    2" ]8 V* b1 }4 y- T" b9 A( w7 _3 s4 C0 X
    3
    ) K1 i' q$ z9 K# G40 C3 \- K7 ]  N; o" s/ g, f9 w
    5
    " i$ @; a! J2 x) U9 s1 z" t标签处理
    7 I" d$ d: c* j' w0 {7 K6 H+ C% Y
    / c# {% H7 e7 {同样,标签也是需要处理一下的。
      h( m8 X8 D& E- K- c( M$ I
    9 U3 H6 j7 J# n1 Qfrom tensorflow.keras.utils import to_categorical
    & H& n' L: h+ T% f2 i2 k) G
    - ?, ?4 o+ p3 utrain_labels = to_categorical(train_labels)
    ; V. i- g( P9 C8 O# etest_labels = to_categorical(test_labels)
    4 C! z1 ?1 l3 |- v& [/ b7 Q1
    7 P) v) W* Q6 W9 w& c$ q4 w7 ~2* V6 k8 Y0 t! H$ K6 K
    3
    3 y8 c# e! N% ?2 D" U& M* M4
    ( R, L/ V2 \; ^9 x* R' w3 f训练网络
    * x7 O) m) K0 }8 |, c( k6 @( d* |( Q6 s9 A. u
    network.fit(train_images, train_labels, epochs=5, batch_size=128)
    ( e: t. v$ S% e- g, ?- L1' _, B+ U$ D: c" r3 D. t" M$ Q
    输出:
    2 U& m$ S( s0 S
    5 q5 [- q1 o0 ]$ ]" i  WTrain on 60000 samples( f) r4 Y6 O3 R
    Epoch 1/5
    4 J( l) d" E. q6 @# P5 I) \7 W60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254; \3 [. t* t1 h* u  t& q+ m1 W
    Epoch 2/5( f8 T  X3 c+ l
    60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693
    % ?6 H; p3 y  O. |$ t  D( B$ rEpoch 3/5
    1 s8 H5 a1 u4 u. n& ]  W60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800. L. M2 n1 q" k( E4 M
    Epoch 4/5
    $ M8 |$ E" g  {! x, G" @: r60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848
    ( R( W, V# V2 E& A2 BEpoch 5/5
    ( D5 ]0 N. h0 z$ ^- X60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888' v. m- @9 j3 b

    ) n8 `1 W. Q  Q  M<tensorflow.python.keras.callbacks.History at 0x13a7892d0>; ?; j/ d, E  y
    1
    $ ^- t/ W% C' C" R, c4 T, V/ C& Z2
    + M6 M3 B+ r! a4 S4 }% p8 F30 X+ h3 E4 O' s
    4
    ! }9 H6 d! a1 {3 O; _7 Y& v$ r% G5+ e4 D# B8 s5 C- o
    6
    5 d) d+ r* V9 V9 l8 C, r, u; l72 ?/ X7 b4 a+ f; K4 f* h3 e9 D
    8
    . E/ ^; r; F% W2 b9
    " D, u0 ?+ ~/ ?6 @* ~( V10) W: T" Y5 f/ k
    11* I& e8 O5 i& Z8 m, E
    12
    3 o6 d7 I" M! G, K, m; U  g3 j136 n5 {# j, T" G2 ?
    可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。
    $ \( ~! m3 C" G; r) M) ^! L) Y, ^0 Y4 O$ k1 A2 _  o
    再用测试集去试试:' s# d5 |" a0 S' \7 D- R5 ^

    % b3 E3 W  t1 \- x; |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; X5 J3 C8 P% }9 W3 l% j- V3 j
    print('test_acc:', test_acc)0 \4 \0 ^! ]9 S  n% R% R# s$ N
    1
    % }$ n, p. y4 d2 {- h0 R* Z! H# y2
    8 [. f: q: l% N: \. w输出:
    ! m# R% h/ K; a! a6 F9 l5 S* V$ i, m) q! z1 ~2 y9 u( m' B% B: B
    10000/1 - 0s - loss: 0.0362 - accuracy: 0.97891 O+ V/ f' N1 |) M% |
    test_acc: 0.9789. P3 w& c1 M3 x2 N- o
    1! L5 Q8 t0 S) ^0 a# @6 @
    2
    0 Q- d* g! r& W& n; s0 f我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。" n  e$ X3 b+ Q# u$ k

    % E4 Q3 m$ W. `; F: E神经网络的数据表示
      Z+ }% o, L. I0 \; [4 m
    ; h  T; V% G% I) O- STensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。: y' P: }% `, R8 a# V- n
    : d! s4 N' L8 E2 H, b) K0 O
    我们常把「张量的维度」说成「轴」。9 W. u8 C' V9 w- N- y
    ' m, C7 z7 @- I) J* e- ~, @
    认识张量+ h8 x  G  _  ~! e. y

    7 ]; |% T- S$ m1 P' F. L2 _" {标量 (0D Tensors)0 Q& d; C* G# g0 |& g5 p- U
    ) ]" n, Y. p! k. P# Q$ [
    Scalars,标量是 0 维的张量(0个轴),包含一个数。+ Q2 I6 [6 C" P$ P6 G
    5 n5 }. y' [7 W) @* K0 c
    标量在 numpy 中可以用 float32 或 float64 表示。
    + P) \, I+ H1 J" N5 i- P' C0 F( V: P% c- r4 K* ?2 ~8 d2 z2 J
    import numpy as np
      J0 _% D" G, B' w$ k5 y* O- _2 N6 V
    , X* T& C) r) Vx = np.array(12)
    ' H. M# U9 c; `" c# Vx
    0 J1 [) }- E& {4 q" Q1
    ! M5 v" {( B/ B1 U$ S/ G3 P25 s; V! F$ j2 P/ }% a9 K+ [6 R8 f
    3/ [( M, h* l# X; l
    4* f: `: C' h$ @
    输出:
    + I2 ?- ^+ Y8 {: Z9 N/ s8 k  I! T- `( q) h' q; j
    array(12)
    1 |6 d% B2 P6 C. Y3 l6 t1
    ' Y# U( [8 h/ kx.ndim    # 轴数(维数)
      k) k* E" F" T. J/ t1
    ; q- E4 }. K" f1 ]5 }输出:
    " p  F  f# t1 _1 X; M+ K" n7 R, A
    1! g' D) ?$ W! T+ u& s1 ]$ O# S3 m% o
    1
    3 C3 W( U2 P- N向量 (1D Tensors)
    " D+ c) ^' z/ V, t! Z0 Y7 H
    $ B$ B) Y( D7 TVectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。6 M' ?% n3 y$ V

    2 O! _2 b2 J$ F% ^# Lx = np.array([1, 2, 3, 4, 5])
    " L. g  |- H5 `# S+ lx) A& t7 Y" l' c. w  G8 S4 Z) ~1 H
    1$ s" V6 `% D$ v( R! H4 s$ d9 z
    24 X% i" U9 r7 s6 F3 }2 |3 w4 N
    输出:' c# Q  O6 ?0 I$ D0 \2 x0 u

    & [, P6 A) ^. B$ i- Y+ v1 w- ?( y3 ]array([1, 2, 3, 4, 5])
    $ o7 ]3 C2 A. Z" I1 Q1
    % f) {& y8 z' J2 g) M  [0 C3 [( [x.ndim5 R" E; v& X. t6 B# {" ]9 i. @
    14 ?8 [8 B/ j' k& W% J) p
    输出:# e' v0 y  B! }  [

    6 m. c$ t# x3 ^2 Q3 z9 u1. {; Y6 |3 `6 @4 \& J: b
    1- g9 X' T3 [& }2 e5 C$ w
    我们把这样有5个元素的向量叫做“5维向量”。
    & O+ @6 t0 z5 N+ U* W但注意5D向量可不是5D张量!6 e' t5 F  X& c  |

    2 N2 {+ ^0 P: y6 W1 V) m2 o5D向量:只有1个轴,在这个轴上有5个维度。
    $ ]  Y( |- s- h5D张量:有5个轴,在每个轴上可以有任意维度。
    1 O( i' H8 h9 a( W这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。
    " n: f# `8 f8 {/ |1 i5 f8 `; z# W+ d; s/ r
    所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。
    ! u# k8 m  f- t. m; c& M
    " i  s9 J( D7 N! t矩阵 (2D Tensors)
    " g, {' O  B' C5 m
    & T2 m9 f$ P, \% B8 IMatrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。/ i4 B# N' H! T* }4 ]# U" ~  K* [
      }5 H, H7 S6 ]& @% M% b
    x = np.array([[5, 78, 2, 34, 0],9 w: U6 R, w2 M2 S4 S+ E
                  [6, 79, 3, 35, 1],8 @; A( T! G3 _0 v# G
                  [7, 80, 4, 36, 2]])
    ' a$ _4 w' |. ^: ~" lx; Y8 S3 V8 R2 l' z! H1 r7 {. _
    1
    ' j- {+ i8 N6 \3 U1 X4 N8 M2
    2 N  f5 B0 ^8 t- ?2 u0 F3
    6 u/ m0 H/ J/ C8 r4
    . K, M/ L0 X' i1 O1 N输出:
    $ ^" P6 Z7 \! o! s! _  {' p7 X6 n2 o6 [
    array([[ 5, 78,  2, 34,  0],% i2 I. G8 g, ]. u) K: W- W8 m0 p, T
           [ 6, 79,  3, 35,  1],
    + F+ _3 k2 D1 A       [ 7, 80,  4, 36,  2]])
    : V# v/ J3 q+ x: i7 t  Q1
    5 i3 H7 v* S; i! {& {( U; s6 w8 w2( q: x4 @7 Z; c7 M* ]5 A! B# k/ t
    3
    $ o" m; [& ~& ux.ndim
    6 k; q* R- e$ M* s: c1
    3 Z; T. p7 r+ f- M& G4 t输出:; p" _  V% c3 a# ~
    & x. B- F; h8 O" a! t" ~* n
    2
    $ J5 U: Z1 `+ D8 t, E6 W1
    & e" U9 Q# v1 _3 l) G  F" ^, J高阶张量
    ; W/ ^, B" j1 b, W1 C4 G
    , E' O5 J9 r1 j* A你搞个装矩阵的 array 就得到了3阶张量。7 {8 I8 L# b4 B" Q$ h% [
    ! d; n; U8 b2 n2 @4 e' H' H
    再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。9 W2 X9 s5 }  I, X. M
    - i# D) t' [' ~, m$ c, M" X3 K
    x = np.array([[[5, 78, 2, 34, 0],
    + O& {  u  R( w, K! n& v# b9 i               [6, 79, 3, 35, 1],( |- I+ G0 U/ Q( }2 y/ A
                   [7, 80, 4, 36, 2]],
    . F& z, k! }% H0 h$ g              [[5, 78, 2, 34, 0],$ J0 _- a4 v# o9 m
                   [6, 79, 3, 35, 1],
    . G4 r( n" E- g& O1 p1 S1 w               [7, 80, 4, 36, 2]],. A% U- m: j1 E4 q' {3 K
                  [[5, 78, 2, 34, 0],
    : Z6 z# J. p/ T# a9 p               [6, 79, 3, 35, 1],- N' A8 C. M1 Z- z. W
                   [7, 80, 4, 36, 2]]])1 _0 d3 f9 B1 ]) }* i) b
    x.ndim
    ' g5 @, r' Y1 s1 P4 S* e8 J: R1" V" u: J" V; K3 z0 `0 {
    23 I* u% X. `9 O
    3
      ]2 L7 V2 A  m) v' S/ m) h% e3 o$ I4
    ) U0 m  ~; k" u5
    8 V* a; Y, M, w( u6 K: S6
    ) w) q: G+ {" j: y76 a0 U1 U& L9 {1 |3 _4 U
    8# E" s/ z3 y/ u- K6 Q2 Q  `; @
    9& w% B* j( k; P6 M) y
    101 A+ n2 r" G5 [8 b% P4 x0 r  ]) B7 D
    输出:/ F  j( t" w* j* h/ Q
    9 Y- g: B. d3 f( }
    3
    4 J; t2 o1 Y0 C: h1
    / o- s, t$ V: Y5 q9 b深度学习里,我们一般就用0~4阶的张量。0 Z& H* C. J8 c9 u0 b$ K) C
    1 l2 M% F1 a  C& u8 N
    张量的三要素3 V4 m! n  z2 x

    & l3 n5 ?" ^& v0 j- K8 |阶数(轴的个数):3,5,…, Q* B& @+ E  `' b$ N
    形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…
    5 a% h3 d9 n! z2 V. {$ V* q数据类型:float32,uint8,…
    # F2 k% ?1 ?5 p9 P" v3 t- O5 B/ t' ~& n我们来看看 MNIST 里的张量数据:! z  W- o' Z2 T8 _/ y
    ( y, N. I/ D7 U9 C
    from tensorflow.keras.datasets import mnist
    * B1 v  s+ c2 ^: M" ^4 v(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
    " ^# R+ ?# H- o& o% E, n6 v1 J, T' U
    1 F" C1 N+ h; Q2 r( \print(train_images.ndim)9 ^* B6 U$ ?" X
    print(train_images.shape)
    % `5 ]  z+ a( j7 c" X- _print(train_images.dtype)
    6 y: z8 X  m* N1. W! ]2 o1 Y7 _% c
    2
    " k9 C0 L2 |1 A8 M3 @3, P! z9 J6 M4 s0 S
    45 C1 c9 c. N8 r/ k4 V9 P
    50 l: I( ^( S9 S& q. y' \0 ?5 A
    6: i% j# K; `# C
    输出:
    6 N( y) `  O" X5 ^# K9 B9 H5 g0 n. q, q8 Y, [- p/ Y# d
    3! S7 f! [: M0 {0 U
    (60000, 28, 28)
    " [6 |2 i) V( }0 i2 X! d- E9 muint83 e4 }$ ~! q: G4 g  z! x
    1
    * s" [6 o. D0 h. H/ q( t2; N( n3 U, K0 Q* b6 U  a
    3
    # w" J& V3 c2 \- |- @所以 train_images 是个8位无符号整数的3阶张量。
      A- p' \% |6 d1 B2 @1 r8 v6 |; Y2 s8 c: G  V& q
    打印个里面的图片看看:
    * g. F1 {: p  [
    $ u1 K  `3 K  t% \, ?4 X% ?8 Vdigit = train_images[0]3 @/ T4 n+ ^7 V' y0 T2 W6 u. S

    . ^+ l$ d/ ~* H  R0 z) Himport matplotlib.pyplot as plt
    $ J/ A3 I8 d  n0 g  G" A
    : ]! Q" m: @) A3 c/ w2 e6 z# S( ]print("image:")6 K( P7 s7 r* P$ A% \
    plt.imshow(digit, cmap=plt.cm.binary)( k( Z; M$ X: k) S2 L, T3 @. p
    plt.show()& }, U; G9 K! t( @
    print("label: ", train_labels[0])
    $ ^% G/ Q( R" ^3 P# S4 {6 T1
    3 f; F& P% P- d& w+ x5 c$ _; I24 K% }: e; c' V% O* v; }
    3- B, `: r! S( h- |6 M: E
    4
    3 B/ I* o) N) W3 s) [: _5
    : Q- D" z- s) }4 [+ j6- I, A" |; Z6 s, P  t( z
    7
    7 v9 `1 p1 L8 _+ X8
    * @( @+ s4 V9 [/ D4 M7 S7 r输出:
    4 G$ K  R$ f0 _+ |! ^& Z0 N( B- N
    1.jpg
    # t/ O' h9 {! L+ X+ Q' x$ @& W4 H1 o% N% x$ r0 U7 ?$ x8 k
    label:  5+ h0 O$ s$ e8 P! M( x
    1# ~& n  q7 _# s$ ~8 g; s
    Numpy张量操作- H; z. ]& U# V. W

    6 Z: U& }- V0 i$ Z1 I6 k张量切片:1 s) B& Y1 Z5 |" e  k8 D& B9 A: H

    2 h+ S: F: W) ^' C; n9 tmy_slice = train_images[10:100]
    3 f! U) D, B$ Q$ ]; a. cprint(my_slice.shape)+ U* ]! s" ]6 ~, s0 t
    12 H- }6 K" A8 ?! G
    2: c9 a) E# x  ^; X. i2 a
    输出:
    : L, y* v) t" [0 ?# h8 C 2.jpg
      \2 ?' }# c9 {4 n(90, 28, 28)3 [& R, ?3 {# L% j
    18 V4 p" W/ K7 M' m0 S; S
    等价于:( \3 u4 b" L# s7 m1 t0 n
    6 ~- i" U9 x3 Z
    my_slice = train_images[10:100, :, :]9 m( W1 R$ d! G: s5 S; a8 w. K7 c
    print(my_slice.shape)
    5 E5 B( x2 T+ ~7 ^" |1$ G; [1 f' e+ l8 ^& z7 X/ ]
    2
    7 T2 D/ G! b, b0 J& z, |输出:% H  M% x! E/ g4 A1 B  M' H
    3.jpg
    0 a9 |! U! b' T) \3 v$ _(90, 28, 28)
    ! ?& e  K; D$ ]6 {: ]8 `; A1; w+ o, `/ o* X- ]- G7 |, y
    也等价于$ J  U. Q0 x6 X* r* y/ \

    ) N4 M& }6 S4 a/ L! I$ lmy_slice = train_images[10:100, 0:28, 0:28]
    ; U# s* I6 k0 a4 eprint(my_slice.shape)+ L" W- o$ ^5 u" B: t
    1. u0 u# ~* v( w9 x
    28 J0 W: f& H0 L1 K8 X
    输出:
    $ A6 K" C" L) O9 O# Y. }9 i; H4 j; t; e7 F5 t
    (90, 28, 28)2 ]7 j/ @# Y1 V
    10 e, Q$ A8 e$ h* E; @8 y/ Y+ Y3 v
    选出 右下角 14x14 的:
    8 T. j2 c8 Y& m: k0 u8 Q
      e8 N+ r$ w# v1 ymy_slice = train_images[:, 14:, 14:]
    8 ~: d3 L& n7 Xplt.imshow(my_slice[0], cmap=plt.cm.binary)
    + Q& |, D' H- z  [plt.show()
    9 F6 I9 k5 I1 V3 ^/ ]1; Q& ]: v) G  X: c) Z/ Y% D0 w
    2
    ( o6 ^' _3 @) ~& q7 h3
    & B8 c/ z0 z% ~  Q5 c  J1 A9 L4 I输出:6 P* ]4 t# U2 a+ h" F: Q+ X; h

    + E2 H5 R  Z2 A' X8 j1 {+ [, S9 T3 B. q: g
      F- ~/ s3 c2 \  n
    选出 中心处 14x14 的:
    - @  a* M4 P. |- Y7 e
    ' X3 G. Z  r- [& M8 H+ vmy_slice = train_images[:, 7:-7, 7:-7]6 e& ?9 ]6 o+ W7 N
    plt.imshow(my_slice[0], cmap=plt.cm.binary)
    2 y/ I5 n3 r  y* V, Iplt.show(): a8 G: X" y, p6 a  Q. t
    1
    + _4 L/ ~8 X+ I2
    : o! _3 D/ ?: F3 l% y3/ ~4 b2 I" |8 W  T
    输出:
    7 H1 c8 X% S9 j4 P6 N' D) |& Y& p- o' P1 |# M! l* q7 m% c/ r9 d
    ) d- _( K/ j" L% H8 _8 t% n
    : b, X! u# ~' E
    数据批量2 S8 O" k$ i+ H$ J) e

    ' @1 L. X; [( r深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。* M# }% a, t# ^" t! {* H
    - E$ J2 J; C/ s" U$ Z
    深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。
    ( R" R, U, H% Y& V4 O; ^+ h; g+ x8 N) ]$ f6 o
    在 MNIST 中,我们的一个批量是 128 个数据:
    7 i: {# {6 Q$ `3 e0 g- f/ f# c% R. o, ]* ^5 X1 M
    # 第一批
    ; ?$ w; t  b- ]# B  bbatch = train_images[:128]
    * L" N: ]0 z8 ^; w  d% o& B2 \2 w  V  j# 第二批
    + \0 z6 }) a8 i4 v" h4 p* Ybatch = train_images[128:256]
    1 M" n; C; U3 G6 n# 第n批/ f  q- g* p3 N, H5 X* B+ z
    n = 12$ Q( z8 W1 w  F! L4 Q6 F! N+ {& x
    batch = train_images[128 * n : 128 * (n+1)]* f0 c! H) L, b3 f5 c2 B* U
    1: i; T. l4 K. |$ L8 C- |
    2
    6 T+ t/ o, H3 Z+ a+ @- \3% m" P0 x2 a) Z/ g
    4* K6 o7 {9 ~; c- r! |. _$ y' Y
    53 e+ j1 Q& q  ~
    6  D+ `- [9 k7 }' M1 e: |5 @
    78 O# ]( N9 b, @( V% L! P  z
    所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。
    " v- Y: d! f% H* e& K
    # a) o, Z- X# D. o+ I" x' `常见数据张量表示
    , e2 ^2 E" p( _' w  i2 I  |: f! M. {
    3 `; m3 p9 p8 J0 g0 h数据
    # R, w$ |$ H) Y
    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 06:30 , Processed in 2.836170 second(s), 59 queries .

    回顶部