第5例
添加神经层的函数
import tensorflow as tf
import numpy as np
def add_layer(inputs, in_size , out_size , activation_function = 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 activation_function is None :
outputs = Wx_plus_b
else:
outputs = activation_function(Wx_plus_b)
return (outputs)
构建数据,线性排列,从-1到1,300个单位;[:, np.newaxis]用来加一个维度,有300行
x_data = np.linspace(-1 , 1 ,300)[:, np.newaxis]
#加入噪点,正态分布,均值是0,标准差是0.05,格式是x_data.shape
noise = np.random.normal(0 , 0.05 , x_data.shape)
#y_data是x_data的二次方
y_data = np.square(x_data) - 0.5 + noise
用于把值输入train_step , None表示无论给多少给例子都可以
tf.placeholder(dtype, shape=None, name=None)
此函数可以理解为形参,用于定义过程,在执行的时候再赋具体的值
dtype:数据类型。常用的是tf.float32,tf.float64等数值类型
shape:数据形状。默认是None,就是一维值,也可以是多维,比如[2,3], [None, 3]表示列是3,行不定
name:名称。
xs = tf.placeholder(tf.float32,[None , 1])
ys = tf.placeholder(tf.float32,[None , 1])
构建layer,输入层只有1个神经元x,输出层也只有1个y,假设隐藏层有10个神经元
l1 = add_layer(xs , 1 , 10 , activation_function = tf.nn.relu)
prediction = add_layer(l1 , 10 , 1 , activation_function = None)
#reduction_indices = [1]表示行求和,前面数据有300行
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction) , reduction_indices = [1]))
0.1指的是学习效率,通常小于1
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
初始化
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
执行训练,并输出loss
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}))
输出结果:
0.004406632
0.004337411
0.0042773443
0.0042187506
0.0041610654
0.0041027893
0.00404956
0.0040028533
0.0039618597
0.0039221407
0.0038872377
0.0038500058
0.003817556
0.0037809452
0.0037482325
0.0037158246
0.0036712526
0.0036255915
0.0035736489
0.0035149178
在第5例的基础上实现图像显示
在导入模块中,加上matplotlib.pyplot
Jupyter不能显示红线,一定要加上 %matplotlib 或 %matplotlib qt 或 %matplotlib qt5
其中%matplotlib,在最上面的页面打开,会导致程序卡住;
而另外两个不会卡住,但是是在后台打开
import tensorflow as tf
import numpy as np
%matplotlib qt
import matplotlib.pyplot as plt
在初始化后面,可以显示真实数据
fig = plt.figure()
ax = fig.add_subplot( 1 , 1 , 1 )
ax.scatter( x_data , y_data )
plt.ion()
plt.show()
scatter是用点表示数据(后面ax.plot()使用线)
加上plt.ion(),使得程序不会在执行pot.show()后,就停止
进行训练,输出loss。改写后显示拟合的曲线
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}))
######### try可以先尝试移除曲线,若是不存在,则跳过
try :
ax.lines.remove( lines[0])
except Exception:
pass
######## 此处prediction中涉及了 l1中的xs,故要加上feed_dict
prediction_value = sess.run( prediction , feed_dict = { xs : x_data })
lines = ax.plot( x_data , prediction_value , 'r-' , lw = 5 )
plt.pause(0.1)