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()# 输出图片