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)