TensorFlow不是壹個純粹的神經網絡框架,而是壹個使用數據流圖進行數值分析的框架。
TensorFlow使用有向圖來表示計算任務。圖的節點稱為ops(操作)來表示數據處理,圖的邊流描述了數據的流向。
這個框架的計算過程就是處理張量組成的流,這也是TensorFlow這個名字的來源。
TensorFlow使用張量來表示數據。Tensor的意思是張量,也就是高維數組,在python中用numpy.ndarray來表示。
TensorFlow使用會話來執行圖形,使用變量來維護狀態。tf.constant是壹個只輸出的ops,常用作數據源。
讓我們構建壹個只有兩個常量作為輸入簡單圖形,然後進行矩陣乘法:
從張量流導入session,device,constant,matmul ' '構建壹個只有兩個常數作為輸入然後矩陣相乘的簡單圖形:' ' #如果不使用with session()語句,需要手動執行session.close()。
#with device device指定執行計算的設備:
# "/cpu:0 ":機器的cpu。
# "/gpu:0 ":機器的第壹個gpu,如果有的話。
# "/gpu:1 ":機器的第二個gpu,以此類推。
將會話()作為會話:?#創建執行圖的上下文
使用設備('/cpu:0 '):?#指定計算設備
mat1 =常數([[3,3]])?#創建源節點
mat2 =常數([[2],[2]])
Product = matmul (mat1,mat2) #指定節點的前節點,創建壹個圖。
Result = session.run(product) #執行計算打印(result)12345678910121314151565438。
讓我們用變量來制作壹個計數器:
從tensorflow導入會話,常量,變量,添加,賦值,初始化所有變量
State = variable (0,name = ' counter ')# Create counter one = constant(1)# Create data source:1 Val = add(state,one)# Create new value node Update = assign(state,Val)# Update counter setup = Initialize _ all _ variables()# Initialize variable with Session()as Session:
Session.run(setup) #執行初始化。
Print(session.run(state)) #輸出初始值。
對於範圍(3)中的I:
Session.run(update) #執行更新。
Print(session.run(state)) #輸出計數器值12345678910111213。
在使用變量之前,必須運行initialize_all_variables()返回的圖,運行變量節點將返回變量的值。
在這個例子中,構建圖的過程脫離了上下文,並且沒有指定運行設備。
在上面的例子中,session.run只接受壹個op作為參數,但實際上,run可以接受op列表作為輸入:
session.run([op1,op2])1
上面的例子壹直使用constant作為數據源,feed可以在運行時動態輸入數據:
從tensorflow導入會話,占位符,mul,float32
input1 =占位符(float32)
input2 =占位符(float32)
output = mul(input1,input2),Session()為Session:print Session . run(output,feed_dict={input1: [3],input2: [2]})1234567
實現壹個簡單的神經網絡
神經網絡是壹種廣泛使用的機器學習模型。關於神經網絡的原理,可以參考這篇短文或者在tensorflow遊樂場上體驗在線演示。
首先,定義壹個BPNeuralNetwork類:
BPNeuralNetwork類:
def __init__(self):
self.session = tf。會話()
self.input_layer =無
self.label_layer =無
自我損失=無
自我教練=無
self.layers = [] def __del__(self):
self . session . close()1234567891011
編寫生成單層神經網絡的函數,每層神經元用數據流圖表示。用壹個變量矩陣表示與前神經元的連接權重,用另壹個變量向量表示偏移值,並為這壹層設置壹個激勵函數。
def make_layer(輸入,輸入大小,輸出大小,激活=無):
重量= tf。變量(tf.random_normal([in_size,out_size])
基礎= tf。變量(tf.zeros([1,out_size]) + 0.1)
result = tf.matmul(inputs,weights) + basis如果activate為None:返回結果否則:返回activate(result)12345678
使用占位符作為輸入層。
self . input _ layer = TF . placeholder(TF . float 32,[None,2])1
占位符的第二個參數是張量的形狀,[None,1]表示二維數組,行數不限,列數為1,與numpy.array.shape含義相同,這裏self.input_layer定義為接受二維輸入的輸入層。
還使用占位符來表示訓練數據的標簽:
self . label _ layer = TF . placeholder(TF . float 32,[None,1])1
使用make_layer為神經網絡定義兩個隱藏層,並將最後壹層用作輸出層:
self . loss = TF . reduce _ mean(TF . reduce _ sum(TF . square((self . label _ layer-self . layers[1])),reduction _ indexes =[1]))1
Tf.train提供了壹些可用於訓練神經網絡的優化器。以最小化損失函數為目標:
self . trainer = TF . train . gradiendescentoptimizer(learn _ rate)。最小化(自我損失)1
使用會話運行神經網絡模型:
initer = TF . initialize _ all _ variables()# do training self . session . run(initer)
對於範圍內的I(限制):
self.session.run(self.trainer,feed _ dict = { self . input _ layer:cases,self . label _ layer:labels })12345
使用訓練好的模型來預測:
self . session . run(self . layers[-1],feed _ dict = { self . input _ layer:case })1
完整代碼:
將tensorflow作為tfimport numpy作為npdef make_layer導入(inputs,in_size,out_size,activate=None):
重量= tf。變量(tf.random_normal([in_size,out_size])
基礎= tf。變量(tf.zeros([1,out_size]) + 0.1)
result = tf.matmul(inputs,weights) + basis如果activate為None:返回結果否則:返回activate(result)類BPNeuralNetwork:
def __init__(self):
self.session = tf。會話()
self.input_layer =無
self.label_layer =無
自我損失=無
self.optimizer =無
self.layers = [] def __del__(self):
self.session.close()定義訓練(self,cases,labels,limit=100,learn_rate=0.05):
#建立壹個網絡
self . input _ layer = TF . placeholder(TF . float 32,[None,2])
self . label _ layer = TF . placeholder(TF . float 32,[None,1])
self . layers . append(make _ layer(self . input _ layer,2,10,activate=tf.nn.relu))
self . layers . append(make _ layer(self . layers[0],10,2,activate=None))
self . loss = TF . reduce _ mean(TF . reduce _ sum(TF . square((self . label _ layer-self . layers[1])),reduction _ indexes =[1]))
self . optimizer = TF . train . gradiendescentoptimizer(learn _ rate)。最小化(自我損失)
initer = TF . initialize _ all _ variables()#做訓練。
範圍(限制)內I的self.session.run(initer):
self . session . run(self . optimizer,feed _ dict = { self . input _ layer:cases,self . label _ layer:labels })def predict(self,case):
return self . session . run(self . layers[-1],feed _ dict = { self . input _ layer:case })def test(self):
x_data = np.array([[0,0],[0,1],[1,0],[1,1]])
y_data = np.array([[0,1,1,0]])。轉置()
test_data = np.array([[0,1]])
self.train(x_data,y_data)
打印(自我預測(測試數據))
nn = BPNeuralNetwork()
nn . test()123456789101121314161718192021222324252628
上述模型雖然簡單,但使用起來並不靈活。作者用同樣的思路實現了壹個自定義輸入輸出維數和多層隱神經元的網絡。請參見dynamic_bpnn.py
將tensorflow作為tfimport numpy作為npdef make_layer導入(inputs,in_size,out_size,activate=None):
重量= tf。變量(tf.random_normal([in_size,out_size])
基礎= tf。變量(tf.zeros([1,out_size]) + 0.1)
result = tf.matmul(inputs,weights) + basis如果activate為None:返回結果否則:返回activate(result)類BPNeuralNetwork:
def __init__(self):
self.session = tf。會話()
自我損失=無
self.optimizer =無
self.input_n = 0
self.hidden_n = 0
self.hidden_size = []
self.output_n = 0
self.input_layer =無
self.hidden_layers = []
self.output_layer =無
self.label_layer =無
def __del__(self):
self . session . close()def setup(self,ni,nh,no):
#設置參數的數量
self.input_n = ni
self.hidden_n = len(nh)?#隱藏層數
self.hidden_size = nh?#每個隱藏層中的單元格數量
Self.output_n = no #構建輸入層。
self . input _ layer = TF . placeholder(TF . float 32,[none,self.input _ n]) #構建壹個標簽層。
self . label _ layer = TF . placeholder(TF . float 32,[none,self.output _ n]) #建立壹個隱藏層。
in_size = self.input_n
out_size = self.hidden_size[0]
輸入=自身.輸入_圖層
self . hidden _ layers . append(make _ layer(inputs,in_size,out_size,activate = TF . nn . relu))for I in range(self . hidden _ n-1):
in_size = out_size
out _ size = self . hidden _ size[I+1]
inputs = self . hidden _ layers[-1]
self . hidden _ layers . append(make _ layer(inputs,in _ size,out _ size,activate = tf.nn.relu)) #構建輸出層。
self . output _ layer = make _ layer(self . hidden _ layers[-1],self.hidden_size[-1],self.output_n) def train(self,cases,labels,limit=100,learn_rate=0.05):
self . loss = TF . reduce _ mean(TF . reduce _ sum(TF . square((self . label _ layer-self . output _ layer)),reduction _ indexes =[1]))
self . optimizer = TF . train . gradiendescentoptimizer(learn _ rate)。最小化(自我損失)
initer = TF . initialize _ all _ variables()#做訓練。
範圍(限制)內I的self.session.run(initer):
self . session . run(self . optimizer,feed _ dict = { self . input _ layer:cases,self . label _ layer:labels })def predict(self,case):
return self . session . run(self . output _ layer,feed _ dict = { self . input _ layer:case })def test(self):
x_data = np.array([[0,0],[0,1],[1,0],[1,1]])
y_data = np.array([[0,1,1,0]])。轉置()
test_data = np.array([[0,1]])
自助設置(2,[10,5],1)
self.train(x_data,y_data)
打印(自我預測(測試數據))
nn = BPNeuralNetwork()
nn . test()123456789101121314161718192021222324252628