發布時間: 2019-07-01 15:44:53
device
with tf.device(“cpu”)
?a=tf.constant(1)
with tf.device(“gpe”)
?b=tf.range(4)
#可以判斷tensor a和b分別在哪一個設備上
a.device #返回:device:CPU:0
b.device #返回:device:GPU:0
?如果需要將tensor在CPU和GPU之間相互轉移,操作如下:?
?aa=a.gpu()
aa.device #此時返回為:device:GPU:0
bb=b.gpu()
bb.device #此時返回為:device:CPU:0
1.6.V2.0常用的屬性(numpy,ndim)
?numpy:支持tensor類型直接轉換成np.array。
??b.numpy()
array([0,1,2,3],dtype=int32)
#直接指定要轉換的數據類型
int(a) #可以直接轉換成int,但前提是,a必須是一個scalar
float(a)
查看維度的屬性有:??b.ndim #返回數據維度
b.shape
tf.rank(b)
?1.7.V2.0常用的屬性(判斷tensor)?
判斷是否是tensor?
a=tf.constant([1.])
b=tf.constant([true,False])
c=tf.constant(‘hello,world’)
d=np.arange(4)
#判斷是否是tensor
tf.is_tensor(b) #return True
isinstance(a,tf.Tensor) #return True
tf.is_tensor(d) #return False
?查看數據類型??
a.dtype,b.dtype c.dtype
return (tf.float32, tf.bool, tf.string)
a.dtype =tf.float32 #return True
b.dtype=tf..string #return True
1.8.V2.0常用的屬性(數據轉換)
?convert
??a=np.arrange(5) #array([0,1,2,3,4,5])
a.dtype
dtype(‘int64’) #numpy中自動生成int64
#np.array轉換成tensor, 且需要指定數據類型為inte32
aa=tf.convert_to_tensor(a,dtype=tf.int32)
?cast:同樣可以實現數據轉換,且更簡潔,只需要指定dtype。??
tf.cast(aa, dtype=tf.float32) #指定轉換成float32
<tf.Tensor:id=23,shape=(5,),dtype=float32,numpy=array([0.,1.,2.,3.,4.],dtype=float32)>
aaa=tf.cast(aa, dtype=tf.double) #指定轉換成float64
<tf.Tensor:id=27,shape=(5,),dtype=float64,numpy=array([0.,1.,2.,3.,4.])>
tf.cast(aaa, dtype=tf.int32)
<tf.Tensor:id=28,shape=(5,),dtype=int32,numpy=array([0,1,2,3,4],dtype=int32)>
?cast:整型和布爾型之間的轉換
b=tf.constant([0,1]) #int32的整型
tf.cast(b,dtype=tf.bool)
<tf.Tensor:id=31,shape=(2,),dtype=bool,numpy=array([False, True])>
bb=tf.cast(b, dtype=tf.bool) #布爾型
tf.cast(bb, dtype=tf.int32) #布爾型轉換成整型
#False對應0,True對應1
<tf.Tensor:id=34,shape=(2,),dtype=int32,numpy=array([0, 1],dtype=int32)>
?? Variable:可求導的屬性(專門為神經網絡的參數所設計的屬性)
a=tf.range(5)
b=tf.Variable(a) #tensor a在進行了variable的包裝之后,就具備了可求導的特性。
b.dtype #tf.int32
b.name #’Varibale:0’
iIsinstance(b,tf,tensor) #False
isinstance(b,tf.Variable) #True
tf.is_tensor(b) #True
[start:end]:
a=tf.range(10)
<tf.Tensor: numpy=array[0, 1, 2, 3, 4, 5, 6, 7, 8, 9])>
a[-1:]
<tf.Tensor:id=48, shape=(1,), dtype=int32, numpy=array([9])>
a[:2]
<tf.Tensor:id=58, shape=(2,), dtype=int32, numpy=array([0, 1])>
a[:-1]
<tf.Tensor:id=63, shape=(2,), dtype=int32, numpy=array([0, 1, 2, 3, 4, 5, 6, 7, 8])>
b=tf.random.normal([4, 28, 28, 3])
b[0,: , :, :].shape #TensorShape([28, 28, 3])
?? [start:end:stop]/[::step]
?b[:, 0:28:2, 0:28:2, :].shape #TensorShape([4, 14, 14, 3])
?b[:, ::2, ::2, :].shape #TensorShape([4, 14, 14, 3])
?[::-1],‘…’: 默認為任意長的冒號
a=tf.random.normal([2, 4, 28, 28, 3])
?a[0, …].shape #TensorShape([4, 28, 28, 3])
?a[…, 0].shape #TensorShape([2, 4, 28, 28])
?a[1, 0, …, 0].shape #TensorShape([28, 28])
? tf.gather
data=tf.random.normal([4, 35, 8])
tf.gather(data, axis=0, indices=[2, 3]).shape #參數分別代表:數據源、維度、對應維度的索引號
TensorShape([2, 35, 8])
tf.gather(data, axis=0, indices=[2, 1, 3, 0]).shape #可以理解為抽取第一個維度的索引所對應的順序為2,1,3,0
TensorShape([4, 35, 8])
?
4.2.轉置
?tf.transpose:[w,h] →[h, w]
??a=tf.random.normal([4, 3, 2, 1])
a.shape
TesorShape([4, 3, 2, 1])
tf.transpose(a).shape
TensorShape([1, 2, 3, 4])
?指定轉置的維度
#指定參數perm,可以指定轉置后的維度順序
tf.transpose(a, perm=[0, 1, 3, 2]).shape #前兩給維度保持不變,交換后兩個維度的順序
TensorShape([4, 3, 1, 2])
?
4.3.增加維度
?維度擴張:expand dim
?a: [classes, students, classes] → [4, 35, 8]: 可以描述為4個班級,每個班級有35個學生,每個學生有8門課程。
?增加學校的維度: [1, 4, 35, 8]+[1, 4, 35, 8] → [2, 4, 35, 8]
a=tf.random.normal([4, 35, 8])
tf.expand_dims(a, axis=0).shape #axis參數來制定要增加維度的位置
TensorShape([1, 4, 35, 8])
tf.expand_dims(a, axis=3).shape #等同于axis=-1
TensorShape([4, 35, 8, 1])
?
4.4.減少維度
?維度壓縮:
??squeeze dim
tf.squeeze(tf.zeros([1, 2, 1, 1, 3])).shape #默認將維度唯一的維度壓縮
TensorShape([2, 3])
??通過axis參數來指定要壓縮的維度:
a=tf.zeros([1, 2, 1, 3])
Tf.squeeze(a, axis=0).shape
TensorShape([2, 1, 3])
?4.5.broadcasting(廣播)
?Broadcasting:本質是張量維度擴張的一個手段,指對某一個維度上重復n次但是確沒有真正的復制一個數據。
?擴張
?沒有復制數據
?通過tf.broadcast_to來實現
?廣播的方法:
?在需要的時候添加維度,且添加維度的初始size為1。
?擴張初始化為1的維度大小與需要進行計算的維度大小相同。
?例: [4, 32, 32, 3]+[3], 對[3]進行broadcasting,方法如下:[3]→[1, 1, 1, 3] →[4, 32, 32, 3]
?4.5.1.廣播的優勢
?為什么使用broadcasting:
?編輯代碼更加簡潔:
?[classes, students, scores] : +5 score
?[4, 32, 8] + [4, 32, 8],通過expand的方式需要先把維度擴張到相同size, 再進行計算。
?[4, 32, 8] + [5.0] (此處的5.0為數值,shape為8),廣播的方式則是在后臺自動進行擴張計算。
?節省內存:不需要復制數據,不占內存。
?[4, 32, 8] → 1024*4
?[8] → 8*4
?
4.5.2.廣播的實現
?廣播的實現:不需要輸入tf.broadcast_to的命令,而是自動判斷該操作符是否支持broadcastng, 如果支持會自動進行廣播并完成計算。
a=tf.random.normal([4, 32, 32, 3])
(a+tf.random.normal([3])).shape
TensorShape([4, 32, 32, 3])
b=tf.broadcast_to(tf.random.normal([4, 1, 1, 1]), [4, 32, 32, 3])
b.shape #TensorShape([4, 32, 32, 3])
?
若無法復制成相同維度大小,則無法進行廣播運算。
(a+tf.random.normal([1, 4, 1, 1])).shape #第二維度因為已經給出4,而目標數據的第二個維度為32。
InvalidArgumentError: Incompatible shapes: [4, 32, 32, 3] Vvs. [1, 4, 1, 1]
?
本實驗利用網上已有的北京房價數據集預測了北京的房價,實現了TensorFlow的線性回歸應用。
上一篇: 大數據培訓_數據挖掘中離群點檢測方法
下一篇: Java培訓_反射中的Class對象