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.0,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)
# 設置迴歸的正確值爲兩個輸入的和加上一個隨機量。之所以要加上一個隨機量是爲了
# 加入不可預測的噪音,因爲不同的損失函數都會在能完全預測正確的時候最低。一般
# 來說噪音爲一個均值爲0的小量,所以這裏設置爲-0.05~0.05的隨機數
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={x:X[start:end],y_:Y[start:end]})
print(sess.run(w1))
若用均方誤差作爲損失函數,w1=[0.97437561,1.0243336]顯然接近真實值,但並不是我們期待的更好的預測結果。