用tensorflow实现简单的全连接层网络

参考网上给的例程使用tensorflow实现了一个简单的全连接层网络的搭建。训练一个神经网络匹配二元函数y=x^{2}-0.5

步骤主要如下:

  • 导入相应的包
  • 定义添加层
  • 准备训练数据
  • 构建神经网络层
  • 定义损失函数和训练优化使损失函数最小化
  • 初始化变量,激活结构
  • 迭代训练

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]。

准备训练数据y=x^{2}-0.5+noise,噪声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]))

采用均方差定义损失函数:y=\frac{1}{n_{samples}}\sum_{i-1}^{n}(y_{i}-\hat{y_{i}})^{2}

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次就打印输出损失结果。


版权声明:本文为weixin_42729843原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。