tensorflow学习2-线性拟合和神经网路拟合
线性拟合的思路:
线性拟合代码:
1 import tensorflow as tf 2 import numpy as np 3 import matplotlib.pyplot as plt 4 #%%图形绘制 5 def data_show(x,y,w,b): 6 plt.figure() 7 plt.scatter(x,y,marker='.') 8 plt.scatter(x,(w*x+b),marker='.') 9 plt.show() 10 #%%生成数据 11 x_data=np.random.rand(100).astype(np.float32) 12 y_data=0.1*x_data + 0.3 13 #%%创建结构 14 Weights=tf.Variable(tf.random_uniform([1],-1.0,1.0))#平均分布的随机数 15 biases=tf.Variable(tf.zeros([1])) 16 y=Weights*x_data+biases 17 loss=tf.reduce_mean(tf.square(y-y_data)) #损失函数,reduce_mean:计算一个张量的各维度的元素的均值 18 optimizer=tf.train.GradientDescentOptimizer(0.5)#优化器 学习率选择#.GradientDescentOptimizer()实现梯度下降算法的优化器。 19 train=optimizer.minimize(loss)#优化器优化目标选择,使loss 最小 20 init=tf.global_variables_initializer() #初始化全变量节点 21 #%% 22 ###训练部分 23 with tf.Session() as sess: 24 sess.run(init) 25 for i in range(200): 26 sess.run(train) 27 if i %20==0: 28 print(i,sess.run(Weights),sess.run(biases)) 29 data_show(x_data,y_data,sess.run(Weights),sess.run(biases)) 30 #%% 31 writer=tf.summary.FileWriter("/path/to/logs",tf.get_default_graph()) 32 writer.close()
神经网络拟合二次函数(带噪声)
代码:
import tensorflow as tf import numpy as np #%% def add_layer(input,in_size,out_size,activation_function=None): Weights=tf.Variable(tf.random_normal([in_size,out_size])) #tf.random.uniform()均匀分布,tf.random.normal() 正太分布 biases=tf.Variable(tf.zeros([1,out_size])+0.1)#biases 的维度是1行,Weights的列 #输入是1*input,Weights是input*output,output是1*output,所以biases是1*output wx_plus_b=tf.matmul(input,Weights)+biases if activation_function==None: output=wx_plus_b else:#加入激活函数 output= activation_function(wx_plus_b) return output#返回output #%% x_data= np.linspace(-1,1,300)[:,np.newaxis] #np.linspace(),-1到1进行300等分的数组得到1*300,再进行变换为300*1 noise=np.random.normal(0,0.05,x_data.shape) y_data=np.square(x_data)-0.5+noise #%% #占位符,feed_dict={}进行赋值 xs=tf.placeholder(tf.float32,[None,1]) ys=tf.placeholder(tf.float32,[None,1]) ll=add_layer(xs,1,10,activation_function=tf.nn.relu)#激活函数是relu prediction=add_layer(ll,10,1,activation_function=None) reduce_sum=tf.reduce_sum(tf.square(ys-prediction),reduction_indices=1) loss=tf.reduce_mean(reduce_sum) #tf.reduce_sum:计算一个张量的各个维度的元素之和。 #tf.reduce_mean():取平均值。 train_step=tf.train.GradientDescentOptimizer(0.1).minimize(loss) init=tf.global_variables_initializer() with tf.Session() as sess: sess.run(init) 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})) if i==999: print(sess.run(tf.square(ys - prediction),feed_dict={xs:x_data,ys:y_data})) #输出的是300行1列 [300,1] #[[ 4.99251783e-02] #[ 1.65489316e-02] # .......... #[ 3.05732153e-02]] #经过,tf.reduce_sum(,reduction_indices=1)后为了: if i==999: print(sess.run(tf.reduce_sum(tf.square(ys-prediction),reduction_indices=1), feed_dict={xs: x_data, ys: y_data})) #输出的是1行300列[300]------>[1,2,3,.....]就叫做[300],共计300个元素 #[ 3.73238046e-03 ..... 1.45917088e-02]
补充知识 :
1.tf.random.uniform() 符合均匀分布--------tf.random.normal() 符合正太分布
2.np.newaxis补充知识 :
import numpy as np
a=np.array([1,2,3,4,5])#creat a array
b=a[:,np.newaxis]
#a---->[1,2,3,4,5]
#b---->[[1],[2],[3],[4],[5]] 5行1列 (5,1)
c=a[np.newaxis,:]
#c---->[[1,2,3,4,5]] 1行5列 (1,5)
3.特别注意:reduction_indices=[1]可知是指定操作坐标轴的函数,即把[300,1]按行求和后拼接为新的数组,也就是[300]的尺寸