机器学习个人笔记,学习中水平有限,内容如有缺漏欢迎指正。
事先上网搜了下,发现已经有不少用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建立神经网络
部分图片来源