1. 程式人生 > >Tensorflow程式設計基礎筆記之一——基礎型別及操作函式

Tensorflow程式設計基礎筆記之一——基礎型別及操作函式

TensorFlow程式設計基礎筆記之一——基礎型別及操作函式

1.1 張量介紹

  • tensor型別(與python對比)
tensor型別 Python型別 描述
DT_FLOAT tf.float32 32位浮點數
DT_DOUBLE tf.float64 64位浮點數
DT_INT64 tf.int64 64位有符號整型
DT_INT32 tf.int32 32位有符號整型
DT_INT16 tf.int16 16位有符號整型
DT_INT8 tf.int8 8位有符號整型
DT_UINT8 tf.int8 8位無符號整型
DT_STRING tf.string 可變長度的位元組陣列,每一個張量元素都是一個位元組陣列
DT_BOOL tf.bool 布林型
DT_COMPLEX64 tf.complex64 由兩個32位浮點陣列成的複數:實數和虛數
  • 張量就是多維陣列(列表),用“階”表示張量的維度
    0階張量稱作標量,表示一個單獨的數;
    1階張量稱作向量,表示一個一維陣列;
    2階張量稱作矩陣,表示一個二維陣列,它可以有i行j列個元素,每個元素可以用行號和列號共同索引到;
    判斷張量是幾階的,就通過張量右邊的方括號數,0個是0階,n個是n階;

1.2 張量的相關操作包括型別轉換、數值操作、形狀變換和資料操作

import numpy as np
import tensorflow as
tf
#型別轉換函式,共6個
a=np.array(['1','2','3'])
print(a)
b=tf.string_to_number(a,out_type=tf.float32,name='ToString')
c=tf.to_double(a,name='ToDouble')
d=tf.to_float(a,name='ToFloat')
e=tf.to_int32(a,name='ToInt32')
f=tf.to_int64(a,name='ToInt64')
#將a轉換為第二個引數指定的型別
g=tf.cast(a,tf.float64,name='zhidingleixing')
print(b,c,d,e,f,g,sep='\n')
['1' '2' '3']
Tensor("ToString:0", shape=(3,), dtype=float32)
Tensor("ToDouble:0", shape=(3,), dtype=float64)
Tensor("ToFloat:0", shape=(3,), dtype=float32)
Tensor("ToInt32:0", shape=(3,), dtype=int32)
Tensor("ToInt64:0", shape=(3,), dtype=int64)
Tensor("zhidingleixing:0", shape=(3,), dtype=float64)
#數值操作相關的函式,共有13個
tensor=tf.ones([2,3],tf.int32)  #按指定型別與形狀生成值為1的張量
tensor=tf.zeros([2,3],tf.int32)  #按指定型別和形狀生成值為0的張量
test=[[1,2,3],[4,5,6],[7,8,9]]
tensor=tf.ones_like(test)  #生成和輸出張量一樣形狀和型別的1
tensor=tf.zeros_like(test)  #生成和輸出張量一樣形狀和型別的0
tensor=tf.fill([2,5],3)    #為指定形狀填值
tensor=tf.constant([[1.0,2.0]])  #生成常量
tensor=tf.random_normal([2,4],mean=0,stddev=1.0,dtype=tf.float32,seed=2,name="normal")  #生成正態分佈隨機數
#截斷正態分佈隨機數,均值mean,標準差stddev,只保留[mean-2*stddev,mean+2*stddev]範圍內的隨機數
tensor=tf.truncated_normal([2,4],mean=0,stddev=1.0,dtype=tf.float32,seed=2,name="normal")
#均勻分佈隨機數,範圍為[minval,maxval]
tensor=tf.random_uniform([2,4],minval=0,maxval=9,dtype=tf.int32,seed=2,name="uniform")

