tensorflow變量
在tensorflow中,變量(tf.Variable)的作用就是用來保存和更新神經網絡中的參數,在聲明變量的同時需要指定其初始值。
tensorflow中支持的隨機數生成器:
函數名稱 | 隨機數分布 | 主要參數 |
tf.random_normal | 正態分布 | 平均值、標准差、取值類型 |
tf.truncated_normal | 正態分布,但如果隨機出來的值偏離平均值超過2個標准差,那么這個數將會被重新隨機 | 平均值、標准差、取值類型 |
tf.random_uniform | 平均分布 | 最小、最大取值,取值類型 |
tf.random_gamma | Gamma分布 | 形狀參數alpha、尺度參數beta、取值類型 |
tensorflow也支持使用常數來初始化一個變量,常用的常量生成函數如下表
函數名稱 | 功能 | 實例 |
tf.zeros | 產生全0的數組 | tf.zeros([2,3],int32)->[[0,0,0],[0,0,0]] |
tf.ones | 產生全1的數組 | tf.ones([2,3],int32)->[[1,1,1],[1,1,1]] |
tf.fill | 產生一個全部為給定數字的數組 | tf.fill([2,3],9)->[[9,9,9],[9,9,9]] |
tf.constant | 產生一個給定值的常量 | tf.constant([1,2,3])->[1,2,3] |
如下代碼聲明變量的幾種方式:
import tensorflow as tf # 生成一個2*3的矩陣,矩陣中的元素均值為0,標准差為2。 weights=tf.Variable(tf.random_normal([2,3],stddev=2)) # 生成一個初始值全為0,長度為3的變量 biases=tf.Variable(tf.zeros([3])) # 使用其他變量的初始值來初始化新的變量 w2=tf.Variable(weights.initialized_value()) w3=tf.Variable(weights.initialized_value()*2.0)
實現一個簡單的網絡,代碼如下
# 定義一個簡單的網絡 import tensorflow as tf from numpy.random import RandomState # 定義訓練數據batch的大小 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) # 定義損失函數和反向傳播算法 cross_entropy=-tf.reduce_mean(y_*tf.log(tf.clip_by_value(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] with tf.Session() as sess: init_op=tf.global_variables_initializer() sess.run(init_op) print('訓練前網絡參數的值為:') print(sess.run(w1)) print(sess.run(w2)) # 設定訓練的輪數 STEPS=5000 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={x:X[start:end],y_:Y[start:end]}) if i % 1000==0: # 每隔一段時間計算在所有數據上的交叉熵並輸出 total_cross_entropy=sess.run(cross_entropy,feed_dict={x:X,y_:Y}) print("After {} training step(s),cross entropy on all data is {}". format(i,total_cross_entropy)) print('訓練后網絡參數的值為:') print(sess.run(w1)) print(sess.run(w2))