深度学习(6)TensorFlow基础操作二: 创建Tensor
深度學習(6)TensorFlow基礎操作二: 創建Tensor
- 一. 創建方式
- 1. From Numpy,List
- 2. zeros,ones
- (1) tf.zeros()
- (2) tf.zeros_like()
- (3) tf.ones()與tf.ones_like()
- 3. Fill
- 4. Normal(正態分布)
- 6. Random Permutation(隨機打散)
- 二. 典型應用
- 1. Scalar標量在神經網絡中的呈現方式([])
- 2. Vector在神經網絡中的呈現方式
- 3. Matrix在神經網絡中的呈現方式
- 4. Dim=3 Tensor
- 5. Dim=4 Tensor
- 6. Dim=5 Tensor
一. 創建方式
- from numpy,list
由numpy或者list類型的數據轉換; - zeros,ones
創建全是0或者全是1的Tensor; - fill
創建填滿任意數字的Tensor; - random
隨機化初始Tensor; - constant
用constant來創建Tensor;
1. From Numpy,List
- 直接使用tf.convert_to_tensor()函數即可完成由Numpy或者List類型到Tensor類型的轉換;
2. zeros,ones
(1) tf.zeros()
- tf.zeros()中的參數是shape;
- tf.zeros([]): 新建一個標量(Saclar)其中元素為0的Tensor;
- tf.zeros([1]): 新建一個向量(Vector)其中元素為0的Tensor;
- tf.zeros([2, 2]): 新建一個矩陣(Matrix)其中元素為0的Tensor; 其中[2, 2]代表新建的Tensor維度是2行2列;
(2) tf.zeros_like()
- tf.zeros_like(a)相當于新建了一個和a維度相同的元素全為0的Tensor; 其作用與tf.zeros(a.shape)是完全一樣的,使用哪個都可以;
(3) tf.ones()與tf.ones_like()
- tf.ones和tf.ones_like的用法與tf.zeros和tf.zeros_like的用法是一樣的,只不過里邊的元素全為1;
- zeros和ones方法最常見用于y=w?x+by=w*x+by=w?x+b的參數www和bbb的初始化上;
3. Fill
- tf.fill([2, 2], 9)表示創建一個2行2列的Tensor,其中的元素都為9;
4. Normal(正態分布)
初始化參數的時候,不一定非要初始化成0或者1,有些時候將參數初始化成均勻分布或者正態分布,其模型的性能效果會更好。
- tf.random.normal([2, 2], mean=1, stddev=1)表示創建一個維度為[2, 2]的Tensor,其中mean=1代表均值為1,stddev=1代表方差為1,是一個標準的[1, 1]正態分布,即N(1,1);
- truncated_normal([2, 2], mean=0, stddev=1)表示截斷的正態分布,就是在原來的[0,1]正態分布上截去了某一部分元素,例如:
將μ>130μ>130μ>130的值截去,這樣做的好處在于,Sigmoid函數會在大于某值(例如130)或者小于某值的時候,梯度接近于0,這樣就會出現Gradient Vanish,即梯度消失問題,這時參數的更新就會變得非常困難,為了避免這種現象,就會使用truncated_normal(),這樣會比normal()直接初始化好一些;
5. Uniform(均勻分布)
- tf.random.uniform([2, 2], minval=0, maxval=1)表示數據從在服從(0, 1)的均勻分布中進行采樣而來;
- tf.random.uniform([2, 2], minval=0, maxval=100)表示數據從在服從(0, 100)的均勻分布中進行采樣而來;
6. Random Permutation(隨機打散)
(1) 設一組圖片的維度為[64,28,28,3][64, 28, 28, 3][64,28,28,3],其中64為batch,有些時候我們需要將這64張圖片順序打亂,即打散操作。首先我們需要將這64張圖片加上0~63的索引,再將索引打散;
(2) idx = tf.random.shuffle(isx): 將新建的[0,9][0, 9][0,9]的idx(即索引)進行打散操作,打散的結果為numpy = array([2, 1, 9, 3, 8, 7, 0, 5, 4, 6]);
(3) 用打散的索引結構去在a = tf.random.normal([10, 784])和b = tf.random.uniform([10], maxval=10, dtype=tf.int32)中取數據;
(4) a = tf.gather(a, idx): 在a中按照idx的結構取數據;
7. tf.constant
(1) tf.constant(1)表示創建一個值為111的標量;
(2) tf.constant([1])表示創建一個值為[1][1][1]的向量;
(3) tf.constant([1, 2.])表示創建一個值為[1,2.][1, 2.][1,2.]的標量;
(4) 使用tf.constant創建Tensor時,里邊元素的維度必須一樣,否則就會出錯;
二. 典型應用
Typical Dim Data
- []
- [d]
- [h, w]
- [b, len, vec]
- [b, h, w, c]
- [t, b, h, w, c]
- …
1. Scalar標量在神經網絡中的呈現方式([])
- [][][]其實就是Scalar,即標量,如000,1.1.1.,2.22.22.2,………;
- 常用在losslossloss函數中,loss=MSE(out,y)loss = MSE(out,y)loss=MSE(out,y),其中losslossloss就是一個標量;
- accuracy(精度),為一個具體的數值,也是標量;
- losslossloss具體計算的例子:
(1) out = tf.random.uniform([4, 10]): 使用隨機均勻分布生成4張照片,照片共分為10類,也就是每張照片有10個維度;
(2) y = tf.range(4): 生成label=[0,1,2,3]label = [0, 1, 2, 3]label=[0,1,2,3],也就是說我們假定第一張圖片的label為0,第二張圖片的label為1,第三張圖片的label為2,第四張圖片的label為3;
(3) y = tf.one_hot(y, depth=10): 使用one-hot編碼方式進行編碼,即:
0:[1.,0.,0.,0.,0.,0.,0.,0.,0.,0.]0: [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.]0:[1.,0.,0.,0.,0.,0.,0.,0.,0.,0.]
1:[0.,1.,0.,0.,0.,0.,0.,0.,0.,0.]1: [0., 1., 0., 0., 0., 0., 0., 0., 0., 0.]1:[0.,1.,0.,0.,0.,0.,0.,0.,0.,0.]
2:[0.,0.,1.,0.,0.,0.,0.,0.,0.,0.]2: [0., 0., 1., 0., 0., 0., 0., 0., 0., 0.]2:[0.,0.,1.,0.,0.,0.,0.,0.,0.,0.]
3:[0.,0.,0.,1.,0.,0.,0.,0.,0.,0.]3: [0., 0., 0., 1., 0., 0., 0., 0., 0., 0.]3:[0.,0.,0.,1.,0.,0.,0.,0.,0.,0.]
(4) loss = tf.kares.losses.mse(y, out): 使用kares.losses.mse()方法計算總損失值,即:
loss=∑(y?out)2loss=\sum{(y-out)^2}loss=∑(y?out)2
(5) loss = tf.reduce_mean(loss): 使用reduce_mean()方法計算平均損失值,即:
loss=1n∑(y?out)2loss=\frac{1}{n}\sum{(y-out)^2}loss=n1?∑(y?out)2
可以看到最后的平均損失值losslossloss的shape = (),也就證明了losslossloss為一個標量。
2. Vector在神經網絡中的呈現方式
- Bias(偏置項)
- [out_dim]
在計算Y=X@W+bY=X@W+bY=X@W+b的時候,bbb就是偏置項Bias,他就是一個Vector,例如輸出outoutout為0~9時,那么b的就是[1,10][1, 10][1,10];
以Y=X@W+bY=X@W+bY=X@W+b升維為例:
- [out_dim]
(1) layers.Dense()函數的功能是變化維度;
(2) net = layers.Dense(10): 將8維升到10維;
(3) net.kernel: 這里可以看出www的shape = (8, 10);
(4) net.bias: 這里可以看出b的shape = (10,),還可以看出初始化默認值全部為0,即[0.,0.,0.,0.,0.,0.,0.,0.,0.,0.][0., 0., 0., 0., 0., 0., 0., 0., 0., 0.][0.,0.,0.,0.,0.,0.,0.,0.,0.,0.];
3. Matrix在神經網絡中的呈現方式
- input x: [b, vec_dim]
- weight: [input_dim, output_dim]
(1) x = tf.random.normal([4, 784]): 有4張照片,每張照片是28×2828×2828×28,也就是784維;
(2) net = layers.Dense(10): 定義一個將圖片維度變為10維的網絡;
(3) net(x).shape: 將x放入到定義好的網絡net中并查看shape;
(4) 可以看到net(x).shape為[4,10][4, 10][4,10],即一個4行10列的矩陣;
(5) net.kernel.shape: 查看w的維度,為[784,10][784, 10][784,10],即一個784行10列的矩陣,www的dim為2;
(6) net.bias.shape: 查看bbb的維度,為[10][10][10],bbb的dim為1;
4. Dim=3 Tensor
- x: [b, seq_len, word_dim]
- [b, 5, 5]
- [b, 5, 5]
例如: 每個句子有80個單詞,每個單詞有5個維度,那么一個句子的shape就為[1, 80, 5],如果有b個句子,那么這b個句子的shape就為[b, 80, 5];
imdb是一個數據庫,TensorShape([25000, 80])表示共有25000條影評,每條評價有80個單詞,每個單詞有100個維度,所以TensorShape為[25000,80,100][25000, 80, 100][25000,80,100];
5. Dim=4 Tensor
- Image: [b,h,w,3][b, h, w, 3][b,h,w,3]
- feature maps: [b,h,w,c][b, h, w, c][b,h,w,c],其中b為一批圖片的數目(即batch),h為圖片的高(即height),w為圖片的寬(即width),c為圖片的通道數(即channel);
例如: 一張彩色圖片高為h,寬為w,那么這張圖片的shape就為[1,h,w,3][1, h, w, 3][1,h,w,3]; 如果有b張圖片的話,那么這b張圖片的shape就為[b,h,w,3][b, h, w, 3][b,h,w,3];
(1) tf.random.normal((4, 32, 32, 3)): 4張32×32的彩色圖片;
(2) Conv2D: 卷積神經網絡; channel由原來的3變為了16;
6. Dim=5 Tensor
- Single task: [b,h,w,3][b, h, w, 3][b,h,w,3]
- meta-learning:
- [task_b,b,h,w,3][task\_b, b, h, w, 3][task_b,b,h,w,3]
一個任務的shape為[b,h,w,3][b, h, w, 3][b,h,w,3],那么有多個任務的時候,shape就為[task_b,b,h,w,3][task\_b, b, h, w, 3][task_b,b,h,w,3];
- [task_b,b,h,w,3][task\_b, b, h, w, 3][task_b,b,h,w,3]
參考文獻:
[1] 龍良曲:《深度學習與TensorFlow2入門實戰》
[2]https://assessingpsyche.wordpress.com/2014/06/04/using-the-truncated-normal-distribution/
[3] https://blog.csdn.net/dcrmg/article/details/79797826
[4] https://medium.com/syncedreview/representations-for-language-from-word-embeddings-to-sentence-meanings-3fae81b2379a
[5] https://docs.gimp.org/2.4/en/gimp-images-in.html
[6] https://www.coursera.org/learn/learning-how-to-learn
總結
以上是生活随笔為你收集整理的深度学习(6)TensorFlow基础操作二: 创建Tensor的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 看不看好?曝王凤英立下“三年小鹏销量百万
- 下一篇: 深度学习(7)TensorFlow基础操