tensorflow独热编码方法_吴恩达课后作业学习2-week3-tensorflow learning-1-基本概念
參考:https://blog.csdn.net/u013733326/article/details/79971488
希望大家直接到上面的網(wǎng)址去查看代碼,下面是本人的筆記
到目前為止,我們一直在使用numpy來自己編寫神經(jīng)網(wǎng)絡(luò)。現(xiàn)在我們將一步步的使用深度學(xué)習(xí)的框架來很容易的構(gòu)建屬于自己的神經(jīng)網(wǎng)絡(luò)。我們將學(xué)習(xí)TensorFlow這個(gè)框架:
初始化變量
建立一個(gè)會(huì)話
訓(xùn)練的算法
實(shí)現(xiàn)一個(gè)神經(jīng)網(wǎng)絡(luò)
使用框架編程不僅可以節(jié)省你的寫代碼時(shí)間,還可以讓你的優(yōu)化速度更快。
1.導(dǎo)入TensorFlow庫
import numpy asnp
import h5py
import matplotlib.pyplotasplt
import tensorflowastffromtensorflow.python.framework import ops
import tf_utils
import time
#%matplotlib inline #如果你使用的是jupyter notebook取消注釋
np.random.seed(1)
2.說明TensorFlow代碼的實(shí)現(xiàn)流程
對(duì)于Tensorflow的代碼實(shí)現(xiàn)而言,實(shí)現(xiàn)代碼的結(jié)構(gòu)如下:
創(chuàng)建Tensorflow變量(此時(shí),尚未直接計(jì)算)
實(shí)現(xiàn)Tensorflow變量之間的操作定義
初始化Tensorflow變量
創(chuàng)建Session
運(yùn)行Session,此時(shí),之前編寫操作都會(huì)在這一步運(yùn)行。
1)所以舉例如果要計(jì)算損失函數(shù):
實(shí)現(xiàn)流程為:
#首先創(chuàng)建變量,這里設(shè)置了常量
y_hat= tf.constant(36,name="y_hat") #定義y_hat為固定值36
y= tf.constant(39,name="y") #定義y為固定值39
#實(shí)現(xiàn)變量之間的操作定義,即損失函數(shù)的計(jì)算
loss= tf.Variable((y-y_hat)**2,name="loss") #為損失函數(shù)創(chuàng)建一個(gè)變量
#聲明變量的初始化操作
init=tf.global_variables_initializer() #運(yùn)行之后的初始化(session.run(init))
#創(chuàng)建session,并打印輸出
#損失變量將被初始化并準(zhǔn)備計(jì)算
with tf.Session()assession:
#初始化變量
session.run(init)
#運(yùn)行session,這樣之前定義的變量間的操作都會(huì)在這里運(yùn)行,打印損失值
print(session.run(loss))
返回9
查看初始化和運(yùn)行前后變量的變化:
#首先創(chuàng)建變量
y_hat= tf.constant(36,name="y_hat") #定義y_hat為固定值36
y= tf.constant(39,name="y") #定義y為固定值39
#實(shí)現(xiàn)變量之間的操作定義,即損失函數(shù)的計(jì)算
loss= tf.Variable((y-y_hat)**2,name="loss") #為損失函數(shù)創(chuàng)建一個(gè)變量
print(y_hat)
print(y)
print(loss)
#聲明變量的初始化操作
init=tf.global_variables_initializer() #運(yùn)行之后的初始化(session.run(init))
#創(chuàng)建session,并打印輸出
#損失變量將被初始化并準(zhǔn)備計(jì)算
with tf.Session()assession:
#初始化變量
session.run(init)
print(y_hat)
print(y)
print(loss)
#運(yùn)行session,這樣之前定義的變量間的操作都會(huì)在這里運(yùn)行,打印損失值
print(session.run(loss))
print(y_hat)
print(y)
返回:
Tensor("y_hat_2:0", shape=(), dtype=int32)
Tensor("y_2:0", shape=(), dtype=int32)Tensor("y_hat_2:0", shape=(), dtype=int32)
Tensor("y_2:0", shape=(), dtype=int32)
9Tensor("y_hat_2:0", shape=(), dtype=int32)
Tensor("y_2:0", shape=(), dtype=int32)
再運(yùn)行一遍,可見版本號(hào)會(huì)變:
Tensor("y_hat_3:0", shape=(), dtype=int32)
Tensor("y_3:0", shape=(), dtype=int32)Tensor("y_hat_3:0", shape=(), dtype=int32)
Tensor("y_3:0", shape=(), dtype=int32)
9Tensor("y_hat_3:0", shape=(), dtype=int32)
Tensor("y_3:0", shape=(), dtype=int32)
如果注釋掉初始化就會(huì)報(bào)錯(cuò):
#首先創(chuàng)建變量
y_hat= tf.constant(36,name="y_hat") #定義y_hat為固定值36
y= tf.constant(39,name="y") #定義y為固定值39
#實(shí)現(xiàn)變量之間的操作定義,即損失函數(shù)的計(jì)算
loss= tf.Variable((y-y_hat)**2,name="loss") #為損失函數(shù)創(chuàng)建一個(gè)變量
print(y_hat)
print(y)
print(loss)
#聲明變量的初始化操作
#init=tf.global_variables_initializer() #運(yùn)行之后的初始化(session.run(init))
#創(chuàng)建session,并打印輸出
#損失變量將被初始化并準(zhǔn)備計(jì)算
with tf.Session()assession:
#初始化變量
#session.run(init)
#運(yùn)行session,這樣之前定義的變量間的操作都會(huì)在這里運(yùn)行,打印損失值
print(session.run(loss))
print(y_hat)
print(y)
返回:
Tensor("y_hat_5:0", shape=(), dtype=int32)
Tensor("y_5:0", shape=(), dtype=int32)...
FailedPreconditionError: Attempting to use uninitialized value loss_5
[[{{node _retval_loss_5_0_0}}= _Retval[T=DT_INT32, index=0, _device="/job:localhost/replica:0/task:0/device:CPU:0"](loss_5)]]
因此,當(dāng)我們?yōu)閾p失函數(shù)創(chuàng)建一個(gè)變量時(shí),我們簡單地將損失定義為其他數(shù)量的函數(shù),但沒有評(píng)估它的價(jià)值。
為了評(píng)估它,我們需要運(yùn)行init=tf.global_variables_initializer(),初始化損失變量,在最后一行,我們最后能夠評(píng)估損失的值并打印它的值。
所以init=tf.global_variables_initializer()的作用對(duì)應(yīng)的是聲明為變量的損失函數(shù)loss = tf.Variable((y-y_hat)**2,name="loss")
2)另外一個(gè)更簡單的函數(shù)
#創(chuàng)建變量
a= tf.constant(2)
b= tf.constant(10)
#實(shí)現(xiàn)變量之間的操作定義
c=tf.multiply(a,b)
print(c)
返回:
Tensor("Mul:0", shape=(), dtype=int32)
正如預(yù)料中一樣,我們并沒有看到結(jié)果20,不過我們得到了一個(gè)Tensor類型的變量,沒有維度,數(shù)字類型為int32。我們之前所做的一切都只是把這些東西放到了一個(gè)“計(jì)算圖(computation graph)”中,而我們還沒有開始運(yùn)行這個(gè)計(jì)算圖,為了實(shí)際計(jì)算這兩個(gè)數(shù)字,我們需要?jiǎng)?chuàng)建一個(gè)會(huì)話并運(yùn)行它:
#創(chuàng)建會(huì)話
sess=tf.Session()
#使用會(huì)話運(yùn)行操作
print(sess.run(c)) #返回20
??因?yàn)檫@里沒有聲明變量,所以不用使用init=tf.global_variables_initializer()來初始化變量
總結(jié)一下,記得初始化變量,然后創(chuàng)建一個(gè)session來運(yùn)行它。
3.會(huì)話
可以使用兩種方法來創(chuàng)建并使用session
方法一:
sess =tf.Session()
result= sess.run(...,feed_dict ={...})
sess.close()
方法二:
with tf.Session assess:
result= sess.run(...,feed_dict = {...})
4.占位符(placeholder)
占位符是一個(gè)對(duì)象,它的值只能在稍后指定,要指定占位符的值,可以使用一個(gè)feed_dict變量來傳入,接下來,我們?yōu)閤創(chuàng)建一個(gè)占位符,這將允許我們?cè)谏院筮\(yùn)行會(huì)話時(shí)傳入一個(gè)數(shù)字。
#利用feed_dict來改變x的值
x= tf.placeholder(tf.int64,name="x")
print(x)
print(sess.run(2 * x,feed_dict={x:3}))
sess.close()
返回:
Tensor("x:0", dtype=int64)6
當(dāng)我們第一次定義x時(shí),我們不必為它指定一個(gè)值。 占位符只是一個(gè)變量,我們會(huì)在運(yùn)行會(huì)話時(shí)將數(shù)據(jù)分配給它。
5.線性函數(shù)
讓我們通過計(jì)算以下等式來開始編程:Y=WX+b,W和X是隨機(jī)矩陣,b是隨機(jī)向量。
我們計(jì)算WX+b,其中W,X和b是從隨機(jī)正態(tài)分布中抽取的。 W的維度是(4,3),X是(3,1),b是(4,1)。
我們開始定義一個(gè)shape=(3,1)的常量X:
X = tf.constant(np.random.randn(3,1), name = "X")
代碼:
def linear_function():"""實(shí)現(xiàn)一個(gè)線性功能:
初始化W,類型為tensor的隨機(jī)變量,維度為(4,3)
初始化X,類型為tensor的隨機(jī)變量,維度為(3,1)
初始化b,類型為tensor的隨機(jī)變量,維度為(4,1)
返回:
result- 運(yùn)行了session后的結(jié)果,運(yùn)行的是Y = WX +b"""np.random.seed(1) #指定隨機(jī)種子
X= np.random.randn(3,1)
W= np.random.randn(4,3)
b= np.random.randn(4,1)
Y=tf.add(tf.matmul(W,X),b) #tf.matmul是矩陣乘法
#Y= tf.matmul(W,X) +b #也可以以寫成這樣子
#創(chuàng)建一個(gè)session并運(yùn)行它
sess=tf.Session()
result=sess.run(Y)
#session使用完畢,關(guān)閉它
sess.close()return result
測試:
print("result =" + str(linear_function()))
返回:
result = [[-2.15657382]
[2.95891446]
[-1.08926781]
[-0.84538042]]
6.計(jì)算sigmoid函數(shù)
TensorFlow提供了多種常用的神經(jīng)網(wǎng)絡(luò)的函數(shù)比如tf.softmax和tf.sigmoid。
我們將使用占位符變量x,當(dāng)運(yùn)行這個(gè)session的時(shí)候,我們西藥使用使用feed_dict來輸入z,我們將創(chuàng)建占位符變量x,使用tf.sigmoid來定義操作,最后運(yùn)行session,我們會(huì)用到下面的代碼:
tf.placeholder(tf.float32, name = “x”)
sigmoid = tf.sigmoid(x)
sess.run(sigmoid, feed_dict = {x: z})
實(shí)現(xiàn):
def sigmoid(z):"""實(shí)現(xiàn)使用sigmoid函數(shù)計(jì)算z
參數(shù):
z-輸入的值,標(biāo)量或矢量
返回:
result-用sigmoid計(jì)算z的值"""#創(chuàng)建一個(gè)占位符x,名字叫“x”
x= tf.placeholder(tf.float32,name="x")
#計(jì)算sigmoid(z)
sigmoid=tf.sigmoid(x)
#創(chuàng)建一個(gè)會(huì)話,使用方法二
with tf.Session()assess:
result= sess.run(sigmoid,feed_dict={x:z})return result
測試:
print ("sigmoid(0) =" + str(sigmoid(0)))
print ("sigmoid(12) =" + str(sigmoid(12)))
返回:
sigmoid(0) = 0.5sigmoid(12) = 0.9999938
7.計(jì)算成本函數(shù)
還可以使用內(nèi)置函數(shù)計(jì)算神經(jīng)網(wǎng)絡(luò)的成本。因此,不需要編寫代碼來計(jì)算成本函數(shù)的a[2](i)和y(i),如:
tensorflow提供了用來計(jì)算成本的函數(shù):
tf.nn.sigmoid_cross_entropy_with_logits(logits = ..., labels = ...)
logits:前向傳播的結(jié)果AL,如果使用的是softmax,這里傳入的是ZL
labels:真正的結(jié)果Y
8.使用獨(dú)熱編碼(0,1編碼)
很多時(shí)候在深度學(xué)習(xí)中y向量的維度是從0到C?1的,C是指分類的類別數(shù)量,如果C=4,那么對(duì)y而言你可能需要有以下的轉(zhuǎn)換方式:
這叫做獨(dú)熱編碼(”one hot” encoding),因?yàn)樵谵D(zhuǎn)換后的表示中,每列的一個(gè)元素是“hot”(意思是設(shè)置為1)。 要在numpy中進(jìn)行這種轉(zhuǎn)換,您可能需要編寫幾行代碼。 在tensorflow中,只需要使用一行代碼:
tf.one_hot(labels,depth,axis)
下面我們要做的是取一個(gè)標(biāo)簽矢量(即圖片的判斷結(jié)果)和C類總數(shù),返回一個(gè)獨(dú)熱編碼。
def one_hot_matrix(lables,C):"""創(chuàng)建一個(gè)矩陣,其中第i行對(duì)應(yīng)第i個(gè)類號(hào),第j列對(duì)應(yīng)第j個(gè)訓(xùn)練樣本
所以如果第j個(gè)樣本對(duì)應(yīng)著第i個(gè)標(biāo)簽,那么entry (i,j)將會(huì)是1
參數(shù):
lables-標(biāo)簽向量
C-分類數(shù)
返回:
one_hot-獨(dú)熱矩陣"""#創(chuàng)建一個(gè)tf.constant,賦值為C,名字叫C
C= tf.constant(C,name="C")
#使用tf.one_hot,注意一下axis
one_hot_matrix= tf.one_hot(indices=lables , depth=C , axis=0)
#創(chuàng)建一個(gè)session
sess=tf.Session()
#運(yùn)行session
one_hot=sess.run(one_hot_matrix)
#關(guān)閉session
sess.close()return one_hot
測試:
labels = np.array([1,2,3,0,2,1])
one_hot= one_hot_matrix(labels,C=4)
print(str(one_hot))
返回:
[[0. 0. 0. 1. 0. 0.]
[1. 0. 0. 0. 0. 1.]
[0. 1. 0. 0. 1. 0.]
[0. 0. 1. 0. 0. 0.]]
9.初始化參數(shù)
學(xué)習(xí)如何用0或者1初始化一個(gè)向量,我們要用到tf.ones()和tf.zeros(),給定這些函數(shù)一個(gè)維度值那么它們將會(huì)返回全是1或0的滿足條件的向量/矩陣,我們來看看怎樣實(shí)現(xiàn)它們:
def ones(shape):"""創(chuàng)建一個(gè)維度為shape的變量,其值全為1
參數(shù):
shape-你要?jiǎng)?chuàng)建的數(shù)組的維度
返回:
ones-只包含1的數(shù)組"""#使用tf.ones()
ones=tf.ones(shape)
#創(chuàng)建會(huì)話
sess=tf.Session()
#運(yùn)行會(huì)話
ones=sess.run(ones)
#關(guān)閉會(huì)話
sess.close()return ones
測試:
print ("ones =" + str(ones([3])))
返回:
ones = [1. 1. 1.]
總結(jié)
以上是生活随笔為你收集整理的tensorflow独热编码方法_吴恩达课后作业学习2-week3-tensorflow learning-1-基本概念的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 职高计算机专业c语言_C语言程序设计(全
- 下一篇: python微信语音转发方法_【高逼格技