) 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