TensorFlow之如何定义一个神经层、建造一个神经网络并且训练它

一、如何定义一个神经网络

来源

 代码

其中,inputs是前一层神经元激励后输出的值,in_size和out_size为前一层和后一层神经元个数,activation_function是激活函数,Weight是权重,维度为in_size×out_size(用随机数比较好),bases是偏置,Wx_plus_b为inputs和权重相乘再加偏置。

如果激励函数为空,则outputs(输出)保持不变,如果激励函数不为空,则把激励Wx_plus_b送入激励函数激励,然后赋给输出。


二、如何建造一个神经网络并且训练它

来源

相关代码:

#注明:该代码用来训练一个神经网络,网络拟合y = x^2-0.5+noise,
#该神经网络的结构是输入层为一个神经元,隐藏层为十个神经元,输出层
#为一个神经元

import tensorflow as tf  #用来构造神经网络
import numpy as np #用来构造数据结构和处理数据模块


#定义一个层
def add_layer(inputs, in_size, out_size, activation_function=None):
    #定义一个层,其中inputs为输入,in_size为上一层神经元数,out_size为该层神经元数
    #activation_function为激励函数
    Weights = tf.Variable(tf.random_normal([in_size, out_size]))
    #初始权重随机生成比较好,in_size,out_size为该权重维度
    biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)
    #偏置
    Wx_plus_b = tf.matmul(inputs, Weights) + biases
    #matmul为矩阵里的函数相乘
    if activation_function is None:
        outputs = Wx_plus_b#如果激活函数为空,则不激活,保持数据
    else:
        outputs = activation_function(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,0.05)之间,结构为x_date一样
y_data = np.square(x_data) - 0.5 + noise
#y的结构


#定义placeholder用来输入数据到神经网络,其中1表只有一个特征,也就是维度为一维数据
xs = tf.placeholder(tf.float32, [None, 1])
ys = tf.placeholder(tf.float32, [None, 1])
# add hidden layer
l1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu)
# add output layer
prediction = add_layer(l1, 10, 1, activation_function=None)

loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),
                     reduction_indices=[1]))
#代价函数,reduce_mean为求均值,reduce_sum为求和,reduction_indices为数据处理的维度
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
#将代价函数传到梯度下降,学习速率为0.1,这里包含权重的训练,会更新权重

# important step
# tf.initialize_all_variables() no long valid from
# 2017-03-02 if using tensorflow >= 0.12
#变量初始化
if int((tf.__version__).split('.')[1]) < 12:
    init = tf.initialize_all_variables()
else:
    init = tf.global_variables_initializer()
sess = tf.Session()#打开TensorFlow
sess.run(init)#执行变量初始化

for i in range(1000): #梯度下降迭代一千次
    # training
    sess.run(train_step, feed_dict={xs: x_data, ys: y_data})
    #执行梯度下降算法,并且将样本喂给损失函数
    if i % 50 == 0:
      #每50次迭代输出代价函数的值
        print(sess.run(loss, feed_dict={xs: x_data, ys: y_data}))

训练结果:

0.34523863
0.022616612
0.010389889
0.007847268
0.006674858
0.005891051
0.005252474
0.004683779
0.0042519947
0.0039448515
0.003724607
0.003576358
0.0034636236
0.0033923164
0.0033518441
0.0033253375
0.003302625
0.0032794673
0.0032590607
0.0032453125

猜你喜欢

转载自blog.csdn.net/weixin_40849273/article/details/81142654
今日推荐