1. 程式人生 > >Tensorflow 二分法測試

Tensorflow 二分法測試

二分法 sigmoid dict 測試數據 數據 initial 網絡 cost ria

測試兩個浮點型數據相加是否大於1
以下代碼只是使用了單層網絡進行計算,並未使用 偏移量;隨機梯度下降等更深層次的概念。

如果訓練集數據大小過大時,需要使用隨機梯度下降的方式來加快訓練時間。
學習率如果設置過小,會顯著增加訓練時間;如果過大,又會無法找到全局最優解。

#
"""
二分法測試
原始數據:隨機生成[2]數組
目標數據:數組[0]+[1]的結果如果大於等於1,則為1;否則為0。see:get_result
"""
import tensorflow as tf
from numpy import random

TRAIN_SIZE = 1000  # 訓練數據大小
VALIDATE_SZIE =
200 # 驗證數據大小 TEST_SIZE = 2000 # 測試數據大小 def get_result(t): # 根據數據創建結果。數據和>=1,結果=1;否則=0 return [[1] if (m[0] + m[1]) >= 1 else [0] for m in t] SOURCE = random.rand(TRAIN_SIZE, 2) # 訓練原始數據集 RESULT = get_result(SOURCE) # 訓練結果數據集 V_X = random.rand(VALIDATE_SZIE, 2) # 校驗原始數據集 V_Y = get_result(V_X) # 校驗結果數據集
T_X = random.rand(TEST_SIZE, 2) # 測試原始數據集 T_Y = get_result(T_X) # 測試結果數據集 X = tf.placeholder(tf.float32, shape=[None, 2], name=‘input‘) # 原始數據占位符 Y = tf.placeholder(tf.float32, shape=[None, 1], name=‘output‘) # 輸出數據占位符,用來與計算輸出數據比較,得出損失值 HIDDEN_SIZE = 500 # 隱藏層數量 def init_weight(shape): return
tf.Variable(tf.random_normal(shape, stddev=0.01)) W_1 = init_weight([2, HIDDEN_SIZE]) # 隱藏層1 W_OUTPUT = init_weight([HIDDEN_SIZE, 1]) # 輸出層 OUTPUT = tf.matmul(tf.nn.sigmoid(tf.matmul(X, W_1)), W_OUTPUT) # 原始數據通過隱藏層計算結果 _loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=OUTPUT, labels=Y)) # 損失值 _train = tf.train.GradientDescentOptimizer(0.05).minimize(_loss) # 計算方法 STEPS = 30001 # 訓練輪次 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) # 首先初始化所有數據 for i in range(STEPS): # 個人水平有限,這裏沒有采用批次的方式進行訓練 sess.run(_train, feed_dict={X: SOURCE, Y: RESULT}) if i % 1000 == 0: # 每1000輪時,使用校驗數據計算損失值 _cost = sess.run(_loss, feed_dict={X: V_X, Y: V_Y}) print("經過 {:>5d} 輪訓練,使用 校驗數據集 測試損失值為:{}。".format(i, _cost)) if i % 5000 == 0: # 每5000輪,使用測試數據集直接判斷結果,輸出結果正確率 _out = [[1] if m > 1 else [0] for m in sess.run(OUTPUT, feed_dict={X: T_X})] _s = len([1 for i in range(len(T_Y)) if T_Y[i] == _out[i]]) print(‘經過 {:>5d} 輪訓練,使用 測試數據集進行測試,{}(正確數量)/{}(總數據量)={:.2%}‘.format(i, _s, len(T_Y), _s / len(T_Y)))

輸出內容如下:

經過     0 輪訓練,使用 校驗數據集 測試損失值為:0.6941196322441101。
經過     0 輪訓練,使用 測試數據集進行測試,987(正確數量)/2000(總數據量)=49.35%
經過  1000 輪訓練,使用 校驗數據集 測試損失值為:0.6805213689804077。
經過  2000 輪訓練,使用 校驗數據集 測試損失值為:0.538556694984436。
經過  3000 輪訓練,使用 校驗數據集 測試損失值為:0.2825967073440552。
經過  4000 輪訓練,使用 校驗數據集 測試損失值為:0.1842319369316101。
經過  5000 輪訓練,使用 校驗數據集 測試損失值為:0.14281019568443298。
經過  5000 輪訓練,使用 測試數據集進行測試,1808(正確數量)/2000(總數據量)=90.40%
經過  6000 輪訓練,使用 校驗數據集 測試損失值為:0.12008533626794815。
經過  7000 輪訓練,使用 校驗數據集 測試損失值為:0.10553856194019318。
經過  8000 輪訓練,使用 校驗數據集 測試損失值為:0.0953076109290123。
經過  9000 輪訓練,使用 校驗數據集 測試損失值為:0.08765047043561935。
經過 10000 輪訓練,使用 校驗數據集 測試損失值為:0.08166348189115524。
經過 10000 輪訓練,使用 測試數據集進行測試,1905(正確數量)/2000(總數據量)=95.25%
經過 11000 輪訓練,使用 校驗數據集 測試損失值為:0.07682867348194122。
經過 12000 輪訓練,使用 校驗數據集 測試損失值為:0.07282623648643494。
經過 13000 輪訓練,使用 校驗數據集 測試損失值為:0.06944723427295685。
經過 14000 輪訓練,使用 校驗數據集 測試損失值為:0.06654875725507736。
經過 15000 輪訓練,使用 校驗數據集 測試損失值為:0.0640294998884201。
經過 15000 輪訓練,使用 測試數據集進行測試,1928(正確數量)/2000(總數據量)=96.40%
經過 16000 輪訓練,使用 校驗數據集 測試損失值為:0.06181534752249718。
經過 17000 輪訓練,使用 校驗數據集 測試損失值為:0.05985085666179657。
經過 18000 輪訓練,使用 校驗數據集 測試損失值為:0.058093465864658356。
經過 19000 輪訓練,使用 校驗數據集 測試損失值為:0.05651006102561951。
經過 20000 輪訓練,使用 校驗數據集 測試損失值為:0.055074337869882584。
經過 20000 輪訓練,使用 測試數據集進行測試,1936(正確數量)/2000(總數據量)=96.80%
經過 21000 輪訓練,使用 校驗數據集 測試損失值為:0.053765200078487396。
經過 22000 輪訓練,使用 校驗數據集 測試損失值為:0.05256548896431923。
經過 23000 輪訓練,使用 校驗數據集 測試損失值為:0.05146101117134094。
經過 24000 輪訓練,使用 校驗數據集 測試損失值為:0.05044003576040268。
經過 25000 輪訓練,使用 校驗數據集 測試損失值為:0.0494927316904068。
經過 25000 輪訓練,使用 測試數據集進行測試,1949(正確數量)/2000(總數據量)=97.45%
經過 26000 輪訓練,使用 校驗數據集 測試損失值為:0.048610806465148926。
經過 27000 輪訓練,使用 校驗數據集 測試損失值為:0.047787100076675415。
經過 28000 輪訓練,使用 校驗數據集 測試損失值為:0.047015562653541565。
經過 29000 輪訓練,使用 校驗數據集 測試損失值為:0.04629102721810341。
經過 30000 輪訓練,使用 校驗數據集 測試損失值為:0.04560888186097145。
經過 30000 輪訓練,使用 測試數據集進行測試,1952(正確數量)/2000(總數據量)=97.60%

Tensorflow 二分法測試