tf.set_random_seed(1)  #設定隨機數種子
#將輸入值value按照size尺寸隨機剪輯
tensor=tf.random_crop([[1,2,3,4],[5,6,7,8],[10,11,12,13]],[2,2],name="crop")
#在[start,stop]範圍內產生num個數的等差數列。注意,start和stop要用浮點數表示,否則會報錯。
tensor=tf.linspace(start=1.0,stop=5,num=10,name=None)
#在[start,limit)範圍內以進步值delta產生等差數列。注意,不包括limit在內的。
tensor=tf.range(start=1,limit=5,delta=1)
with tf.Session() as sess:
    print(sess.run(tensor))
[1 2 3 4]
#形狀變換相關函式,共6個/1
#tf.shape(input,name=None) 返回一個張量,其值為輸入引數input的shape。這個input可以是張量,也可是一個數組或list。
t=[1,2,3,4,5,6,7,8,9]
print(np.shape(t))
tshape=tf.shape(t)
tshape2=tf.shape(tshape)
with tf.Session() as sess:
    print(sess.run(tshape))
    print(sess.run(tshape2))  
(9,)
[9]
[1]
#形狀變換相關函式,共6個/2
#tf.size(input,name=None) 返回一個張量,其內容為輸入內容的元素數量
#tf.rank(input,name=None) 返回一個張量,其內容為輸入資料input的rank。
#tf.reshape(input,shape,name=None) 將原有輸入資料的shape按照指定形狀進行變化,生成一個新的張量
t=[[[[1,1,1,1],[2,2,2,2]],[[3,3,3,3],[4,4,4,4]]]]
sizet=tf.size(t)
rankt=tf.rank(t)
tt1=tf.reshape(t,[1,16])
#如果shape有元素[-1],則表示在該維度下按照原有資料自動計算。
tt2=tf.reshape(t,[2,-1])
with tf.Session() as sess:
    print(sess.run(sizet))
    print(sess.run(rankt))
    print(sess.run(tt1))
    print(sess.run(tt2))
16
4
[[1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4]]
[[1 1 1 1 2 2 2 2]
 [3 3 3 3 4 4 4 4]]
#形狀變換相關函式,共6個/5
#tf.expand_dims(input,dim,name=None) 插入維度1進入一個tensor中
t=[[2,3,3],[4,5,5]]
print(np.shape(t))
t1=tf.expand_dims(t,0)
t2=tf.expand_dims(t,1)
t3=tf.expand_dims(t,2)
#如果此處寫成t4=tf.expand_dims(t,3),則會出錯,因為只有兩個維度
t4=tf.expand_dims(t,-1)

with tf.Session() as sess:
    print("在第一個位置增加一個維度",np.shape(t1))
    print(sess.run(t1))
    print("在第二個位置增加一個維度",np.shape(t2))
    print(sess.run(t2))
    print("在第三個位置增加一個維度",np.shape(t3))
    print(sess.run(t3))
    print("在最後一個位置增加一個維度",np.shape(t4))
    print(sess.run(t4))
(2, 3)
在第一個位置增加一個維度 (1, 2, 3)
[[[2 3 3]
  [4 5 5]]]
在第二個位置增加一個維度 (2, 1, 3)
[[[2 3 3]]

 [[4 5 5]]]
在第三個位置增加一個維度 (2, 3, 1)
[[[2]
  [3]
  [3]]

 [[4]
  [5]
  [5]]]
在最後一個位置增加一個維度 (2, 3, 1)
[[[2]
  [3]
  [3]]

 [[4]
  [5]
  [5]]]
#形狀變換相關函式,共6個/6
#tf.squeeze(inpput,dim,name=None) 將dim指定的維度去掉(dim所指定的維度必須為1,如果不為1則會報錯)
t=[[[[2],[1]]]]
print(np.shape(t))
t1=tf.squeeze(t,0)
t2=tf.squeeze(t,1)
t3=tf.squeeze(t,3)
#如果寫成t4=tf.squeeze(t,2)會出錯,因為2對應的維度為2,不為1
t4=tf.squeeze(t,-1)

