在本文中會先介紹一些概念,然後給出乙個簡單的完整神經網路樣例程式。
首先啟用函式可以解決線性不可分問題。讀者可以訪問通過網頁瀏覽器就可以訓練簡單神經網路並實現視覺化過程。截圖如下所示:
神經網路模型的效果以及優化的目標是通過損失函式(loss function)來定義的。
分類問題(如手寫數字識別),如何判斷乙個輸出向量和期望向量有多接近。交叉熵是常用的評判方法之一。交叉熵刻畫了兩個概率分布之間的距離,它是分類問題中使用比較廣的一種損失函式。因為交叉熵一般會與softmax回歸一起使用,所以tensorflow對這兩個功能進行了封裝,並提供了tf.nn.softmax_cross_entropy_with_logits(labels=y_,logits=y),其中y表示神經網路的輸出結果,y_表示標準答案。
與分類問題不同,回歸問題解決的是對具體數值的**。對於回歸問題,最常用的損失函式是均方誤差(mse mean squared error)。當然也可以使用自己定義的損失函式。下面通過乙個簡單的神經網路程式來講解損失函式對模型訓練結果的影響。這個程式有兩個輸入節點、乙個輸出節點,沒有隱藏層。
import tensorflow as tf
from numpy.random import randomstate
batch_size = 8
#兩個輸入節點
x = tf.placeholder(tf.float32,shape=(none,2),name='x-input')
#回歸問題一般只有乙個輸出節點
y_ = tf.placeholder(tf.float32,shape=(none,1),name='y-input')
#定義乙個單層的神經網路前向傳播的過程,這裡就是簡單的加權和
w1 = tf.variable(tf.random_normal([2,1],stddev=1,seed=1))
y = tf.matmul(x,w1)
#定義**多了和**少了的成本
loss_less = 10
loss_more = 1
loss = tf.reduce_sum(tf.where(tf.greater(y,y_),
(y-y_)*loss_more,
(y_-y)*loss_less))
train_step = tf.train.adamoptimizer(0.001).minimize(loss)
#通過隨機數生成乙個模擬資料集
rdm = randomstate(1)
dataset_size = 128
x = rdm.rand(dataset_size,2)
y = [[x1+x2+rdm.rand()/10.0-0.05] for (x1,x2) in x]
# 訓練神經網路
with tf.session() as sess:
init_op = tf.global_variables_initializer()
sess.run(init_op)
steps = 5000
for i in range(steps):
start = (i*batch_size)%dataset_size
end = min(start+batch_size,dataset_size)
sess.run(train_step,
feed_dict=)
print(sess.run(w1))
執行以上**會得到w1的值為[1.019,1.042],也就是得到的**函式1.02x1+1.04x2,這比x1+x2要大。但如果將loss_less值調整為1,less_more調整為10,那麼最後的w1中的引數會略小於1,所以對於相同的神經網路,不同的損失函式會對訓練得到的模型產生重要的影響。
訓練神經網路的過程可以分為以下三個步驟:
定義神經網路的結構和前向傳播的輸出結果。
定義損失函式以及選擇反向傳播優化的演算法。
生成會話(tf.session)並且在訓練資料上反覆執行反向傳播優化演算法。
下面為在乙個模擬資料集上進行的神經網路訓練。
import tensorflow as tf
#通過numpy工具包生成模擬資料集
from numpy.random import randomstate
batch_size = 8
#定義神經網路的引數
w1 = tf.variable(tf.random_normal([2,3],stddev=1,seed=1))
w2 = tf.variable(tf.random_normal([3,1],stddev=1,seed=1))
x = tf.placeholder(tf.float32,shape=(none,2),name='x-input')
y_ = tf.placeholder(tf.float32,shape=(none,1),name='y-input')
#定義神經網路的前向傳播過程
a = tf.matmul(x,w1)
y = tf.matmul(a,w2)
#定義損失函式和反向傳播演算法
y = tf.sigmoid(y)
cross_entropy = -tf.reduce_mean(
y_ * tf.log(tf.clip_by_value(y,1e-10,1.0))
+(1-y_)*tf.log(tf.clip_by_value(1-y,1e-10,1.0)))
train_step = tf.train.adamoptimizer(0.001).minimize(cross_entropy)
#通過隨機數生成乙個模擬資料集
rdm = randomstate(1)
dataset_size = 128
x = rdm.rand(dataset_size,2)
y = [[int(x1+x2<1)] for (x1,x2) in x]
#建立乙個會話來執行tensorflow程式
with tf.session() as sess:
init_op = tf.global_variables_initializer()
#初始化變數
sess.run(init_op)
print(sess.run(w1))
print(sess.run(w2))
#設定訓練的輪數
steps = 10000
for i in range(steps):
#每次選取batch_size個樣本進行訓練
start = (i*batch_size)%dataset_size
end = min(start+batch_size,dataset_size)
#通過選取的樣本訓練神經網路並更新引數
sess.run(train_step,
feed_dict=)
if i%1000==0:
#每隔一段時間計算在所有資料上的交叉熵並輸出
total_cross_entropy = sess.run(
cross_entropy,feed_dict=
)print("after %d training step(s),cross entropy on all data is %g"%(i,total_cross_entropy))
print(sess.run(w1))
print(sess.run(w2))
tensorflow實踐 02 線性回歸
為了進一步熟悉tensorflow的基本操作,下面通過乙個線性回歸的小例子簡單展示一下tensorflow的基本使用流程。由於是簡單的線性回歸,我們自己生成乙份隨即資料作為演示就可以了。def createdata w,b x np.linspace 1,1,100 y w x b np.rando...
Tensorflow 入門記錄
tensor為張量,flow為流圖。tensorflow內含有很多寫好的工具,如梯度下降演算法,卷積操作等。在使用tensorflow時,先導入包import tensorflow as tf,在進行定義tensorflow變數時,使用tf.variable 引數 有趣的是乙個叫做佔位符的工具,tf...
tensorflow入門例子
import tensorflow as tf import numpy as np 使用 numpy 生成假資料 phony data 總共 100 個點.100,2 x data np.float32 np.random.rand 100,2 隨機輸入 y data np.dot x data,...