构建神经网络之隐藏层
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]))
#权重Weight采用生成正态分布随机变量矩阵,行为in_size,列为out_size
biases=tf.Variable(tf.zeros([1,out_size])+0.1)
#偏差矩阵为1行out_size列的0.1
y=tf.matmul(inputs,Weights)+biases
#y=inouts*Weight+biases
#判断activation_function是否存在,若不存在则直接输出y,否则将y传入激励函数activation_function
if activation_function is None:
outputs=y
else:
outputs=activation_function(y)#将y值传入activation_function
#函数返回outputs
return outputs
x_data=np.linspace(-1,1,300)[:,np.newaxis]
#np.linespace表示-1到1之间等分成300份的一维数组
#[:,np.newaxis]表示列添加新的维度,x_data成为300行1列的矩阵,形状从一个一维数组(30,)变成(30,1)
noise=np.random.normal(0,0.05,x_data.shape)
#加入噪声,y会在x^2-0.5的线附近出现,使得数据更加真实,格式与x_data保持一致
y_data=np.square(x_data)-0.5+noise
#y=x^2-0.5+noise
xs=tf.placeholder(tf.float32,[None,1])
ys=tf.placeholder(tf.float32,[None,1])
#用placeholder占位,None表示接受任意数据
l1=add_layer(xs,1,10,activation_function=tf.nn.relu)
#l1定义为1行10列的添加层,即添加层l1输入为x_data,输入层有1个节点,本层有10个神经元,激励函数为relu
prediction=add_layer(l1,10,1,activation_function=None)#输出层
loss=tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction),reduction_indices = [1]))
#定义损失函数,每个实际值与预测值差的平方求和再求平均数,计算得分
train_step=tf.train.GradientDescentOptimizer(0.1).minimize(loss)
#定义反向传播函数,使用梯度下降法使得分变小
init=tf.global_variables_initializer()#初始化变量
with tf.Session() as sess:
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}))
#打印损失函数得分
loss得分情况输出如下,可以看到预测越来越准确
- 0.1254172
0.016962018
0.0068259095
0.0056489864
0.0050682784
0.004626374
0.004295696
0.0040645725
0.0038843015
0.003743085
0.003637338
0.003560216
0.0034932771
0.0034358478
0.003382061
0.0033384252
0.0032973283
0.0032651345
0.0032400752
0.003221214