with tf.Session() as sess:
    print("去掉第一個位置的維度",np.shape(t1))
    print(sess.run(t1))
    print("去掉第二個位置的維度",np.shape(t2))
    print(sess.run(t2))
    print("去掉第四個位置的維度",np.shape(t3))
    print(sess.run(t3))
    print("去掉第四個位置的維度",np.shape(t4))
    print(sess.run(t4))    
(1, 1, 2, 1)
去掉第一個位置的維度 (1, 2, 1)
[[[2]
  [1]]]
去掉第二個位置的維度 (1, 2, 1)
[[[2]
  [1]]]
去掉第四個位置的維度 (1, 1, 2)
[[[2 1]]]
去掉第四個位置的維度 (1, 1, 2)
[[[2 1]]]
#資料操作相關函式,共8個/1
#tf.slice(input,begin,size,name=None) 對輸入資料input進行切片操作,begin與size可以為List型別。
#要求begin與size的值必須一一對應,並且begin中每個值都要大於等於0且小於等於size中對應的值。
t=[[[1,1,1],[2,2,2]],[[3,3,3],[4,4,4]],[[5,5,5],[6,6,6]]]
print(np.shape(t))
slice1=tf.slice(t,[1,0,0],[1,1,3])
slice2=tf.slice(t,[1,0,0],[1,2,3])
slice3=tf.slice(t,[1,0,0],[2,1,3])
with tf.Session() as sess:
    print(sess.run(slice1))
    print(sess.run(slice2))
    print(sess.run(slice3))
(3, 2, 3)
[[[3 3 3]]]
[[[3 3 3]
  [4 4 4]]]
[[[3 3 3]]

 [[5 5 5]]]
#資料操作相關函式,共8個/2
#tf.split(value,num_or_size_split,axis=0,num=None,name='split') 沿著某一維度將tensor分離為num_or_size_splits
t=tf.reshape(tf.range(start=1,limit=151,delta=1),[5,30])
#沿著第一列將t按[4,15,11]分成3個張量
split0,split1,split2=tf.split(t,[4,15,11],1)
with tf.Session() as sess:
    print(t)
    print(sess.run(t))
    print(np.shape(split0))
    print(sess.run(split0))
    print(np.shape(split1))
    print(sess.run(split1))
    print(np.shape(split2))
    print(sess.run(split2))
Tensor("Reshape_2:0", shape=(5, 30), dtype=int32)
[[  1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18
   19  20  21  22  23  24  25  26  27  28  29  30]
 [ 31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48
   49  50  51  52  53  54  55  56  57  58  59  60]
 [ 61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78
   79  80  81  82  83  84  85  86  87  88  89  90]
 [ 91  92  93  94  95  96  97  98  99 100 101 102 103 104 105 106 107 108
  109 110 111 112 113 114 115 116 117 118 119 120]
 [121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
  139 140 141 142 143 144 145 146 147 148 149 150]]
(5, 4)
[[  1   2   3   4]
 [ 31  32  33  34]
 [ 61  62  63  64]
 [ 91  92  93  94]
 [121 122 123 124]]
(5, 15)
[[  5   6   7   8   9  10  11  12  13  14  15  16  17  18  19]
 [ 35  36  37  38  39  40  41  42  43  44  45  46  47  48  49]
 [ 65  66  67  68  69  70  71  72  73  74  75  76  77  78  79]
 [ 95  96  97  98  99 100 101 102 103 104 105 106 107 108 109]
 [125 126 127 128 129 130 131 132 133 134 135 136 137 138 139]]
(5, 11)
[[ 20  21  22  23  24  25  26  27  28  29  30]
 [ 50  51  52  53  54  55  56  57  58  59  60]
 [ 80  81  82  83  84  85  86  87  88  89  90]
 [110 111 112 113 114 115 116 117 118 119 120]
 [140 141 142 143 144 145 146 147 148 149 150]]
