tensorflow 基礎學習二:實現一個神經網絡


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))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM