欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

morvan——tensorflow第一个神经网络

程序员文章站 2022-07-06 22:22:14
...

学习目的:搭建一个神经网络,拟合二次曲线,并将结果可视化。

完整代码:

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
import numpy as np
import matplotlib.pyplot as plt

#构建添加一个神经层的函数
def add_layer(inputs,in_size,out_size,activtion_fuction=None):
    Weights=tf.Variable(tf.random_normal([in_size,out_size]))
    biases=tf.Variable(tf.zeros([1,out_size])+0.1)
    Wx_plus_b=tf.matmul(inputs,Weights)+biases
    if activtion_fuction is None:
        outputs=Wx_plus_b
    else:
        outputs=activtion_fuction(Wx_plus_b)
    return outputs

#构建所需数据
x_data=np.linspace(-1,1,300)[:,np.newaxis]
noise=np.random.normal(0,0.05,x_data.shape) .astype(np.float32)
y_data=np.square(x_data)-0.5+noise
#利用占位符定义所需的神经网络的输入
xs=tf.placeholder(tf.float32,[None,1])
ys=tf.placeholder(tf.float32,[None,1])


l1=add_layer(xs,1,10,activtion_fuction=tf.nn.relu)
#再利用add_layer()定义输出层prediction
prediction=add_layer(l1,10,1,activtion_fuction=None)

#计算预测值prediction和真实值ys的误差,差的平方求和再取平均
loss=tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction),reduction_indices=[1]))
#梯度优化法提升准确率,学习率=0.1
train_step=tf.train.GradientDescentOptimizer(0.1).minimize(loss)
#初始化变量
init=tf.global_variables_initializer()
#定义Session,并用Session来执行init初始化步骤
sess=tf.Session()
sess.run(init)

#可视化
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
ax.scatter(x_data,y_data)
plt.ion
# plt.show()

for i in range(1000):
    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}))
        try:
            ax.lines.remove(lines[0])
        except Exception:
            pass
        prediction_value=sess.run(prediction,feed_dict={xs:x_data})
        #plot the prediction
        lines=ax.plot(x_data,prediction_value,'r-',lw=5)#红色,宽度为5
        plt.pause(0.1)#暂停0.1s

plt.ioff()
plt.show()

1.导入模块、添加神经层

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
import numpy as np
import matplotlib.pyplot as plt

#构建添加一个神经层的函数
def add_layer(inputs,in_size,out_size,activtion_fuction=None):
    Weights=tf.Variable(tf.random_normal([in_size,out_size]))
    biases=tf.Variable(tf.zeros([1,out_size])+0.1)
    Wx_plus_b=tf.matmul(inputs,Weights)+biases
    if activtion_fuction is None:
        outputs=Wx_plus_b
    else:
        outputs=activtion_fuction(Wx_plus_b)
    return outputs

2.导入数据

x_data=np.linspace(-1,1,300)[:,np.newaxis]
noise=np.random.normal(0,0.05,x_data.shape) .astype(np.float32)
y_data=np.square(x_data)-0.5+noise
#利用占位符定义所需的神经网络的输入
xs=tf.placeholder(tf.float32,[None,1])
ys=tf.placeholder(tf.float32,[None,1])

3.搭建神经网络

神经网络层按顺序包括:输入层、隐藏层、输出层。本例的输入层只有一个属性,因此只有一个输入,对应地输出层也只有一个。我们假设有一层隐藏层,隐藏层的神经元有10个。
*使用变量时,初始化必不可少!
*tf中,只有session.run()才会执行我们定义的运算。

#利用之前的add_layer()函数定义隐藏层l1,并使用tf自带的激励函数tf.nn.relu。
l1=add_layer(xs,1,10,activtion_fuction=tf.nn.relu)
#再利用add_layer()定义输出层prediction
prediction=add_layer(l1,10,1,activtion_fuction=None)



#计算预测值prediction和真实值ys的误差,差的平方求和再取平均
loss=tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction),reduction_indices=[1]))
#梯度优化法提升准确率,学习率=0.1
train_step=tf.train.GradientDescentOptimizer(0.1).minimize(loss)
#初始化变量
init=tf.global_variables_initializer()
#定义Session,并用Session来执行init初始化步骤
sess=tf.Session()
sess.run(init)

4.可视化(静态)

4.可视化
#可视化
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
ax.scatter(x_data,y_data)
plt.show()

5.训练

这里,我们让机器学习1000次。机器学习的内容是train_step, 用 Session 来 run 每一次 training 的数据,逐步提升神经网络的预测准确性。 (注意:当运算要用到placeholder时,就需要feed_dict这个字典来指定输入。)

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}))

最后的结果如下:

morvan——tensorflow第一个神经网络

6.动态显示

将【4】【5】改成如下:

#可视化
fig=plt.figure()
ax=fig.add_subplot(1,1,1)
ax.scatter(x_data,y_data)
plt.ion
#plt.show()

for i in range(1000):
    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}))
        try:
            ax.lines.remove(lines[0])
        except Exception:
            pass
        prediction_value=sess.run(prediction,feed_dict={xs:x_data})
        #plot the prediction
        lines=ax.plot(x_data,prediction_value,'r-',lw=5)#红色,宽度为5
        plt.pause(0.1)#暂停0.1s

图形动态显示成功,拟合完成后plot会自动关闭。
morvan——tensorflow第一个神经网络
这里有几个pycharm运行tip:
(1) 把之前的plt.show()注释掉,改为plt.ion()用于连续显示;
(2) 当不显示红线时:file-settings-tools-python scientific-show plots in tool window的勾去掉;
(3) 如果仍然无法显示,可试着增加暂停时间,例如0.1换成0.5;(我没这个问题)
(4) 如果想要保存图片,可在代码最后加上(不在循环里)。

plt.ioff()
plt.show()

7.加速神经网络训练&优化器的选择

BGD(Batch Gradient Descent)
就是我们平时说的梯度现将也叫做最速梯度下降,也叫做批量梯度下降。
SGD(Stochastic Gradient Descent)
随机梯度下降法。与BGD相比,随机就是说我每次随机采用样本中的一个例子来近似所有的样本,用这一个随机采用的例子来计算梯度并用这个梯度来更新参数。即SGD每次迭代仅对一个随机样本计算梯度,直至收敛
Mini-batch
刚说的SGD其实是一种特殊的Mini-batch,SGD的mini batch size=1,有点儿太小了不太准,那就采用更多的样本来近似(例如30个,50个)直至收敛。一般mini batch size=2的n次方,64/128/256….

优化器optimizer
除了最基本的线性GradientDescentOptimizer以外,还有Adam、Momentum、RMSProp等