#資料操作相關函式,共8個/3
#tf.concat(concat_dim,values,name='concat')  沿著某一維度連線tensor
t1=[[1,2,3],[4,5,6]]
t2=[[7,8,9],[10,11,12]]
print("t1:",t1)
print("t2:",t2)


with tf.Session() as sess:
    print("按行連線:",sess.run(tf.concat([t1,t2],0)),sep='\n')
    print("按列連線:",sess.run(tf.concat([t1,t2],1)),sep='\n')
    
t1: [[1, 2, 3], [4, 5, 6]]
t2: [[7, 8, 9], [10, 11, 12]]
按行連線:
[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]
按列連線:
[[ 1  2  3  7  8  9]
 [ 4  5  6 10 11 12]]
#資料操作相關函式,共8個/4
#tf.stack(input,axis=0)  將兩個N維張量列表沿著axis軸組合成一個沿著axis軸組合成一個N+1維的張量
t1=[[1,2,3],[4,5,6]]
t2=[[10,20,30],[40,50,60]]

with tf.Session() as sess:
    print("按行疊加起來:",sess.run(tf.stack([t1,t2])),sep="\n")
    print("按列疊加起來:",sess.run(tf.stack([t1,t2],axis=1)),sep="\n")
按行疊加起來:
[[[ 1  2  3]
  [ 4  5  6]]

 [[10 20 30]
  [40 50 60]]]
按列疊加起來:
[[[ 1  2  3]
  [10 20 30]]

 [[ 4  5  6]
  [40 50 60]]]

**注意:**tf.concat()和tf.stack()的區別在於維度是否增加了

#資料操作相關函式,共8個/5
#unstack(value,num=None,axis=0,name='unstack')  將輸入value按照指定的行或列進行拆分,並輸出含有num個元素的列表(list)
#axis=0表示按行拆分,axis=1表示按列拆分,num為輸出list的個數,必須與預計輸出的個數相等,否則會報錯。可忽略這個引數
t=[[1,2,3],[4,5,6]]
with tf.Session() as sess:
    print("預設按行拆分:",sess.run(tf.unstack(t)),sep="\n")
    print("按列拆分:",sess.run(tf.unstack(t,axis=1)),sep="\n")
預設按行拆分:
[array([1, 2, 3]), array([4, 5, 6])]
按列拆分:
[array([1, 4]), array([2, 5]), array([3, 6])]
#資料操作相關函式,共8個/6
#tf.gather(params,indices,validate_indices=None,name=None) 合併索引indices所指示params中的切片
y=tf.constant([0.,2.,-1.])
t=tf.gather(y,[2,0])
with tf.Session() as sess:
    print("提取指定索引資料之前:",sess.run(y))
    print("提取指定索引資料之後,位置[2,0]:",sess.run(t))
提取指定索引資料之前: [ 0.  2. -1.]
提取指定索引資料之後,位置[2,0]: [-1.  0.]
#資料操作相關函式,共8個/7
#tf.one_hot(indices,depth,on_value=None,off_value=None,axis=None,dtype=None,name=None)  生成符合onehot編碼的張量。
indices=[0,2,-1,1]    #要生成的張量,相當於指定位置設定為on_value
depth=3               #在depth長度的陣列中,哪個索引的值為onehot值
on_value=5.0          #為onehot值時,該值為多少
off_value=0.0         #非onehot值時,該值為多少
#axis為-1時生成的shape為[indices長度,depth],為0時shape為[depth,indices長度]
#還可以是1,是指在類似時間序列(三維度以上)情況下,以時間序列優先而非batch優先,即[depth,batch,indices長度]
#這裡的indices長度可以當成樣本中的feature特徵維度
axis=-1
t=tf.one_hot(indices,depth,on_value,off_value,axis)
with tf.Session() as sess:
    print(sess.run(t))

