# 添加神经层
# add layer
# 层包括weights,biases,激励函数
import tensorflow as tf
import numpy as np
# 添加层,有输入,输入输出大小,激励函数(默认是为None,则是线性函数)
def add_layer(inputs,in_size,out_size,activation_function=None):
Weights = tf.Variable(tf.random_normal([in_size,out_size])) # 权重 用随机变量会比全部为0好很多 ,这里未变量矩阵
biases = tf.Variable(tf.zeros([1,out_size]) + 0.1) # biases不是矩阵,是类似列表的东西,在激励学习中,biases推荐不为0
Wx_plus_b = tf.matmul(inputs,Weights) + biases # 矩阵乘法 这是预测的值,还没被激活
if activation_function is None:
outputs = Wx_plus_b # 如果是线性函数则不需要添加激励函数(因为激励函数是非线性方程)
else:
outputs = activation_function(Wx_plus_b) # 把Wx_plus_b激活
return outputs
x_data = np.linspace(-1,1,300)[:,np.newaxis] # 建立-1到1的区间有300个单位,添加维度
noise = np.random.normal(0,0.05,x_data.shape) # 添加噪点,让它更像真实数据,方差是0.05,跟x_data一样的格式
y_data = np.square(x_data) - 0.5 + noise # 构建y_data为x_data的平方
xs = tf.placeholder(tf.float32,[None,1]) # None表示输出多少都ok
ys = tf.placeholder(tf.float32,[None,1])
# 建造第一层layer (输入层,隐藏层,输出层) 典型的神经网络,三层神经 ,只有一个属性, 一个神经元
# 定义隐藏层
layer1 = add_layer(xs,1,10,activation_function=tf.nn.relu) # 输入一个参数,隐藏层有10个神经元,使用tensorflow自带的激励方程
prediction = add_layer(layer1,10,1,activation_function=None) # 输出层
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),reduction_indices=[1])) # 算出prediction跟真实值的区别,求和后再求平均值
# 练习,提升误差
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss) # 学习效率(0.1), 减少误差, 用小步训练更能体现训练的效率
init = tf.initialize_all_variables() # 初始化所有变量
sess = tf.Session()
sess.run(init) # 运算
for i in range(1000):
sess.run(train_step,feed_dict={xs:x_data,ys:y_data})
# 输出结果,如果误差不断减少则效率提升
if i % 50 == 0:
print(sess.run(loss,feed_dict={xs:x_data,ys:y_data}))
输出
0.587287
0.00809391
0.00612073
0.00531567
0.0048084
0.00443714
0.00415135
0.00392712
0.00374785
0.00360647
0.00348928
0.0033773
0.00327797
0.00318462
0.00310172
0.00303527
0.00297711
0.00292976
0.00288618
0.00284872
误差越来越少