Author:吾爱北方的母老虎
原创链接:https://blog.csdn.net/weixin_41010198/article/details/80261037
TensorFlow的运行方式分为四步
- 加载数据及定义超参数
- 构建网络
- 训练模型
- 评估模型和进行预测
下面以一个一元二次方程为例构建一个神经网络模型
y = ax**2+b
import tensorflow as tf import numpy as np import matplotlib.pyplot as plt
1.生成及加载数据
# 构建满足一元二次方程的函数 # 为了使点更密集一些,我们构建了300个点,分布在-1到1区间,直接采用np生成等差数列的方法,并将结果为300个点的 # 一维数组,转换为300x1的二维数组 x_data = np.linspace(-1,1,300)[:,np.newaxis] print(x_data[0:5]) print(np.shape(x_data)) # 我自己定义一个行的数据 # ax = range(300) x_data[0:5,:] # 取出的是前5行,和所有的列的数据 # 没有实现数据绘制 plt.scatter(ax,x_data) # 就是单个的点,没有必要进行可视化了,可以利用索引的位置作为其的横坐标 plt.show()
n = 1024 x = np.random.normal(0,1,n) print(x) y = np.random.normal(0,1,n) plt.scatter(x,y,color="r") plt.show()
# 给数据中加入一些噪声点 加入噪声点到值的范围是0~0.05 拟合成均值为0,方差为0.05的正态分布 print(x_data.shape) noise = np.random.normal(0,0.05,x_data.shape) print(noise) # 打印出来的数很小,是以科学计数法的形式进行打印的
y_data = np.square(x_data) - 0.5 + noise # y = x^2-0.5+噪声
tf.placeholder(dtype, shape=None, name=None)
此函数可以理解为形参,用于定义过程,在执行的时候再赋具体的值
参数:
dtype:数据类型。常用的是tf.float32,tf.float64等数值类型 shape:数据形状。默认是None,就是一维值,也可以是多维,比如[2,3], [None, 3]表示列是3,行不定 name:名称。
2.构建网络模型
# 定义的网络模型有一个隐藏层和一个输出层 其中定义了四个参数: # 分别是:输入数据、输入数据的维度、输出数据的维度、激活函数 def add_layer(inputs,in_size,out_size,activation_function=None): # 构建权重 :in_size x out_size 大小的举证 weights = tf.Variable(tf.random_normal([in_size,out_size])) # 构建偏置矩阵 bias = tf.Variable(tf.zeros([1,out_size]) + 0.1) # 矩阵相乘 Wx_plus_b = tf.matmul(inputs,weights) + bias if activation_function is None: outputs = Wx_plus_b else: outputs = activation_function(Wx_plus_b) return outputs # 得到输出数据 # 构建隐藏层,假设隐藏层有20个神经元 h1 = add_layer(xs,1,20,activation_function=tf.nn.relu) # 构建输出层,假设输出层和输入层一样,有1个神经元 prediction = add_layer(h1,20,1,activation_function=None)
# 计算预测值和真实值之间的误差 loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction), reduction_indices=[1])) train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss) # 梯度下降,求损失的最小值 # 梯度下降更新参数,然后进训练1000次后,看最后的损失会下降到多少
3.训练模型
# 让TensorFlow训练1000次,每50次输出训练的损失值 init = tf.global_variables_initializer() # 初始化所有的变量 sess = tf.Session() sess.run(init) import time fig = plt.figure()# 生成图片框 ax = fig.add_subplot(1,1,1)# 图片框分割成一块,编号为111 init_time=time.time() loss_list=[] for i in range(10000): sess.run(train_step,feed_dict={xs:x_data,ys:y_data}) if i%500 == 0: # 没隔50次打印一次损失值 print(sess.run(loss,feed_dict={xs:x_data,ys:y_data})) loss_list.append(loss) print(type(loss_list)) print(loss_list) loss_list=np.array(loss_list) print(type(loss_list)) # 没有画出来 ax.plot(np.array(range(20)), loss_list, 'r-', lw=5) print("training time is: ",time.time()-init_time,"s")
# 之后补充损失函数的可视化
#=== plot真是数据 fig = plt.figure()# 生成图片框 ax = fig.add_subplot(1,1,1)# 图片框分割成一块,编号为111 ax.scatter(x_data, y_data)# 以点的形式显示出真实数据 #plt.ion()# 连续的打印 plt.title("函数 y=x^2+b的图像") plt.show()# 输出图片