[[ 5.  0.  0.]
 [ 0.  0.  5.]
 [ 0.  0.  0.]
 [ 0.  5.  0.]]
#資料操作相關函式,共8個/8
#tf.count_nonzero(input_tensor,axis=None,keep_dims=False,dtype=dtype.int64,name=None,reduction_indices=None)  統計非0個數
t=tf.random_normal([4,4],dtype=tf.float32)
with tf.Session() as sess:
    print(sess.run(t))
    print("矩陣中的非0個數:",sess.run(tf.count_nonzero(t,1)))
[[-0.17469783  0.51620245  0.24235971 -0.58633131]
 [ 0.76381689  0.09761845 -0.80310112 -1.80997384]
 [ 0.81021774  0.5561316  -1.68870258  1.55662048]
 [ 2.5749476  -0.21812376  1.47960925  0.00541722]]
矩陣中的非0個數: [4 4 4 4]

1.3 算術運算函式

x=tf.Variable
            
           

相關推薦

Tensorflow程式設計基礎筆記之一——基礎型別操作函式

TensorFlow程式設計基礎筆記之一——基礎型別及操作函式 1.1 張量介紹 tensor型別(與python對比) tensor型別 Python型別 描述 DT_

tensorflow程式設計入門筆記之一

基本上每一個語言或者工具都有自己的“hello world” demo,那麼學習它們一般都會從這個“hello world”開始。今天我們就來看看tensorflow的“hello world”(非官網)。在開始編寫“hello world”之前我們先看看tensorflow的程式設計模型。一. tensor

Scala 程式設計—第二節:資料型別操作、流程控制

1.Scala 資料型別 Scala 與 Java有著相同的資料型別,下表列出了 Scala 支援的資料型別 資料型別 描述 Byte 8位有符號補碼整數。數值區間為 -128 到 1

JS基礎篇-資料型別操作標籤樣式

一、JS的資料型別     ①.數字 number   拓展:在進行+ 運算時左右兩邊任意一邊有字串,那麼它的功能是拼接。拼接後資料型別是 字串     ②.字串 string      ③.布林值 boolean  --> true/false     ④.物件 ob

【JavaScript基礎筆記】資料型別轉換、false值、記憶體圖、垃圾回收和深淺拷貝簡易概念

其他型別轉換成字串 xxx.toString()   // var object = {a:1}; object.toString = [object Object]   //這種方法對null undefined使用會報錯 xxx +

Python基礎筆記_Day04_資料型別、math模組、random模組、string模組

Day04_資料型別、math模組、random模組、string模組   04.01_Python語言基礎(Python中的資料型別)(瞭解) 04.02_Python語言基礎(Num資料型別)(掌握) 04.03_Python語言基礎(int型別)(掌握) 04.0

Redis零基礎筆記之一 安裝Redis(mac筆記本)

  一、安裝步驟   1、去Redis官網下載軟體包,地址如下:https://redis.io/download,下載最新的版本的軟體包就可以了,最新為5.0.3          &

c++轉碼基礎(1):各種編碼型別unicode和uft-8互轉

什麼是Ascii編碼? 單位元組編碼,適用於所有拉丁文字字母. ASCII 碼使用指定的7 位或8 位二進位制數組合來表示128 或256 種可能的字元. 標準ASCII 碼也叫基礎ASCII碼,使用7 位二進位制數(剩下的1位二進位制為0)來表示所有的大寫和小寫字母,數字

bash程式設計讀書筆記基礎篇I)

前言: bash不同於其他的語言。它和unix命令緊密結合。所以,精通bash的過程,就是精通unix命令的過程。 1. && 與 ; test -e . && echo "Yes"解釋:&& 和 ";" 的區別是,如果前一個

Mooc中國大學Python學習筆記--數字型別操作

整數型別 只需知道整數無限制,pow(),4進製表示形式 與數學中整數的概念一致 ——可正可負,沒有取值範限制 ——pow(x,y)函式:計算x^y,想算多大算多大 —十進位制:10 —二進位制,以0b或0B開頭:0b010,0B010 —八進位制,以0o或0O開頭:0o123,0O

