个人机器学习笔记之神经网络

吴恩达机器学习笔记(6)——神经网络

机器学习个人笔记,学习中水平有限,内容如有缺漏欢迎指正。

序言

事先上网搜了下,发现已经有不少用tensorflow甚至只用numpy实现神经网络的文章了,而且写的都很好,十分易懂。本着拿来主义的精神,这次就按照结合视频外加分析大佬的代码来写了。

神经网络是什么

神经网络是一组计算单元组成的网络,其中每个计算单元(模拟了生物界的神经)从输入通道获取一些信息,进行一些计算然后将结果传到输出通道,最后在神经网络的输出端获得总的计算结果。
神经网络
单个神经元的结构:
神经元
神经元做的计算通常是将输入的a1~an乘上对应的权重w1~wn(一般还要加一个a0、w0作为偏置项),然后求和,再将和输入一个被称为激活函数的函数,获得的结果作为下一层神经元的输入或直接作为神经网络的输出。这样的神经网络又被称为“前馈神经网络”,因为它的计算过程是从输入层逐层计算到输出层的。

代码

首先导入包

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

用来添加一层网络的函数

def add_layer(inputs, in_size, out_size, activation_function=None):
  # 添加层
  Weights = tf.Variable(tf.random_normal([in_size, out_size]))
  biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)
  Wx_plus_b = tf.matmul(inputs, Weights) + biases#wx+b,简明易懂
  if activation_function is None:#如果没有激活函数,神经元就直接返回wx+b
    outputs = Wx_plus_b
  else:
    outputs = activation_function(Wx_plus_b)
  return outputs

创建训练用的数据

x_data = np.linspace(-1,1,300)[:, np.newaxis]
noise = np.random.normal(0, 0.05, x_data.shape)
y_data = np.square(x_data) - 0.5 + noise     #y=x^2-0.5+噪声

为tensorflow定义占位符

xs = tf.placeholder(tf.float32, [None, 1])
ys = tf.placeholder(tf.float32, [None, 1])

添加一个隐藏层输出层

#添加隐藏层
l1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu)
# 添加输出层
prediction = add_layer(l1, 10, 1, activation_function=None)

定义损失值和训练步骤

#计算损失值,损失值定义为(y-预测值)^2的
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),
           reduction_indices=[1]))
#使用梯度下降定义训练步骤来最小化损失值
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

初始化tensorflow的计算图

init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)

绘图

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.scatter(x_data, y_data)
plt.ion()
plt.show()

训练1000次

for i in range(1000):
  sess.run(train_step, feed_dict={xs: x_data, ys: y_data})
  if i % 50 == 0:
    #每50步计算一次损失值并绘图
    try:
      ax.lines.remove(lines[0])
    except Exception:
      pass
    prediction_value = sess.run(prediction, feed_dict={xs: x_data})
    loss_value=sess.run(loss,feed_dict={xs: x_data, ys: y_data})
    # plot the prediction
    plt.title(loss_value)
    lines = ax.plot(x_data, prediction_value, 'r-', lw=5)
    plt.pause(0.1)
plt.pause(10)

完整代码就不放了,在下面的链接里可以找到。

运行结果

红色为拟合的曲线,蓝色为样本点
结果

公式部分

前馈神经网络公式,其中θ(1)11代表第一层第一个神经元输出作为隐藏层第一个神经元输入的权重,x0(图中未出现)代表偏置项,是个常数。
前向传播

引用

tensorflow建立神经网络
部分图片来源

其他笔记

猜你喜欢

转载自blog.csdn.net/ardepomy/article/details/88080806
今日推荐