QQ登录

只需要一步,快速开始

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

    + w8 Q+ c5 e4 F; g* m* l5 ]Python深度学习之初窥神经网络
    7 b* }+ X1 p. t6 t! Q; h7 I本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。/ _% D4 ~+ h+ S3 e% q7 F
    * k, ^- X; z* x6 R+ N
    本文目录:
    ; k- \# \7 i0 Y, R8 q; N" W4 y6 A7 d
    文章目录
    % K  ], S3 {( h" o$ Q% z3 M* G) \& }
    Deep Learning with Python% j+ @, a6 m8 R
    初窥神经网络" s8 l9 r4 o4 z% v
    导入MNIST数据集0 T! J$ r3 m/ X7 i& u; D. Q
    网络构建5 V6 B& ]( u5 t, [8 d  B
    编译
    5 Z" y. M! a/ K, _* q0 u, C预处理# w& @; C* b/ W8 W( x9 Q
    图形处理
    : {3 }$ Q+ a7 X! k标签处理
    - ~/ j  g( e2 a, g! _- r训练网络
    % _$ O( y9 U! h! d2 {+ _神经网络的数据表示- S$ Y' _9 Q$ c. \0 p+ x9 Z2 }
    认识张量) e. _7 i. o8 f
    标量 (0D Tensors)
    7 w- d+ ^% p! o. X9 ?向量 (1D Tensors)7 L7 V/ g" }3 h: h
    矩阵 (2D Tensors)1 U8 \* o$ g4 B& H8 M1 U
    高阶张量  B0 E( N4 K7 ^) ]4 ?3 V/ n
    张量的三要素
    " l" p7 d) A; Z$ i/ s" `Numpy张量操作5 G$ H; ?+ V$ F7 {' ?
    张量切片:
    - D: M$ |5 Y/ l6 J% x数据批量
    ) f/ n* o6 Y% B5 Y9 \常见数据张量表示$ n4 k7 ?0 a3 I6 U; N8 L5 \! f
    神经网络的“齿轮”: 张量运算
    6 ?9 L4 D0 U8 G: r1 l$ k% z% W逐元素操作(Element-wise)6 g& r& E% Y2 V2 P1 K7 @, Z
    广播(Broadcasting)
    - `/ c. L  m7 x8 N+ g/ j张量点积(dot)
    / `( `& V1 P- q- [张量变形(reshaping)
    4 ]6 |3 |8 n( ?9 z神经网络的“引擎”: 基于梯度的优化2 y7 M$ d3 u4 g( T" H+ v* E: R
    导数(derivative)7 c3 N- A, U* C1 T" Y# X, G$ e
    梯度(gradient)( }' z- Z+ d3 ]- W
    随机梯度下降(Stochastic gradient descent)
    0 J# Y+ g! ~2 q: w& l+ M反向传播算法:链式求导
    9 `. K+ E+ y# ~5 M本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。) \1 g7 d0 b( O, ?
      n5 Z& C$ o0 P% K8 D6 k
    初窥神经网络+ ]- z  n: j- J( ]
    $ {1 H, ~9 O$ C! B3 G) t7 _
    学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。. ?& X; p7 N# D. q+ D
    # s3 J! O+ G2 E2 M
    MNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。0 c" c. N3 a7 E1 P- k7 }4 G1 K

    - p6 T9 P$ }9 T6 m% _0 _导入MNIST数据集- B) i* R( f5 c+ j( x
    5 V7 f" J' B* ]7 T7 C& z, D
    # Loading the MNIST dataset in Keras3 [7 J9 x! b( b- B( }) i
    from tensorflow.keras.datasets import mnist
    : Q( t; x4 X, h/ P" L8 O(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
    # g5 {. @2 U- O/ j+ ^- N1
    3 C; T0 n3 S0 p- o8 u2
      c' q3 `: J- [: d/ f34 _2 y3 n6 }# H0 O8 D
    看一下训练集:
    - L6 q2 q; F- {
    7 \2 g7 T3 }$ c8 o/ ?print(train_images.shape)* V, C1 _: U5 a* M( p- q
    print(train_labels.shape)
    6 r: P) n5 f& [. m$ M6 n( ptrain_labels
    & x# m- j! }5 M$ G2 b/ ]4 Q1
    . ?+ m* D3 x0 k. K1 \2& v  c! [, O; i- P; Z0 e
    3
    1 y; X, D- x$ o; a0 {) Z输出:9 [" h/ E1 @- l5 v7 t' P3 X

    3 t: \: R* d  D0 I(60000, 28, 28)
    / K6 i' d+ f* a9 v" k(60000,)& m  r6 s/ K+ {" z5 C, D
    * `. t, s; t, G' Z; v. G4 y
    array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
    $ ~& u" p/ @! A9 Z& O1* ^; \' ?' O9 e; C1 W  @5 E
    2
    : p3 y+ u6 k7 C! E3% S- c2 j1 Y# U& i8 {& U4 X
    47 i  F/ B7 V, \: K" x
    这是测试集:- k$ a1 v' o+ y0 h- b$ p! M2 Z

      E- ?% s1 l8 ?5 z$ V8 Rprint(test_images.shape)
    $ k% Q6 l* p; T3 Lprint(test_labels.shape)9 `8 }7 a7 w, Q: t4 r. T! i
    test_labels
    % R* f6 m8 X) _8 d9 w1
    ! T9 c3 |8 Z! i' r2
    * O( R: E& z1 ~$ l$ ~# [3+ R) a. [8 e4 S+ ^  q  D
    输出:
    4 P- B% Z# ^& Z9 N  T* E9 ]! A- H4 ]; S) @0 O; E5 v! M
    (10000, 28, 28)
    8 c2 v7 j# |) d(10000,)
    3 ~" i1 V0 H" G% }4 c7 k; V; {
    ' U6 ^3 I) l4 z  V1 Harray([7, 2, 1, ..., 4, 5, 6], dtype=uint8)+ h6 Z  N( k$ p$ q! c$ [: y
    1) U3 T- w' N9 ]; a6 ~; v. s2 O7 T
    2
    8 o. ?( G7 }+ X4 e! Z4 I  }* q6 @3
    0 P) G4 W: A6 [- A7 T; I0 e2 E4
    ) ?$ O) i- w- ]: R# w网络构建) U% n2 u9 h3 R( n
    # }/ e4 @, w! g: T; h. M/ v' n! K
    我们来构建一个用来学习 MNIST 集的神经网络:
    , s4 V, E! A2 `0 g. U2 L$ I2 \3 i4 Z5 F. `) @- ~0 ?
    from tensorflow.keras import models
    / a# w) ?) e8 @% cfrom tensorflow.keras import layers
    3 H/ U* q# F" v  y" _) Y$ ]" t, [4 w- S3 {
    network = models.Sequential()% \$ Y; ?& Q, `( j: M5 _, F
    network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))
    " U" k8 y2 S7 z: g. L, G0 a  Fnetwork.add(layers.Dense(10, activation='softmax'))1 Q& E5 I& T( L& P) t
    1
    + i( h* l$ I  I- @5 _2" _! c4 j& q  h* k
    3" B2 p, c) v) Z- f: H/ H; s
    4' \# A+ X. {4 w8 ]
    5
    9 K& b& F5 c* q6
    3 X3 C, ?0 f, a% I神经网络是一个个「层」组成的。' x. h6 A; X& A
    一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。+ n" Y% Y; `# R, s% `

    . v* Q9 w* u1 R+ e  d这样一系列的「层」组合起来,像流水线一样对数据进行处理。. M4 ^0 w7 ?' q) B/ D
    层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。
    , F- T8 d8 C+ A& o4 B3 O+ W; n: k( J' }7 o# R0 ^
    我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。4 ?2 Q. h& v- Y
    , `9 `4 A$ g. @' j' l
    数据到了最后一层(第二层),是一个 10路 的 softmax 层。4 d: Y2 K3 i: X! i0 a
    这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。
    ( `' n, H; H: t5 ~) z  A. r事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!
    " U3 i( r* A  W  p! U0 p! u
    ; g- C  Q* F3 ~0 M编译
    - ]: C$ m8 T2 `! i. W$ r( }$ h
    ! l3 X% d) a4 G接下来,我们要 编译 这个网络,这个步骤需要给3个参数:0 D6 `/ b& b/ j& o) j$ o: d, @1 U
    0 ?& r, y; C! `9 T8 w1 z% ^9 `
    损失函数:评价你这网络表现的好不好的函数! B! w8 \$ ?% U( O# i; D, X
    优化器:怎么更新(优化)你这个网络
    0 @3 C3 `+ a7 i0 A训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度
    6 C1 W1 v  k8 o, W# N! L/ Pnetwork.compile(loss="categorical_crossentropy",! L+ Z- D" R# _8 B
                    optimizer='rmsprop',
    + q9 F* C0 R$ P2 l9 I                metrics=['accuracy'])
    % E! P( K) c( U& z1 ^4 \1 o  d: D1/ a  H" T: z  }8 S
    22 V8 A0 S. C4 W( D: o
    3& O2 n$ Q2 e, M6 F3 c
    预处理$ t8 z- u7 _9 j
    1 i) ~$ p" t* }, ^5 R. o- [
    图形处理% n8 y  t, l7 x$ P
    6 f- P" c: P( r: n9 H& K/ a. P
    我们还需要处理一下图形数据,把它变成我们的网络认识的样子。1 v* c! V/ e) n4 B' m

    5 |0 h8 Y- ^9 rMNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。9 s; M8 z% g) H; @5 U
    而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。
    ; q; n/ e1 q8 R! L, u. P+ Q- T. @0 s/ ?. F# t1 |
    train_images = train_images.reshape((60000, 28 * 28))1 P2 b. E) ~, a* O/ \
    train_images = train_images.astype('float32') / 255  I) B; }. j$ X, F

    0 @9 Q7 M  @; _5 f9 j/ itest_images = test_images.reshape((10000, 28 * 28))2 Z% u1 }8 s. ?; z% ^
    test_images = test_images.astype('float32') / 2557 J% Z$ Z5 s9 K! J
    10 |* C% \$ l$ ~! {5 k( Q5 c
    2
    + r# d8 y1 N* S# P* _( J9 N3
    9 U& E7 ^( C' \% j  T4
    " w. C" x$ L4 T, L' r& K- X59 n" e7 F: c9 {- M8 [' r6 t
    标签处理
    ' W; x6 x, C7 }; v0 \4 _* Y/ t  b. m1 Q# D0 K
    同样,标签也是需要处理一下的。
    4 |' E5 J6 u  ^; B# e2 E0 N# {# M$ P5 g% @$ r9 ^/ o: @0 i
    from tensorflow.keras.utils import to_categorical1 N7 \4 [% ?' J7 O; f

    4 A7 T$ L: H' m) M2 J3 R4 Ctrain_labels = to_categorical(train_labels)
    " w4 O3 s# s7 W, Rtest_labels = to_categorical(test_labels)6 m9 q5 E! ^) M7 d
    1
    . C7 P. P+ ~# J) {26 n4 o/ N& Z% V, ~5 T0 S6 A, R
    38 A/ N! z7 `& r2 W" c4 Q
    47 E4 L! ~' P1 ]; x) f: d, N
    训练网络
    / e' _9 P8 p/ z; ^: Z' m/ Y! J. N8 Y: x( l: B) w; s
    network.fit(train_images, train_labels, epochs=5, batch_size=128)/ G5 {6 C2 K  H9 ]; X
    1, w& t) q" J2 \2 |! D
    输出:
    4 [3 ]4 l8 v% X7 p. |6 c( s/ x& I  ~6 Z& ~* X& J
    Train on 60000 samples* d& R. T  j/ P3 N0 s
    Epoch 1/5
      T: W% |8 c1 f" f8 C3 f& a& E60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254/ m1 d$ t; g: K
    Epoch 2/5
    . _, x' v+ O4 Q( \7 {# [9 X' Q60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693
    4 \4 q- T9 @0 B4 i3 r5 i. r( REpoch 3/5
    $ T1 f) d, H3 \' ?# D( E60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800; O1 Y' l) z9 B) A, L; g
    Epoch 4/5' k+ G5 a7 W& t$ f! C1 l
    60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848
    " O* J( ^+ s& l8 `0 r% Z; aEpoch 5/55 w6 {2 _7 J, N
    60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888. b: M" q( E  F: G2 `' W. z
    3 i* ]- f6 ?7 P/ l
    <tensorflow.python.keras.callbacks.History at 0x13a7892d0>3 R6 X4 g% ]9 k9 J0 X# c9 R
    1% O2 M. z; M) ~6 V" h6 i
    21 z4 N# Z' v2 S$ ^3 t) o- m8 D
    3
    1 p+ j3 |) h/ _0 B; I3 c! H4  W: n% E0 W3 h  l& o' p* u
    5
    ' h  H. U" `% X7 l8 y3 n) \6
    4 Z$ F$ z, ?0 T& n& v  ~0 U4 n7
    4 l2 L3 L0 A* J8
    1 P# ?0 m9 l" Y" N; s9, W- a! B; q3 K; v$ B& ]
    10. T/ j( J6 [8 n" O+ \; c& r& ~/ C
    11
    * s2 ^1 ^! M6 a5 Q121 j0 B6 G* D7 S+ E
    13
    + t4 o. v0 U8 t+ y& a8 j! L可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。
    5 C1 [" A5 s& Q4 T' e3 G7 l7 l+ ^# T( a5 h! R2 O  D9 f2 l
    再用测试集去试试:
    $ a( c# {5 Q5 Q: L9 b% @: p9 x4 U& E4 P1 y9 _- k1 q4 e% C
    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" \, ^$ c) i$ H- w+ F- n1 e
    print('test_acc:', test_acc)
    1 W9 s9 j8 k. D( F% h1
    * Q9 R: c% V* M3 F2 \, c$ ?! |$ U  S/ ]2
    " d( @4 j  i  A3 m: ~输出:
    8 q# D4 `7 e0 I# u  g# G& R( B1 ?* ^7 E1 X( a  v
    10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789- U; E. T2 }: W5 g
    test_acc: 0.9789
    : o( u- X+ i3 p% H7 O8 N' ]12 Z7 T" V; g  Y1 o5 p
    2
    4 w  [& H1 R! R, m' ~我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。/ p6 d% E! b! b( [

    $ y* W+ R4 J& S( s; g神经网络的数据表示/ t) ]9 w8 [: N0 D* q  p

    $ h4 Z. s8 u" C' s7 A8 l5 w5 `& ~Tensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。4 U8 ~" G* S( \! v0 q+ V  W9 ^" u& k

    ( i  O0 N2 P  N7 L- |0 E我们常把「张量的维度」说成「轴」。3 O; O( m3 [# C/ z2 O% W! W! U, E
    ' J, r6 V% \  e! d3 ~
    认识张量
    5 v8 D$ ^5 X4 D/ \3 V( b2 f/ F$ {9 W/ }& n
    标量 (0D Tensors)
    5 _8 r% l9 @( K3 n. V6 _6 G% Q# M* W: M
    " H4 g( U; b: u, vScalars,标量是 0 维的张量(0个轴),包含一个数。! `0 _6 X5 C$ p9 I4 w) p7 X- J1 N

    9 \5 i3 U  {5 a+ \7 ^& ^标量在 numpy 中可以用 float32 或 float64 表示。3 ?$ C0 W2 v$ F( o$ u1 K( ?6 `7 x

    4 q8 Q" u+ v4 [' Timport numpy as np
    : f; N& @& c1 u8 Z8 h
    3 K) o3 n( Y9 f: C( y" ^8 `% ~x = np.array(12)2 s) j) U& F8 X- S; Z* {' }' R
    x
    9 T. {6 V- I' F$ f& n  l$ V+ R$ x1
      o2 y. X! M1 f. \' m# ~$ `2
    $ H. H7 G- d1 }; b3
    . ]. b2 a' ^1 r+ u. W4/ _4 }; A( a, {( |; d! w# X+ V2 w
    输出:; r* W- z, E' _1 q  X2 t" D7 w
    & J1 `5 r) t3 ^
    array(12)- I% `+ [- E, I0 ~4 T
    19 C: Y8 v0 r4 M  R9 q" S$ ]
    x.ndim    # 轴数(维数)
    8 ?5 M( b# T) S16 C- e7 \/ d1 a. U
    输出:) G( ]* Q$ e$ E: o) R7 g( r; G
    8 x/ E$ O, ]& A
    1
      N! M, n* @% Y1
    # t3 J# t& z( Z3 U向量 (1D Tensors)4 E: z; n$ p1 H6 K7 y$ W/ q% l

    ) b3 `; h1 _- Q' j; H' @0 ^Vectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。
    $ q6 F$ {- H% T# E' [- q8 l6 a5 ~6 Z
    x = np.array([1, 2, 3, 4, 5])% x& ]0 l# }& W+ Y6 {0 i8 b
    x
    $ g* b% V4 Z& ]5 F% z% f% Y2 o# k19 l+ `/ U4 X7 M4 ~! |7 I
    2
    7 f9 R  L- [3 A; ~: e% g: u输出:% l' g' H: J. B1 y# }; L5 _2 E, T

    1 \9 b" K1 a+ o- W# e9 warray([1, 2, 3, 4, 5])
    3 C9 _: C- W1 x. W5 _+ \3 `9 ~1# |& X/ l; K- _" M( J/ n1 Z
    x.ndim
    ( A- C! [/ f+ X/ j19 G$ d; L# b, d" E& e
    输出:1 |7 [, w' j, J! \. J
    $ L9 K+ i9 [5 w- u) d8 u  _  b
    1
    7 O$ u9 I$ ~  ~# Z1
    , |' k+ J) I4 \* s) @1 U" g我们把这样有5个元素的向量叫做“5维向量”。+ l6 M5 F' m8 ~$ R
    但注意5D向量可不是5D张量!& H9 e# ]; N8 |; W  q6 _8 I& ~
    , T* w! H  b, v" i* e( @
    5D向量:只有1个轴,在这个轴上有5个维度。
    . H7 k. k  w& x, c5D张量:有5个轴,在每个轴上可以有任意维度。
    " O+ `. @7 e% b) x1 _  m) t/ t5 b( d这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。
    . X5 B; J2 y' n- v" U4 J$ `1 X' _6 K5 ?) a- n) |
    所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。$ A2 D) @$ b$ ?' @
    , P; ~' ~6 r; R# t& v- b- ~
    矩阵 (2D Tensors)' C. ~9 [6 i  ]2 L

    2 y) J6 g4 p0 F/ R' A" C, k+ uMatrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。
    6 p2 D* N# V+ f8 ]) V: @% l
    1 g( h" h$ \& n5 `: xx = np.array([[5, 78, 2, 34, 0],1 N2 r: f" `6 `  V4 {. L
                  [6, 79, 3, 35, 1],
    8 J3 u+ M: \* [' y" }              [7, 80, 4, 36, 2]])
    : [% z4 u& Z' _7 O+ J! M- [4 Tx  ^/ c" \" _0 {6 R& s3 Y
    1. w" J) O. p# \2 o
    2
    $ R; b; v1 p) U/ u3
    % @' ^5 s) Y4 P4 Y$ x) L; S4 P45 }" P1 F4 ]& v6 x& K/ F
    输出:
    ! P. d$ x  |3 |
    ) \: Z5 q  Z. C$ ~5 l1 Y) iarray([[ 5, 78,  2, 34,  0],
    ! J2 H  W& j7 C& C       [ 6, 79,  3, 35,  1],0 v9 h3 a& k! E% U0 U) b& F
           [ 7, 80,  4, 36,  2]])
    3 q' U5 D, t& z! U) Z1 f0 t1
    9 O) U9 a% \$ O" ~2
    - a, M  l. y7 J/ V) \2 V; Z& p) b32 q* F0 u. o4 U  P- M0 r
    x.ndim- L: l2 G  P7 z
    1
    * W! ?; R8 J. \/ T8 r! ^) q输出:' Y5 [$ w# o* ^- Y0 F

    / q! b) D. M9 R5 o5 s2
    ' u) L' p' Q- O2 D- X4 x1
    ! F# R6 b$ T1 v" O+ T4 s高阶张量+ a4 P# v- h9 }% S

    " g5 h" o+ p5 ]8 T$ u4 x: l$ C你搞个装矩阵的 array 就得到了3阶张量。
    ( I4 e, t9 \" |' V; ^; x! B! ]) o% F2 x
    再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。) F/ X) n; I" U: N
    2 |4 _0 R5 [. Q" P( i* ]" G7 J9 G1 U- p
    x = np.array([[[5, 78, 2, 34, 0],
    2 o- R# g# j6 j1 z) t3 \. ]               [6, 79, 3, 35, 1],
    " ]) {. r/ `0 H               [7, 80, 4, 36, 2]],
    ) z* a! K* ~, s              [[5, 78, 2, 34, 0],7 |. n. B5 R- S* E: ~6 \
                   [6, 79, 3, 35, 1],$ ]% c9 J) k. F  L: N) u  I
                   [7, 80, 4, 36, 2]],
    * R: V! _) c4 h9 A- l9 c# C3 ?              [[5, 78, 2, 34, 0],
    4 o  V9 t( @: i" @7 _3 _               [6, 79, 3, 35, 1],
    # s6 Q% P' h7 N3 d' U8 M               [7, 80, 4, 36, 2]]])5 ], o( O! o- i$ \( A0 o# H
    x.ndim
    . A* O* [. W1 I3 c2 ]13 _2 }3 Q) u7 N
    2& {/ ?5 Y- d$ t; y
    3  D. F1 b6 X" H9 ]( Z2 R  F' a
    4
    8 `' I9 p$ w9 F$ o4 }* b5
    ) y9 e* a/ U/ }* C9 W7 Q/ S1 z68 q7 {6 X* [) G7 K! n' h
    77 ^  [0 I  z$ V/ I# q
    85 J. ?/ i# h9 _! }! p6 ?
    9# i$ l- X1 h9 e. }& M3 |- m
    10. M% \, d6 j6 a7 R
    输出:
    6 g* J! W6 U$ T  g
      l+ j8 q7 E% H9 `* S% c3+ x, K" I$ E& r3 }. L3 H: j
    1
    ' n1 m. T4 C7 }  D9 m6 Z深度学习里,我们一般就用0~4阶的张量。
    + Z+ e9 N5 X' [9 W% K/ A3 m6 I7 F% T3 R5 m
    张量的三要素$ ?& N3 J7 t0 {8 w

    % |7 {& ~7 S) R! N1 t$ O$ L) X8 E# k阶数(轴的个数):3,5,…2 ~. }7 }/ {, b" g1 B$ r7 x  R$ O
    形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…
    * j* m7 L4 y7 R* P1 s( S数据类型:float32,uint8,…( Z+ ?& c+ R2 m9 K' {, I& u
    我们来看看 MNIST 里的张量数据:
    4 v6 _- N4 C, s6 o8 N' `0 t) O) e6 X7 N! T3 S5 h4 G. m
    from tensorflow.keras.datasets import mnist
    . D& [: x! b+ e- |(train_images, train_labels), (test_images, test_labels) = mnist.load_data()& {' u* N- g8 K  d  \# j
    5 v9 Z! W/ z2 c/ t* @; M
    print(train_images.ndim)
    3 y' m8 N5 F8 A# Z0 b8 W% J1 vprint(train_images.shape)* p% Z5 s8 y( s3 [- X% L9 E5 V% B  {
    print(train_images.dtype)0 N* k& G8 S* O$ F3 b
    1
    3 y3 E/ ]& I+ c+ d- i4 G2 [2
    3 ^& @7 t4 H0 m  q3
    & V$ u( M- W6 ~6 Z: Y) @# K4* U& B# a2 @: {+ U- Q
    5
    . @, ~, J6 }/ c8 v9 o6
    1 l# K/ t, Z% o8 }输出:1 N8 l  P3 m* C7 p" I) V3 i/ z
    * U7 u- Z1 i5 m8 B8 J* L. _
    3/ R) j' R) E+ p) i& C
    (60000, 28, 28)
    $ V1 q+ n$ {& m6 Ruint8. z" k4 a6 M+ W& y# k1 }
    1
    % Y- r7 l/ L1 w2
    $ _% V& y( N% ]  t5 p' \3
    & T3 V/ x& j; I( `9 g所以 train_images 是个8位无符号整数的3阶张量。' k: l2 X8 \& |/ c& {
    , O3 o( \  V$ G5 N2 Q2 g
    打印个里面的图片看看:
    - c& j2 E2 L0 p7 L0 |+ F! |, L. G; h8 v* W
    digit = train_images[0]9 @, F& h/ p( m* M
    , R9 ?* b/ c) V( I; c0 F; J
    import matplotlib.pyplot as plt
    + A# w! Y  E1 u! C( x; T# b) M6 x7 W6 L# B" j4 S
    print("image:")
    # @$ E* f8 C3 h! H) T, Jplt.imshow(digit, cmap=plt.cm.binary)2 [: J! [! M. j( ], c. I4 J1 D- l
    plt.show()
    # h+ b# p. \5 ]" W' C( q- u) [. Iprint("label: ", train_labels[0])
    3 C4 n" n$ A4 F( p- g- R1- G0 Y5 J! E4 @/ r; U) X1 ~
    23 t) ]2 P# C! i4 ?- E* n9 @$ C
    33 b" w1 t( v' s; s9 o; Y
    4
    ) l+ W7 B# K, q* P/ @$ }, F8 o8 q5
    ' T' C9 Z, ^& Y' ^2 b4 e6
    - z; q8 u5 I  h" x, M3 m5 P$ w0 e7
    . l% a% a* Z! c0 F8
    % ~4 J, H. O3 Y/ _/ p# W输出:
    . Y* H, ^0 n, U# [1 C% D" h" v" L( K) \  T2 e. U
    1.jpg
    1 V9 j- u! D' A
    ) U  u$ c' _' K+ llabel:  5' l6 J2 [% K" d4 q( x9 _+ y
    1) i6 \, F' O' n) @  @- P) o
    Numpy张量操作
    7 q. q* Q" ?, |
    5 f, f3 ?) b9 |/ O4 M9 |4 V张量切片:
    $ |7 Z5 h2 q/ L+ H
    1 z6 o8 X: h+ g* N8 jmy_slice = train_images[10:100]$ V- Y2 c4 `  C
    print(my_slice.shape)
    ; c" }5 l2 A$ c* E) y- [1- f8 T9 _; p0 h( R
    29 D. O+ ]1 ~, L3 ~
    输出:. o- U/ |; T+ _+ y
    2.jpg " V, ^& R, M3 W* o2 z7 ?, O
    (90, 28, 28)4 g/ Y" j1 O2 M0 s
    1/ S6 s2 t0 ^4 U  f; R
    等价于:4 r- G/ b- j% f1 l- r
    " ~( {0 E7 w! s; k. e& z0 O. b0 d
    my_slice = train_images[10:100, :, :]/ _9 S6 j9 b* e% @9 S4 i3 s* W0 X% R
    print(my_slice.shape)" P% q8 z  v4 @4 Z- @
    1
    ! y' m/ G1 Z4 R7 C2; q) Z4 d' a" [8 Y( w
    输出:# t9 T3 }5 N; J1 J! o2 \
    3.jpg
    % c! D; Y6 ]* I! J: |( e(90, 28, 28)$ @+ v/ L0 g4 z
    1, [) g2 T! |; c9 \; H
    也等价于; K, r5 R# B- q. |/ x6 F* n
    . T( I4 d6 m! s; N) `( _
    my_slice = train_images[10:100, 0:28, 0:28]+ ^# `# I- V' v2 h
    print(my_slice.shape)+ d) B& X: S+ M$ x; ?
    1
    4 X6 s, X. {4 c7 s; C: i2 n/ F20 a/ c4 X/ i1 G. M
    输出:2 {5 \, w( i( |5 h% Y1 @- o1 g

    1 s8 r8 g2 X1 D5 n5 A6 ](90, 28, 28)% T1 ]! w9 V: G) x! o
    1+ A1 ^8 h! l9 _& Q
    选出 右下角 14x14 的:
    , j) N( v7 n+ v7 ?6 s! X, `) v9 y
      y2 t/ @( |$ t+ {( smy_slice = train_images[:, 14:, 14:]
    ( \1 s. @8 \! h) O6 I' Wplt.imshow(my_slice[0], cmap=plt.cm.binary)! s2 ?; D( b2 v( F( u( }3 ?9 }
    plt.show()6 z. y& S' Z& Q4 C
    1
    ; f7 ?2 m8 {7 \  q% K6 ]1 i( n2* R* f! W2 H' C! U+ q
    3
    ! H1 S4 ?& B, X  }4 p输出:
    ( U  i4 `3 s4 {- w
    $ a" @9 ]3 I" O  X5 q: L- S
    2 K/ y/ K: O4 H) v
      X. s' [# V) i" S选出 中心处 14x14 的:
    % w+ q* }/ g3 U9 M- Y( S4 f4 E( Z) I% m) M% w
    my_slice = train_images[:, 7:-7, 7:-7]
    ) W% C* V/ }% o# yplt.imshow(my_slice[0], cmap=plt.cm.binary)
    & ?/ z! P/ K% m* q; Jplt.show()6 Z8 [  |8 J) z  m
    1
    - l9 Q5 Z9 b0 ^3 p1 P2
    ' s2 x; D3 |% s; `( _: E3
    . n/ k! O/ i  w6 T0 U0 |输出:
    1 X& Y6 P/ i( f, [& Q' t% M
    % H2 g* c/ g6 C8 c6 u: i
    ) }$ v* D+ U  l
    ! j5 t; c+ q( ?# n3 [0 o$ c; m数据批量0 q3 ^$ B1 C' R  F! g8 V$ K9 H7 ^% T  Q
    % j# ?: P6 Z8 X' _
    深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。
    . ]" y4 a5 |9 w+ e- N/ ^! `" H4 `. @. ]- ~& J( S9 Z3 D+ v
    深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。2 S: n( V, h' C- t' Z! n
    % u( Q+ H1 ~+ R
    在 MNIST 中,我们的一个批量是 128 个数据:
    6 ]2 G. Z0 z& _: B. v9 ^/ o: `% W, M2 x1 `5 U" U+ D. C
    # 第一批
    - \$ b9 ^# H' t9 U' Tbatch = train_images[:128]
    " J( y1 \8 A" S# O& f8 Q# 第二批
    " P8 [7 Z. h$ d+ U6 A3 Ibatch = train_images[128:256]* J0 p+ r1 p; ^8 z
    # 第n批
    * o' t5 j1 t0 M4 M+ U8 y( ~n = 12% R( ^# ~9 j4 E" `) f  t% v& p
    batch = train_images[128 * n : 128 * (n+1)]# h% d/ S# |% ]3 M8 }
    1
    5 {6 B; x* H/ n% v2+ Y  I/ {# F7 w  c
    3. D8 z  T7 m  m7 y; e3 Y5 y
    4
    3 p* n( ^5 m# [5
    0 t; E6 |  p0 c% x, F# d9 m6' F& ^( c7 e5 ^% b
    7
    : g/ N$ \+ \' g7 k) {) [) l所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。  k5 R( g; o8 G  A: H" }. h5 U

    0 X4 Q& x0 w* q$ v/ a常见数据张量表示! ?* q% ^. {4 {& q# d9 g

    5 Z& o- r+ p& h5 Q: [, c5 k2 W数据7 ^# @7 e9 G$ w  F' W- t
    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-4-18 22:10 , Processed in 0.409511 second(s), 59 queries .

    回顶部