最近看了莫烦大神的教程,看到了搭建自己的神经网络,莫烦大神的视频还是很好的就是不太适合纯新手,这里我就把大神的代码拿出来分析一下好了

        首先,我们应该先建立一个数据集,最后让我们自己神经网络去学习,绘制一条和数据集差不多的函数,我们先来绘制数据点图

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

x_data = np.linspace(-1,1,300)[:,None]
#生成原始X的数据,使用np.linspace()函数并将生成的数变成列的结构
#np.linspace(start,stop,num) 就是从-1到1之间生成300个数
#np.newaxis=none [:,None]是为多维数组增加一个轴 例:array([0,1])[:,None]输出:array([[0],
#                                                                                 [1])

noise = np.random.normal(0,0.05, x_data.shape)
#加入噪点
y_data = np.square(x_data)-0.05 + noise
#设定y的值

fig = plt.figure()
#调用画布

ax = fig.add_subplot(1,1,1)
#将画布分割,这里是将分割成一行一列且在第一块,也就是使用整个画布
#若是fig.add_subplot(2,2,4)就是分割成两行两列,在第4块

ax.scatter(x_data, y_data)
#将原始数据传入图中
plt.show()

上面的代码运行后会得出这样的图来,可能你的和我的会不一样,没问题的,因为这都是随机生成的数字,但是形状是差不多的

这是我的图

dqn 莫烦python 莫烦python课程_机器学习

接下来就要添加我们的神经层了,添入神经层后的整体代码如下:

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

"""
先增加隐藏层
参数:
inputs:输入的数据 in_size:输入数据的格式维度、out_size:输出数据的维度、actviation:激活函数,初始为零
"""
def add_lay(inputs, in_size, out_size, actviation_function = None):

    Weights = tf.Variable(tf.random_normal([in_size, out_size]))
    # 权重用tf.random_norma()产生一个服从正态分布的随机矩阵,in_size行out_size列
    biases = tf.Variable(tf.zeros([1,out_size])+0.1)
    # 偏重,设置成1行out_size列的一个矩阵并加0.1,因为这个不能等于零
    # tf.zeros()函数是产生一个全是零的矩阵
    Wx_plus_b = tf.matmul(inputs, Weights)+ biases

    if actviation_function is None:
        output = Wx_plus_b

    else:
        output = actviation_function(Wx_plus_b)
    return output

x_data = np.linspace(-1,1,300)[:,None]
#生成原始X的数据,使用np.linspace()函数并将生成的数变成列的结构
#np.linspace(start,stop,num) 就是从-1到1之间生成300个数
#np.newaxis=none [:,None]是为多维数组增加一个轴 例:array([0,1])[:,None]输出:array([[0],
#                                                                                   [1])
noise = np.random.normal(0,0.05, x_data.shape)
#加入噪点
y_data = np.square(x_data)-0.05 + noise
#设定y的值

xs = tf.placeholder(tf.float32,[None,1])
ys = tf.placeholder(tf.float32,[None,1])
l1 = add_lay(xs,1,10,actviation_function=tf.nn.relu)
#传入x_data,将输入值输入,然后用tf.nn.relu这个激活函数进行训练
prediction = add_lay(l1,10,1,actviation_function=None)
#预测函数,调用add_lay,将上一步的结果输入到函数中,不调用激活函数,得出刚才的预测值

loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction), reduction_indices= [1]))
#计算损失使用均方误差
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
#训练,使用梯度下降,学习效率为0.1,最小化loss
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
#这里是将变量初始化

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.scatter(x_data,y_data)
plt.ion()
#使matplotlib的显示模式转换为交互(interactive)模式。即使在脚本中遇到plt.show(),代码还是会继续执行
plt.show()

for i in range(1000):
    sess.run(train_step,feed_dict={xs:x_data, ys:y_data})
    #运行train_step,并且将x_data,y_data的值传入进去
    #feed_dict()作用就是给placeholder传值,将x_data的值传给xs,y_data传给ys
    if i %50==0:
        #没训练50次,绘制一次
        try:
            ax.lines.remove(lines[0])
        except Exception:
            pass
        #上面这一段是在程序开始之前先绘制一次,为了避免报错,将错误强制pass
        prediction_value = sess.run(prediction, feed_dict={xs:x_data})
        #进行预测,并将x_data的值传入
        lines = ax.plot(x_data,prediction_value,'r',lw=5)
        #绘制曲线,数据是x_data,和y的预测值,颜色是红色,线宽=5
        plt.pause(0.1)
        #暂停0.1秒

这里做一下讲解,我刚开始对于这个神经网络的运行方式很是纳闷,他究竟是怎么进行运行的,于是,我就拆分下来,一步一步的进行运行,发现,如果train_step如果不运行的话,prediction这个预测值就是最初的值,不会进行更新

于是,我去查了下GradientDescentOptimizer这个函数,发现他返回的是一个操作,对损失函数中的变量的值进行修改

默认修改var_list=[w,b],梯度下降就是找函数的斜率的相反方向走的,修改w和b两个值,只有修改w才会有反应,w在函数中代表着斜率