morvan——tensorflow第一个神经网络
学习目的:搭建一个神经网络,拟合二次曲线,并将结果可视化。
完整代码:
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}))
最后的结果如下:
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会自动关闭。
这里有几个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等
下一篇: 基于UDP的C/S多播回射服务器