QQ登录

只需要一步,快速开始

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

    3 ^7 W: ]4 K4 B3 JPython深度学习之初窥神经网络) L8 S9 |0 p2 g* |' }7 j
    本文为 第2章 开始之前:神经网络背后的数学 (Chapter 2. Before we begin: the mathematical building blocks of neural networks) 的笔记整合。
    * w9 |% n1 J0 M* g
    , m6 r2 Y; m, V3 @) u本文目录:
    & c8 p* |, I; w7 x7 w
    . V! t, P2 G/ j5 Z; i: _0 f/ a文章目录1 r' X$ X3 S% n) o0 R% J: T3 S7 T, a
      N# u  v$ O- Q5 t4 x5 {. u* T
    Deep Learning with Python  g2 D# a( S* ?3 L4 j7 o( [
    初窥神经网络( V2 q2 Y* C' O: b) w9 Z3 @0 C
    导入MNIST数据集
    ' J. h% H) c3 g/ B网络构建6 G6 g  A& J& l- T+ a
    编译
    ( I2 b4 a# X# \# Q. M+ S! A7 _预处理
    - P  H# O1 ^% @+ l5 f2 a4 e5 \$ G- T图形处理7 |( y9 B; P& m, _$ N
    标签处理
    + C4 j+ k" [# P, H训练网络
    3 ?6 j9 ?2 P: y: y3 I8 H神经网络的数据表示' b1 H& Y2 N9 R; B, O! j- Z9 N
    认识张量
    # k! t/ k# r/ I& {( C6 j标量 (0D Tensors)
    4 w( L. n( T8 W$ A( ^向量 (1D Tensors)
    1 g. q8 C9 |) B) n  Z# ?. Y7 `  |矩阵 (2D Tensors)5 v  ?1 u# [; p% |6 W' F
    高阶张量
    ; t" i. q8 k: H! g张量的三要素
    , L( S$ a/ b2 \3 GNumpy张量操作2 u( Q2 R' A; g  }; X# n0 |
    张量切片:
    , [# t# w  `  Q* y. X! b5 H数据批量
    % R* U% x. x( Z( h常见数据张量表示% O3 g) j" ?0 G1 d. h9 p
    神经网络的“齿轮”: 张量运算+ h6 ~0 h5 F4 k" s: J6 F5 F
    逐元素操作(Element-wise)
    7 c6 l6 O8 S  u4 u/ T% v, ~) p广播(Broadcasting)3 L& z( K+ U5 L
    张量点积(dot)0 }: D2 e% k8 z
    张量变形(reshaping)- N1 w, r2 P; M
    神经网络的“引擎”: 基于梯度的优化5 B% U! O* Y5 O* A, X7 T
    导数(derivative)2 `, ^3 W+ R  e, P6 T0 K+ k/ D
    梯度(gradient); h! H, I( e9 W8 u) n& z
    随机梯度下降(Stochastic gradient descent)
    % @7 N+ W1 P, o+ O9 a: X反向传播算法:链式求导3 |' c% g6 x) ~0 A" ~
    本文由 CDFMLR 原创,收录于个人主页 https://clownote.github.io。
    ( f- l" s# P, }; b' t8 A- L
    2 i0 G. o6 ]7 _, }: @' w  M! G初窥神经网络
    8 u( E6 W) K0 U% c3 b8 P! n
    7 }& e2 p5 Z# [学编程语言从 “Hello World” 开始,学 Deep learning 从 MINST 开始。
      {0 Q5 W; W+ {' `/ Q' G
    + S, }% H& j; L3 b7 ]( cMNIST 用来训练手写数字识别, 它包含 28x28 的灰度手写图片,以及每张图片对应的标签(0~9的值)。
    , `7 t! \- r: j& s, U3 ^5 S6 q
    # l( R- C  e2 \& o: Q$ x5 T导入MNIST数据集
    ' v' o! [* q& a  D$ ^' H. L5 K+ |( v) H: {% v+ X5 J
    # Loading the MNIST dataset in Keras
    3 O5 U! A2 x3 @8 q4 \  d" ifrom tensorflow.keras.datasets import mnist
    5 {7 c& |9 C4 }2 [(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
    1 h# Z4 N& J3 x: f12 d$ H- t' Y7 i2 `* \' \3 n1 q  @) C
    2
    ) s% \6 `$ u! G, f9 T9 a32 q7 v9 F' R) |; B* i' W3 p1 T
    看一下训练集:
    - |; l8 U  Z( Z$ i' R8 r5 `; j* o: C1 z/ K
    print(train_images.shape)
      }) G) g$ p1 o, y4 Oprint(train_labels.shape)) h3 v. m% l. t, e
    train_labels
    2 ^( s/ F) y/ @1
    . z9 Q2 g* q; H8 N& _" O  I2
    4 g: i% v7 {! @5 i, T- i33 O; Q) |% i4 N$ K3 Q2 X
    输出:- k2 Y/ D! Y8 p3 Y& |6 A
    ' m/ H5 b% Z6 s7 L
    (60000, 28, 28)
    0 Q8 I# a5 Y+ B3 g; `(60000,)
    2 w; m2 z' ~) P5 c
    6 v' S, J2 i  C- barray([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
    6 u  s) ?" L  W6 p; Z2 m6 B1# ^  Q+ x; M! `* O0 h) D! S
    2
    + F1 ?2 t1 \( ~. f$ f3
    ; a# r/ g4 Z& i49 f, q' _: s3 r& ]- }! I; |7 }( Y
    这是测试集:
    ; X: W# {5 L" p/ c" Z; ]  D
    ) L4 m+ G  x& B7 Pprint(test_images.shape)1 v0 L% D( a' D  |& U, Y  g
    print(test_labels.shape)( b* {+ {! e' v
    test_labels
    3 d( m$ x# J" y# G* d7 p! y5 ^# z1, ~& R" K6 ]; z! v$ e! y
    27 m7 s( F% L9 n7 P' t5 ~
    3, v5 y  p/ Z' ~' r1 g  J( D& I& {
    输出:
    * N8 ]) X( F4 O% Q+ K! l0 v( f5 |' r9 N6 i
    (10000, 28, 28)( V4 F+ Y0 ^) A
    (10000,)
    4 [* t8 t' k" x8 m  v& m8 d4 t4 R
    8 R% ~# Z2 `0 E. Q' Oarray([7, 2, 1, ..., 4, 5, 6], dtype=uint8)- V  ^/ j/ [! B5 Z& [
    1, y1 z" Q% M( M8 [" [7 y% d6 i
    2
    7 Q- ]# \( `3 n' h1 t3' l; A7 U/ O" V1 A
    4! o. K/ y  P0 U. b6 I) P- V
    网络构建
    $ Z3 D% I' s) b# j1 P, o. ?. Q4 X5 \4 ~7 }* t
    我们来构建一个用来学习 MNIST 集的神经网络:& Q$ b- S+ f% D
    ( A, M* \+ V9 ~; z4 s# L
    from tensorflow.keras import models
      J5 {" h( ]+ v) {0 i) ufrom tensorflow.keras import layers+ @/ p5 V/ U' d% Q
    : ?. G4 q$ R2 {1 x6 o" j
    network = models.Sequential()! |, O5 J- F8 r6 [% H8 p% A
    network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28, )))3 D5 X: y8 Y$ v8 U
    network.add(layers.Dense(10, activation='softmax'))
    6 A) K2 N4 F9 y. K11 W9 H1 S8 D5 ~, z& K+ P4 y
    2) M9 a; h7 O& o, q
    3
    3 G- K! @9 L# @9 K2 w! b- e/ f4
    ) P, K' d3 g( J% q  D5
    % a; S& c8 w; C5 N; `; M; o# a6) u$ r7 W/ p5 j* h9 V
    神经网络是一个个「层」组成的。7 W. _% D9 P! u9 _  }0 M
    一个「层」就像是一个“蒸馏过滤器”,它会“过滤”处理输入的数据,从里面“精炼”出需要的信息,然后传到下一层。6 [$ W- w' l) e1 W0 \+ E0 c
    . t" l, ?% g6 Q
    这样一系列的「层」组合起来,像流水线一样对数据进行处理。" ?8 L. J0 i' A0 d" g
    层层扬弃,让被处理的数据,或者说“数据的表示”对我们最终希望的结果越来越“有用”。
    # f4 }( p5 D. h  v
    6 ~; G$ w$ t9 {" p! X& W. a) b8 Z我们刚才这段代码构建的网络包含两个「Dense 层」,这么叫是因为它们是密集连接(densely connected)或者说是 全连接 的。) x( v  ^4 V; d3 W2 l+ A( N  c
    2 s; a! q. q5 O4 K- I/ e1 V
    数据到了最后一层(第二层),是一个 10路 的 softmax 层。) G) s) o" J3 _6 B5 J, x
    这个层输出的是一个数组,包含 10 个概率值(它们的和为1),这个输出「表示」的信息就对我们预测图片对应的数字相当有用了。
    ( B+ ]" q# Q5 Z4 r事实上这输出中的每一个概率值就分别代表输入图片属于10个数字(0~9)中的一个的概率!7 `* P" R' P: T5 w4 v0 \

    5 n! F+ q# ^: y  E9 ^' o4 r# R编译
    2 i5 t( L2 \# a- L/ {9 y" s+ D; v- ?) O  g# S, w
    接下来,我们要 编译 这个网络,这个步骤需要给3个参数:
    - Y0 Y- y% i; R% L: H) {: j$ T/ D; Y/ X4 o: D" c/ I" H
    损失函数:评价你这网络表现的好不好的函数2 }1 U' S  F. z3 \% @8 {, Q2 E. \
    优化器:怎么更新(优化)你这个网络6 h3 W! j1 ?# A3 E9 K
    训练和测试过程中需要监控的指标,比如这个例子里,我们只关心一个指标 —— 预测的精度0 F- \& ~4 ]7 ~  \
    network.compile(loss="categorical_crossentropy",  R7 H/ X% d( r
                    optimizer='rmsprop',( }9 H0 Z$ V- A$ K. o8 w9 o$ K
                    metrics=['accuracy'])
    ! v. F, |; h! ]" w3 J( B: Q1
    : l' K  Z' j$ L3 ^% y2
    8 K( A0 q/ Q( Y2 @2 v: K7 @3
    $ r0 s: l# ~0 U% ]3 a预处理
    * v' ^1 X* ^9 }$ T# a& T" K5 _9 i/ `- |, ^
    图形处理
    8 R; W+ M7 B+ A8 |
    / s3 F8 G6 \9 Q1 i6 d. c# G我们还需要处理一下图形数据,把它变成我们的网络认识的样子。
    + j6 h3 S4 X! I; j5 f" Y5 O  l, X
    MNIST 数据集里的图片是 28x28 的,每个值是属于 [0, 255] 的 uint8。1 L4 k" m7 g2 N- v7 l
    而我们的神经网络想要的是 28x28 的在 [0, 1] 中的 float32。
    ) ?" ^# y" H. p% v; r+ H
    % C2 Q* ?- N( K/ V1 Etrain_images = train_images.reshape((60000, 28 * 28))9 i9 y* q/ \( T+ R' H% \- `" ?/ K
    train_images = train_images.astype('float32') / 255
    1 K/ P; B* F5 U
    1 n3 ?: [  ~; ~. ytest_images = test_images.reshape((10000, 28 * 28))
    ! F, C9 j7 U7 |5 a; atest_images = test_images.astype('float32') / 255! L3 ~( b% B8 C& D, p
    1
    # k4 i8 S9 t% R# ?2
    8 n/ c9 _9 }2 c+ d2 M7 [36 |9 v% u. D5 ?" [/ y) J1 y
    45 L& Z) ~* q; e
    54 Z- a- y+ W$ e0 `/ C
    标签处理
    & S' [6 w, Y9 z# D' H% X. X2 R9 {: \" Y( k3 H/ `
    同样,标签也是需要处理一下的。
    4 @! A  _" a* \6 z
    2 ^0 I# y5 `+ l6 P0 D4 T; M7 Pfrom tensorflow.keras.utils import to_categorical
    0 M. K' p& }  D, S: c5 C. R, o/ t  u) [9 {, e
    train_labels = to_categorical(train_labels)4 m: m, e6 v' o, Y6 J" w( s3 H/ x
    test_labels = to_categorical(test_labels)
    / Z$ [$ i0 @; M3 Y) G+ ~1/ X( @$ t! y2 }* e$ O: o
    2
    * C3 g( {1 `5 ~" Y33 F+ o; Y' k7 Y8 ~" q
    4" w7 t+ h4 Z/ Z% M
    训练网络7 t! N& k3 ~( d$ O; `, M9 K$ n) C4 q
    8 U- c) p$ I4 J. {
    network.fit(train_images, train_labels, epochs=5, batch_size=128)
    ; V& F/ k1 p5 R1
    , _  B/ W6 f' T& ?0 f6 W5 O输出:
    . ~. d% Y; i: z4 r. E& K" |; ?6 e9 P
    Train on 60000 samples
    8 w3 s1 a) P9 h2 f+ D) EEpoch 1/5# A7 T6 h$ f2 e5 }' b! O, I0 B5 `
    60000/60000 [==============================] - 3s 49us/sample - loss: 0.2549 - accuracy: 0.9254
    / M& q5 \9 e4 ^3 e! y! lEpoch 2/5
    * x+ \8 z& G, x/ v) q  A60000/60000 [==============================] - 2s 38us/sample - loss: 0.1025 - accuracy: 0.9693
    0 ~& O% c+ K% T  j3 q! H3 e1 D& {Epoch 3/5+ w- b5 g/ z0 @# \) g
    60000/60000 [==============================] - 2s 35us/sample - loss: 0.0676 - accuracy: 0.9800: _# l1 e% |" L" O; Y9 x2 m
    Epoch 4/5" {* C( o* R: }* o9 r$ U2 o
    60000/60000 [==============================] - 2s 37us/sample - loss: 0.0491 - accuracy: 0.9848
    ; `2 `4 u1 a" LEpoch 5/5! k1 ~  \& g1 v5 A% n! |  g3 ~# t, ~
    60000/60000 [==============================] - 2s 42us/sample - loss: 0.0369 - accuracy: 0.9888
    4 }. J3 j( ]0 A2 A8 ~2 [+ m. ~& \5 i/ o2 [; ^$ i9 G
    <tensorflow.python.keras.callbacks.History at 0x13a7892d0>+ Q2 T, X& P. J' W0 X/ v
    18 [4 m& |: R/ ?4 e- \# T
    20 i2 J: B# m) Y8 A1 E$ ]+ r6 C1 j
    31 L1 }+ l" K  v$ R% J, P& f
    4
    5 e3 P% [8 L( e5
    * z7 G* H9 S/ ~/ p) b2 ~' ?6
    / A3 A: @/ {" v4 W7
    9 ?6 d3 P2 ^  {+ ?- U8
    ) R" O: l8 X5 w) y0 b& B" @4 e# n9
    * w: W5 H& E0 h. H7 O. e107 h8 F) O  W6 x4 P5 K2 m% v9 U# {
    110 n7 A% p9 s9 G1 {* d( k
    126 e. d$ W+ ?; m0 c' \1 w) F
    133 U1 o1 B. l& H' J
    可以看到,训练很快,一会儿就对训练集有 98%+ 的精度了。, @% r9 U- t3 h! u) R/ F. f
    4 ^, J: |' Q' W1 p( ]2 U9 U
    再用测试集去试试:
    * P( L1 ^0 F8 B6 G; l
    1 c3 C% e  k, a  t! Ytest_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+ E3 A' m3 ^5 x# v  W1 Y
    print('test_acc:', test_acc)+ e* ?9 I+ }9 y
    1( {! X1 A! l/ R8 A
    2
    1 q2 Y1 s, q3 [6 \# o输出:& E; S5 y' c7 ?' n' n0 |- _

    5 C& i) t5 r3 ^$ m' J10000/1 - 0s - loss: 0.0362 - accuracy: 0.9789
    + e, L4 I& p% N4 J; q: U4 Ptest_acc: 0.9789
    6 Z' M$ e8 ]) U" a9 ~2 d0 p$ E1
    8 }9 c) k1 [  W4 j+ [. D5 d* j2
    - v  t! a7 K5 y% E+ T  _4 W我们训练好的网络在测试集下的表现并没有之前在训练集中那么好,这是「过拟合」的锅。
    ; V! A9 ]! q0 D, ~8 J2 f% ~+ T% H9 p+ |8 U) K+ G
    神经网络的数据表示7 O) M: p2 J2 ~1 T8 B( h4 R- k

    ) h2 o, U. b( |, J9 VTensor,张量,任意维的数组(我的意思是编程的那种数组)。矩阵是二维的张量。) M! m6 Y& q% n" V* a
    ( F% b9 t2 z: I* _8 l' F- s
    我们常把「张量的维度」说成「轴」。1 _* e  c  e! b6 d
    . ~5 x" o5 C4 @$ J; |0 l" e7 @
    认识张量
    8 M7 M: D8 S& Z4 [  k& R* V
    1 {* m# m* n- H1 v* u+ E1 U标量 (0D Tensors)
    ; z, a6 ~' Q9 y" t6 `# C6 |
    0 h3 \: S: ^( p. GScalars,标量是 0 维的张量(0个轴),包含一个数。0 i* E5 T( B/ J

    3 @. m8 T, H$ Y, H2 x) V. N5 B标量在 numpy 中可以用 float32 或 float64 表示。8 P  j. D+ D) r* M* B  A4 r
    # {! m- ?. ]4 i1 j. e. d1 |& D
    import numpy as np
    9 S; G, L. P2 E& m9 i0 b! g9 r; x; _+ _( q$ g* ?1 d7 ^
    x = np.array(12)
    3 C) x+ B- _% V. Ux! v9 I' |1 ^0 S  _
    18 N- n9 E+ @+ R, m
    2: D! ^  T4 @: j  x" b
    3
    . b  f4 u# j, L; p! m& P, P4' A3 _, R( _/ A+ l* _# g0 \/ e
    输出:
      B/ i3 y- q& Y' m9 X0 ?
    % ~- c: Q% H+ E3 h+ R1 Q; Y' `2 sarray(12)6 S. w) l+ o8 J5 @) d' K. D* V
    14 A( M9 r; G0 p+ t$ ^
    x.ndim    # 轴数(维数)
    # p- L1 h8 ]* v. _; h/ X2 m" A, b1
    + B, B0 Y0 R( J* \! b* m输出:
    & M3 b* v( K9 U" \/ K5 n: H+ s" w& p9 M
    13 d7 K8 i; k( z" A! B7 }7 {
    1
    5 |( O. j+ x4 l% ~! e6 y向量 (1D Tensors)
    7 f. ^8 f. Q7 y1 r( p4 F* q6 m3 j6 k8 t; T$ p1 n0 m: c+ K: D
    Vectors,向量是 1 维张量(有1个轴),包含一列标量(就是搞个array装标量)。$ W) j4 {+ j7 ]8 C% s0 }

    , T% A: \5 [, M9 c6 {  V# lx = np.array([1, 2, 3, 4, 5])
    ' e8 b  `2 L  w+ U3 a" g* ^x! F* {( N# v; T; p: k! u7 r% X/ T) Z
    1: F: K  w) Q3 `1 S
    2( n9 i- y2 j9 p& T3 p
    输出:9 W2 \5 T- K- V1 v' _

    & |. j% {5 Y3 H( Z' ]; L- Yarray([1, 2, 3, 4, 5])
    & `1 x( m; v7 U6 s3 M1% ~. A7 I9 {: |: Q# `8 m
    x.ndim& J6 m3 o; [% f2 D0 p9 M9 D
    1
    . Q* B+ Z( h* q  [# a/ i: f输出:; f* a! w: d2 e- L% m. s6 q

    0 R: g% H8 R% I) c1( h9 G2 k* g/ i; ]2 s5 Q
    1! D/ B! b$ `9 H& M/ [9 U: \, H3 e
    我们把这样有5个元素的向量叫做“5维向量”。
    9 q, ^  `" C8 u" R但注意5D向量可不是5D张量!
    % J# Y# C- o* @$ |/ r
    / C) h2 e/ k2 K6 e" [5D向量:只有1个轴,在这个轴上有5个维度。
    " F8 a, y  F6 a9 v3 q5D张量:有5个轴,在每个轴上可以有任意维度。
    ; X# H2 ?2 `+ c+ V$ R这个就很迷,这“维度”有的时候是指轴数,有的时候是指轴上的元素个数。- y4 `4 p7 V/ a) {: W
      H9 f) Q& G6 n$ k+ Z+ |3 i9 {
    所以,我们最好换种说法,用「阶」来表示轴数,说 5阶张量。
    . X6 M% G# S! r1 I, f! k
    , K/ ]. f8 z) i8 o矩阵 (2D Tensors)
    5 K6 m- s3 l2 e  [: w- O% i; _# C/ h1 F- b+ E$ [/ j0 a
    Matrices,矩阵是 2 阶张量(2个轴,就是我们说的「行」和「列」),包含一列向量(就是搞个array装向量)。
    ) I3 S/ B2 M  d. c3 `: ~' K/ _, n- C# H
    x = np.array([[5, 78, 2, 34, 0],
    1 |4 f6 V. t- [, y2 _) l              [6, 79, 3, 35, 1],
    6 v5 T' F5 i' g4 ?* P              [7, 80, 4, 36, 2]])
    1 C' G, |2 G1 w0 Y: W! Hx
    8 z2 V& R' A. ]5 N) w1
    2 u: U: P+ t! R. b  M9 w- J2
    & z0 m3 _  v2 ~1 s% c5 n36 N8 L0 P8 Q& \( Q: i# Z' z
    42 [. L! o* |4 R
    输出:
    : |1 n. L( ~9 ?* c8 X5 ]& E& P1 ^, o$ }) [2 t: s. u- G
    array([[ 5, 78,  2, 34,  0],
    ( i0 V. H& L  j$ p       [ 6, 79,  3, 35,  1],4 ?9 {# r( ]1 R  K  N; N* ]
           [ 7, 80,  4, 36,  2]])
    4 Z; a$ |; j2 @1 Z: T( s; r& ^  H9 `2 ]1; n( i0 c' O4 E  h2 c' b
    20 B. X) P4 I4 w# h
    3
    9 k% Y. m, a" W. Y0 Dx.ndim
    " }4 G- [9 B8 a$ X1+ r' u5 S7 ~, x$ A9 E
    输出:
    0 T8 u" ~, [1 w+ [6 N! Z
    5 x( G# Z' e+ z  ^+ C0 P% k26 x5 R. J6 [* y! S7 K: n$ O+ e
    1
    / M1 N5 f& q& h* a; o高阶张量! _1 B6 @, R$ r3 M: B0 C7 s
    ; K7 F# ^3 H/ j
    你搞个装矩阵的 array 就得到了3阶张量。
    * w. `; D1 H, q+ l& K7 G. w/ @: R% L  E5 A7 k
    再搞个装3阶张量的 array 就得到了4阶张量,依次类推,就有高阶张量了。. d' _$ ^" i8 m. l$ i
    3 B, j! e7 @+ Z  n# d7 |+ x. L0 U" m
    x = np.array([[[5, 78, 2, 34, 0],6 I1 G; B2 ~; N
                   [6, 79, 3, 35, 1],
    6 h2 t3 M- d% w+ C  J; @, ^               [7, 80, 4, 36, 2]],
    , d# a8 S2 d+ }) O" z              [[5, 78, 2, 34, 0],1 `4 `1 Z& `0 [! |8 G
                   [6, 79, 3, 35, 1],: b, G; U! u! f
                   [7, 80, 4, 36, 2]],
    1 S; d' L9 \4 l" F( x! D              [[5, 78, 2, 34, 0],. y% s, g+ Q1 e, a- u9 T
                   [6, 79, 3, 35, 1],' j0 v+ b* t1 c8 S' V8 A/ y( Y- R5 `
                   [7, 80, 4, 36, 2]]])3 R3 }8 P# T5 c& i7 S) O! i% T
    x.ndim
    , s8 l" f0 i" a7 |; m7 o4 I6 W: n1
    7 V! \5 Z' @, G! ?; X( ~, ~5 F20 Q. o( X: C1 j( m2 k8 z7 J; Z
    3
    6 A! d# X$ K; H) X! |8 S1 J3 L4
    " e9 T; }3 E# q' A' l( K+ c: c& L5
    - V9 h' U, Z. c" |0 X1 Y' w# u) m6
    : o1 t1 \' m0 R7
      _/ s2 a% m$ B6 K& ^7 D/ }8 R8
    6 |5 i! S# y) I5 R9
    ! `9 ~. D; [% f  e10& R9 J* J5 Y/ O& L1 r
    输出:  H2 Y. K% e. v8 I

    % d. P3 h4 B9 Z+ h2 {34 T! [# t! \: |
    1; n/ n4 n  x' C0 L1 l) Q# g0 z4 V2 U
    深度学习里,我们一般就用0~4阶的张量。
    ' f8 ]; R5 w1 q. W! J- n
    & U, x5 |3 O: S7 J4 l  m4 q张量的三要素) h' [- T8 M* l: w

      x/ A# |7 j0 q/ T# R' |& K阶数(轴的个数):3,5,…3 `4 H, k( f* T# n
    形状(各轴维数):(2, 1, 3),(6, 5, 5, 3, 6),…
    / j+ X4 b9 d3 j$ z2 b2 j2 @9 v数据类型:float32,uint8,…
    4 y# n' k* B  C5 p8 v  M. A我们来看看 MNIST 里的张量数据:
    2 V8 N/ g6 Q3 d2 k$ b
    7 d7 D* H; \- B# t' g2 q" Hfrom tensorflow.keras.datasets import mnist
    ! T& X$ d8 |) T1 w4 \* a(train_images, train_labels), (test_images, test_labels) = mnist.load_data()1 _: O; ~6 u! {5 K9 H$ ], h2 e
    - ~1 t" l1 F; P0 h$ B) B
    print(train_images.ndim)& G7 _9 ~5 u, D% `
    print(train_images.shape)$ E2 Y8 R  c2 ^/ p9 d5 ^- v
    print(train_images.dtype)3 z2 A+ l+ X1 I/ J% v( j' D4 M
    1
    8 g- e  p: q- z3 D& t/ l5 _0 @28 ?, v* p$ U% v# D' H
    3
    ( W# G; n* F9 t0 v4; |- x5 ]; Q- n: v
    5
    ; w& ^6 p. \6 G. @* `% U6! e. G# X4 L! O% O9 t8 t
    输出:7 v/ S9 [! K- f, \( [

    & h, Q4 F) W9 L3 ]) v  G3
    - e5 w0 ^. l; u4 e- G/ {- M(60000, 28, 28)
    , E& x: x4 C$ ?9 }% Ruint8- h4 S5 k6 A  ]- P, i1 u' E
    1* q! z9 O+ B3 a5 f
    2
    " }3 }/ h/ v' W3
    0 I* \3 V' \2 c$ p3 m, M  ~- _所以 train_images 是个8位无符号整数的3阶张量。
    2 k, c6 q" k" L& n" V! J2 o- p( X* q
    打印个里面的图片看看:
    ! y( A) ?- J" a& d9 B& [8 q1 f* h1 d  r) S* e
    digit = train_images[0]9 o- `2 C4 c0 U, A3 ^
    9 F9 l- h3 ~, J7 ]
    import matplotlib.pyplot as plt
    / x/ V* r& _/ o) |
    / C9 T; S7 ^5 J7 r2 Fprint("image:")
    # ?3 I  Q. N. i3 b) c' Y! Vplt.imshow(digit, cmap=plt.cm.binary)
    # N$ H8 |* J- g# P; \plt.show()
    " G  ~3 y  k( Z$ \: z2 e  zprint("label: ", train_labels[0]). O) U& y1 y" v+ c1 x
    1
    3 t. |* c$ U+ I/ d% T1 M; c( b- U2
    5 |$ P- ^6 h5 x8 B3
    & K. t  W& R2 t  J& h1 Z( P4 Z4& [! j1 m2 E5 ?
    57 k# |9 O& q2 i* j
    68 c( U6 p2 w) ^  T" d- M2 I3 l1 `1 u
    7
    # H" C& J6 w( n3 m8: s) Y, S/ o+ _5 I# a4 Z
    输出:4 k! s; ?: }: C/ F+ W
    ! e" Y7 C( N; a
    1.jpg , v$ P* S, x7 Z+ d5 ]
    : v3 Y+ W) `" P2 ~8 }. @( e" K, z
    label:  5% @: O$ G; a# \$ n- |( b: t
    1- G2 E, F' J6 [2 b' I8 _
    Numpy张量操作3 D6 r9 q% k: e4 B; ?; _/ A

    6 P3 y9 j2 O+ l0 h$ }张量切片:
    5 |* h' \; ?+ N0 q1 l9 c4 [5 P1 i+ @1 f$ x: t0 E2 i
    my_slice = train_images[10:100]
    # |/ ?3 D9 g) u* mprint(my_slice.shape), I: l/ l' f/ f: L
    1' @7 C8 ], s9 d5 M, u7 |
    2
    / B7 j) @1 H: t# R. R输出:
    ) o) `! j* V# M8 ^. J 2.jpg
    5 a* L1 F. O+ W" R& K9 h- `(90, 28, 28)
    5 e9 a" A( V# L) F! X( B1 f2 M1$ T; p; a( _0 p- w6 D/ J/ \+ \, w
    等价于:" M! p+ l3 v1 m: D8 @$ b

    9 W" e+ d8 T6 s! H- B( `' xmy_slice = train_images[10:100, :, :]! H3 i# f5 R' D
    print(my_slice.shape)
    8 ?8 _% z4 t0 i  R/ N- k1
    " r2 m7 J, s% y( C6 h" g2
    3 `( Q# n5 U6 l* W7 w7 E输出:
    7 L" ?" D* ?$ }; c 3.jpg
    ) f& x: P7 j+ Q. {1 f% e(90, 28, 28)& ]# U  J. W+ j
    1* G% y7 c2 I  @9 g# h+ R& z' c
    也等价于. O4 G8 L0 I# @" \. a8 N# N4 _

    $ v! z0 A! h/ P& Y  T8 _my_slice = train_images[10:100, 0:28, 0:28]% j/ R0 d' C' _+ ~* T8 x0 @
    print(my_slice.shape)
    - N8 _: [, F, |' K) B1
    # O3 `5 |, l) U% q4 n  Y; I2
    3 j: n* O* e# P$ z输出:
    + f7 p8 \, l5 f9 t" }. i/ l
    ( i. j% e5 c2 l# J(90, 28, 28)
    6 j) ^; a0 q+ v6 e" }1
      r1 N. s. K# i) d$ W4 {4 r- j+ ^选出 右下角 14x14 的:* H; S# l9 O# [' ~4 f0 ^
    / h0 q7 K; N3 I6 w$ _
    my_slice = train_images[:, 14:, 14:]
    1 ^& w: c" u7 {, Y+ a) }plt.imshow(my_slice[0], cmap=plt.cm.binary)
    1 y7 ]  J- K4 F+ V3 Eplt.show()+ {: J2 q3 T; G1 [4 @! b0 c
    1, P$ T9 e* v# \" q6 e
    2
    ) X3 o. K; o0 h9 s( }5 E3 k3
    9 x7 Y5 x& c. x+ B& ~4 V输出:5 @- }' y7 h0 G' {7 v
    : p- H7 V  r# L
    ' e8 }+ U( p) @' o
    3 j9 k3 h' d- B: j$ C2 x# I' E* p
    选出 中心处 14x14 的:
    ! [' r( e$ k3 q5 D& ]9 p0 ?% M9 @  B
    my_slice = train_images[:, 7:-7, 7:-7]8 `2 H" o+ S) _3 o! d* ]1 o
    plt.imshow(my_slice[0], cmap=plt.cm.binary)( f9 A- E0 F! t7 h% T' U8 v8 Z; J3 ?' I& `6 x
    plt.show()
    6 [* M' I( n2 D8 i- L16 `( `5 I4 X- Y& C3 y6 i
    2: y9 E* x  e3 }* L- m" \# T5 I0 U
    3) V2 t  }2 l0 s# B: ]( i
    输出:
    ) X' `4 s( k0 D; ^" W, K; P
    , n, U% v7 E8 X( s# k& t) |" n
    * _$ H( |9 M# d7 t4 N2 ], l0 \) L* A1 G% I) S
    数据批量: o) B7 C  A3 |+ l: e# |8 f) Y6 m

    , ~3 r3 ^4 F! W" r# s5 |; G" R' J深度学习的数据里,一般第一个轴(index=0)叫做「样本轴」(或者说「样本维度」)。" w: r8 C  x) `- f, M
    ( c) x$ P% D  b+ {! e: a8 |/ G: H
    深度学习里,我们一般不会一次性处理整个数据集,我们一批一批地处理。" `' i& s. b& r0 K

    ) V  V& {9 k) i( B3 B1 B在 MNIST 中,我们的一个批量是 128 个数据:
    $ ~+ |$ G7 U' ^1 }) [# [3 O+ u3 t- ^: N3 u5 E
    # 第一批
    4 s/ \: Y. S8 E0 rbatch = train_images[:128]* K5 g8 B7 \/ e& R( p+ Y
    # 第二批
    * v" i, @" v7 j+ |/ S  kbatch = train_images[128:256]7 c4 l4 o6 x  F5 R4 V0 }0 A  g
    # 第n批& B$ r! N8 A! C- ?
    n = 12
    0 \- @+ y4 _& C4 }2 v4 y4 Hbatch = train_images[128 * n : 128 * (n+1)]6 w+ V3 [2 U$ a1 `3 v( Z: k
    12 k% x! I9 F  {& }% l" l# M
    2
    8 Z( U+ a/ F  w; _# l! ?3
    - y$ r8 P/ f9 Z6 s- n! d0 z& @4
    4 P- d: @' B& U% m. n' J& p# H5
    7 A$ A: k8 u" f& H69 |$ X, l/ r6 y0 z1 R5 m
    7" ]& A" W- m9 P, Z
    所以,在使用 batch 的时候,我们也把第一个轴叫做「批量轴」。
    4 H0 M( [8 V6 @+ w* L3 H4 Y5 N) V& I7 e. e/ k" z
    常见数据张量表示1 j$ g. Q! U. J% \( C

    ' z4 f" g  O3 p0 R0 c+ g数据
    , G7 A4 Q; g2 Z9 U8 m
    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, 2025-8-19 16:37 , Processed in 0.660871 second(s), 58 queries .

    回顶部