参考网上给的例程使用tensorflow实现了一个简单的全连接层网络的搭建。训练一个神经网络匹配二元函数。
步骤主要如下:
- 导入相应的包
- 定义添加层
- 准备训练数据
- 构建神经网络层
- 定义损失函数和训练优化使损失函数最小化
- 初始化变量,激活结构
- 迭代训练
1、首先导入相应的包,有tensorflow、numpy
import tensorflow as tf
import numpy as np
2.然后是定义添加层add_layer
def add_layer(inputs,in_size,out_size,activation_function=None):
w = tf.Variable(tf.random_normal([in_size,out_size]))
b = tf.Variable(tf.zeros([1,out_size])+0.1)
f = tf.matmul(inputs,w)+b
if activation_function is None:
outputs = f
else:
outputs = activation_function(f)
return outputs
用tf.Variable定义变量权重w和偏置量b,w定义为大小是输入尺寸X输出尺寸的矩阵,初始化为随机正态分布。b定义为大小是1X输出尺寸的矩阵,初始化为0.1 。可以选择是否需要激励函数。
3.准备训练数据
x_data = np.linspace(-1,1,300,dtype=np.float32)[:,np.newaxis]
noise = np.random.normal(0,0.05,x_data.shape)
y_data = np.square(x_data)-0.5+noise
np.linspaces用来创建一个等差数列,最小值是-1,最大值是1,一共有300个数据。
np.newaxis为numpy.ndarray(多维数组)增加了一个轴,np.newaxis在功能上等同于None,np.newaxis = None。那么x_data.shape=[300,1]。
准备训练数据,噪声noise遵循随机正态分布(均值为0,方差为0.5),尺寸与输入x相同。
4.定义节点准备接收数据
xs = tf.placeholder(tf.float32,[None,1])
ys = tf.placeholder(tf.float32,[None,1])
placeholder的作用是提供输入数据的空位,实际问题产生的原始数据丢入到placeholder中,然后被一个叫feed_dict的对象收集到TensorFlow当中,再交给神经网络去处理得到一个预测结果。placeholder就是是原始数据的入口。
因为目前不知道输入和输出x、y有多少个数据,因此尺寸为[None,1]。
5.构建神经网络层
l1 = add_layer(xs,1,10,activation_function=tf.nn.relu)
prediction = add_layer(l1,10,1,activation_function=None)
神经网络只有两层,一层输入一层输出。第一层输入是1输出是10,使用relu=max(0,x)激活函数。输出层输入是上一层的输出,输入是10,输出是1即预测的y值,不使用激活函数。
6.损失函数
loss = tf.reduce_mean(tf.reduce_sum(tf.square(y_data-prediction),reduction_indices=[1]))
采用均方差定义损失函数:
7.训练优化损失函数
train = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
选择最基本的优化器Gradient Descent,设置学习率为0.1。
8.初始化及激活
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
用tf.global_variables_initializer()初始化全部变量。然后要把结构激活,Session是个对象要记得首字母要大写,它就像一个指针一样指向要执行的地方。
9.迭代训练
for i in range(1000):
sess.run(train,feed_dict={xs:x_data,ys:y_data})
if(i%50==0):
print(sess.run(loss,feed_dict={xs:x_data,ys:y_data}))
迭代训练1000次优化神经网络,使用feed_dict将实际数据收集起来输入网络。没迭代50次就打印输出损失结果。