DL-1 用一元二次方程 y=x^2+b 构建神经网络

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






猜你喜欢

转载自blog.csdn.net/weixin_41010198/article/details/80261037
今日推荐