1.11-机器学习tensorflow框架学习-简单的神经网络设计解决拟合问题

1.添加和定义一个神经层

import tensorflow as tf
def add_layer(inputs,in_size,out_size,activation_function=None):
    Weights = tf.Variable(tf.random_normal([in_size,out_size]))#定义一个大小为in_size和out_size的一个权重矩阵
    biases = tf.Variable(tf.zeros([1,out_size])+0.1) #定义一个1行,out_size列的偏置。一般biases不推荐为0
    Wx_plus_b = tf.matmul(inputs,Weights)+biases
    if activation_function is None:
        output = Wx_plus_b
    else:
        output = activation_function(Wx_plus_b)
    return output

2.建立神经网络

import numpy as np
x_data = np.linspace(-1,1,300,dtype=np.float32)[:,np.newaxis] #就是换成300行一列,先生成一行,再用用reshape也是一样的
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])#第一列,这里其实不声明这个也可以直接用x_data,但是声明了这个训练数据就是可以改的了
ys = tf.placeholder(tf.float32,[None,1])
#现在假设分成三层:
#第一层输入层因为特征是1维,所以只有一个神经元,这里因为输入只有一个,输出也就一个所以假装不存在了
#第二层隐藏层,假设有十个神经元
#第三层输出层,这里只有一个输出,因此也只有一个神经元
l1 = add_layer(xs,1,10,activation_function=tf.nn.relu) #隐藏层
prediction = add_layer(l1,10,1,activation_function=None) #输出层
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction),reduction_indices=[1]))#定义损失函数,求平方差
train = tf.train.GradientDescentOptimizer(0.1).minimize(loss)#指定优化器和学习效率,作用是要减小误差
init = tf.initialize_all_variables()
with tf.Session() as sess:
    sess.run(init)
    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}))
#print(y_data)
0.24003321
0.006185482
0.0055499882
0.0050785486
0.0047183624
0.00444805
0.0042444696
0.0040601515
0.0038862072
0.0037547243
0.0036365807
0.003522428
0.003419759
0.0033349807
0.0032427253
0.0031756372
0.00311379
0.0030579
0.0030223182
0.002959701

3.结果可视化

这里jupyter当中图片无法动起来,但是可以通过加一个%matplotlib打开一个额外的窗口

%matplotlib
import matplotlib.pyplot as plt
fig = plt.figure() #生成一个图片框
ax = fig.add_subplot(1,1,1)
ax.scatter(x_data,y_data)
plt.ion()#interactive on 打开动态模式,不然画图的时候画完一次就阻塞了
plt.show()
with tf.Session() as sess:
    sess.run(init)
    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}))
            try:
                ax.lines.remove(lines[0])
            except:
                pass
            prediction_value = sess.run(prediction,feed_dict={xs:x_data})
            lines = ax.plot(x_data,prediction_value,'r-',lw=5)
            plt.pause(0.1)