import tensorflow as tf
# 利用numpy生成数据集
from numpy.random import RandomState
# 定义训练集的barch大小
batch_size = 8
# 定义神经网络的参数
w1 = tf.Variable(tf.random_normal([2,3],stddev = 1,seed=1))
# 在shape的一个维度上使用None可以方便使用不同规模大小的batch
x = tf.placeholder(tf.float32,shape=(None,2),name='x_input') #不指定行数只指定输入列数
y_ = tf.placeholder(tf.float32,shape=(None,1),name='y_input')
#定义神经网络的前向传播过程
y = tf.matmul(x,w1)
# 激活函数的选择
# ReLU f(x) = max(x,0)
# sigmoid f(x) = 1 / (1+e**-x)
# tanh f(x) = (1-e**-2*x) / (1+e**-2*x)
# 定义损失函数和反向传播算法
# 如果预测少了损失函数系数为10,预测多了损失函数系数为1
loss_less = 10
loss_more = 1
# tf.where 第一个参数是条件,第二个参数是为真的取值,第三个参数是为假的取值,类似于excel
# tf.greater(a,b) if a> b return True else return False
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)
print(sess.run(w1))
'''
[[-0.81131822 1.48459876 0.06532937]
[-2.4427042 0.0992484 0.59122431]]
'''
# 设定训练的轮数
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]})
if i % 1000 == 0:
total_loss_function = sess.run(loss,feed_dict={x:X,y_:Y})
print("After %d training steps, loss function on all data is %g"%(i,total_loss_function))
'''
After 0 training steps, loss function on all data is 4705.95
After 1000 training steps, loss function on all data is 2297.3
After 2000 training steps, loss function on all data is 1001.62
After 3000 training steps, loss function on all data is 172.299
After 4000 training steps, loss function on all data is 66.8202
'''
print(sess.run(w1))
'''
[[ 1.57269204 1.01884651 1.01993823]
[ 0.94328171 1.04256701 1.04327226]]
'''