【JavaScript基礎筆記基礎語法易錯點(語句、表示式、變數、IF語句結構、賦值和相等)

語句和表示式的區別在於,前者主要為了進行某種操作,一般情況下不需要返回值;後者則是為了得到返回值,一定會返回一個值。凡是 JavaScript 語言中預期為值的地方,都可以使用表示式。   變數提示:JavaScript 引擎的工作方式是,先解析程式碼,獲取所有被宣告的變數,然後再一行一行地執行

Python語言程式設計-學習筆記1:簡介目錄

最近在慕課網上報了一門課,目的是入門Python;課程內容比較緊湊,開了許久了,最近才學習; 作為一門時下火熱的程式語言,僅為興趣,學習學習! 課程簡介: Python語言程式設計 北京理工大學 Python(3.x版本) 嵩天、黃天羽、禮欣 輔助學習網址: 課

Linux網路程式設計:socket程式設計簡介、網路位元組序相關函式

Socket(套接字) socket可以看成是使用者程序與核心網路協議棧的程式設計介面(API函式)。 socket不僅可以用於本機的程序間通訊,還可以用於網路上不同主機的程序間通訊。 IPv4套接字地址結構 IPv4套接字地址結構通常也稱為“網際套接字地址結構”,它以

Python語法day2-常用資料型別操作

Python語法day2-常用資料型別及操作 數值 a,整型(int):2進位制(0b + 二進位制串),8進位制(0/0o + 八進位制串),10進位制,16進位制(0x + 16進位制串); b,浮點型(float):小數,也可以用科學計數法表示; c,複數(complex

Python之路(組合資料型別操作

Python之路(組合資料型別及操作) 集合型別 集合型別的定義 集合是多個元素的無序組合 集合型別與數學中的集合概念一致 集合型別之間無序,每個元素唯一,不存在相同元素 集合元素之間不可或更改,不是可變資料型別 集合用大括號 {} 表示,元素間用逗號分隔 建立集合型別用 {}

Scala入門到精通—— 第二節Scala基本型別操作、程式控制結構

本節主要內容 Scala基本型別 基本型別操作 Scala程式控制結構 Scala基本型別 Scala中的基本資料型別如下圖: (來源:Programming in Scala) 從上表中可以看出,Scala的基本資料型別與Java中的基本

python 入門之 – 字串型別操作方法(十五)

在之前學基本資料型別的時候知道了,在 python 中,字串 是一個有序的字元的集合,用於儲存和表示基本的文字資訊,由一對 單引號 或 雙引號 又或者是 三引號 包含著,但是 字串 有兩個特點: 1、有序 2、不可變 其實字串有序,都很好理解,就是通過語言本身提供的方法來對字串進行一

Python資料型別操作

Python資料型別及操作 python資料型別:number,string,list,set,dict,tuple 列表 list 索引從 0 開始 格式:list_ = [1, "a", True, None, 5] 可用for迴圈、while迴圈遍歷、len()檢視列表長度

C/C++程式設計學習筆記二:C語言的函式中,如何使用指標交換兩個數的值,深入理解指標

 使用外部函式交換兩個變數的值,一個再簡單不過的事情,但是在C/C++中,正確實現該功能反應了你對指標和引用等重要知識的掌握程度。本文列舉了幾種常見的寫法,其中前三種是錯誤的,後兩種是正確的。第四種使

R語言學習筆記(概念、公式R函式)

1、隨機實驗:可在相同2、隨機事件均值u:這個很好理解 R函式:mean中位數:對序列排序後,排在中間的數,需要特別注意的是如果序列為偶數,中位數是中間兩個數平均值.  R函式:median百分位數:也是順序統計量,設百分數為p,n是樣本個數,則p位數指:np為小數,ceil