1. 神经网络基础
1.1. 感知机
-
有n个输入数据, 通过权重与各数据之间的计算和,
比较激活函数结果
, 得出输出 -
应用:很容易解决与、或、非问题
-
感知机解决的是分类问题
-
效果演示
- 链接:http://playground.tensorflow.org/#activation=sigmoid®ularization=L2&batchSize=10&dataset=circle®Dataset=reg-plane&learningRate=0.03®ularizationRate=0&noise=0&networkShape=3&seed=0.84062&showTestData=false&discretize=false&percTrainData=50&x=true&y=true&xTimesY=false&xSquared=false&ySquared=false&cosX=false&sinX=false&cosY=false&sinY=false&collectStats=false&problem=classification&initZero=false&showTestData_hide=true&learningRate_hide=true®ularizationRate_hide=true&percTrainData_hide=true&numHiddenLayers_hide=true&discretize_hide=true&activation_hide=true&problem_hide=true&noise_hide=true®ularization_hide=true&dataset_hide=true&batchSize_hide=true&playButton_hide=false
1.2 感知机与逻辑回归的联系与区别
- 激活函数、结果分析
2. 人工神经网络(ANN)
2.1. 定义
- 在机器学习和认知科学领域,人工神经网络(artificial neural network,缩写ANN),简称神经网络(:neural network,缩写NN)或类神经网络,是一
种模仿生物神经网络的结构和功能的计算模型,用于对函数进行估计或近似。
2.2. 神经网络的种类
- 基础神经网络:单层感知器,线性神经网络, BP神经网络, HopField神经网络等
- 进阶神经网络:玻尔兹曼机,受限玻尔兹曼机, 递归神经网络等
- 深度神经网络: 深度置信网络, 卷积神经网络, 循环神经网络, LSTM网络等
2.3. 神经网络的特点
- 输入向量的维度和输入神经元的个数相同
- 每个连接都有个权值
- 同一层神经元之间没有连接
- 由输入层,隐层,输出层组成
- 第N层与第N-1层的所有神经元连接,也叫全连接
2.4. 神经网络的组成
- 结构(Architecture)例如,神经网络中的变量可以是神经元连接的权重
- 激励函数(Activity Rule)大部分神经网络模型具有一个短时间尺度的动力学规则,来定义神经元如何根据其他神经元的活动来改变自己的激励值。
- 学习规则(Learning Rule)学习规则指定了网络中的权重如何随着时间推进而调整。
(反向传播算法)
3. Mnist数据集浅层神经网络分析
3.0. 内容描述(图)
3.1. SoftMax回归(图)
3.2. 交叉熵损失(图)
3.3. 线性回归,逻辑回归,神经网络算法的对比
3.3.1. 计算损失策略和优化
算法 策略 优化
线性回归 均方误差 梯度下降
逻辑回归 对数似然损失 梯度下降(二分类)
神经网络 交叉熵损失 梯度下降(反向传播算法)
3.3.2. 基本概念
- 正向传播:输出经过一层层的计算得出输出
- 反向传播:从损失计算开始,梯度下降更新权重
- sigmoid:逻辑回归, 某一个类别的概率, 二分类
- softmax:神经网络,有多少类别,输出就是多少个
3.4. 其他方法API介绍
3.4.1. 全连接-从输入直接到输出
- 特征加权:
- tf.matmul(a, b,name=None)+bias
- return:全连接结果,供交叉损失运算
- 不需要激活函数(因为是最后的输出)
3.4.2. SoftMax计算、交叉熵
- tf.nn.softmax_cross_entropy_with_logits(labels=None, logits=None,name=None)计算logits和labels之间的交叉损失熵
- labels:标签值(真实值)
- logits:样本加权之后的值
- return:返回损失值列表
3.4.3. 损失值列表平均值计算
- tf.reduce_mean(input_tensor) 计算张量的尺寸的元素平均值
3.4.4. 损失下降API
- tf.train.GradientDescentOptimizer(learning_rate) 梯度下降优化
- learning_rate:学习率,一般为
- minimize(loss):最小化损失
- return:梯度下降op
3.5. 准确性计算(图)
- equal_list = tf.equal(tf.argmax(y, 1), tf.argmax(y_label, 1))
- accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))
4. Mnist数字图片识别
4.1. 训练模型
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
def full_connected():
# 获取真实的数据
mnist = input_data.read_data_sets("./mnist_data/input/", one_hot=True)
# 1. 建立数据的占位符 x[None, 784] y_true[None, 10]
with tf.variable_scope("data"):
x = tf.placeholder(tf.float32, [None, 784])
y_true = tf.placeholder(tf.int32, [None, 10])
# 2. 建立一个全连接层的神经网络, 权重w[784, 10], 偏置bias [10]
with tf.variable_scope("fc_model"):
# 随机初始化权重和偏置
weight = tf.Variable(tf.random_normal([784, 10], mean=0.0, stddev=1.0), name='w')
bias = tf.Variable(tf.constant(0.0, shape=[10]))
# 预测None个样本的输出结果matrix [None, 784] * [784, 10] + [10] = [None, 10]
y_predict = tf.matmul(x, weight) + bias
# 3. 求出所有样本的损失,然后求平均值
with tf.variable_scope("soft_cross"):
# 求平均交叉熵损失
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_predict))
# 4. 梯度下降,求出损失
with tf.variable_scope("optimizer"):
train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
# 5. 计算准确率
with tf.variable_scope("acc"):
equal_list = tf.equal(tf.argmax(y_true, 1), tf.argmax(y_predict, 1))
# equal_list None个样本[1,0,1,0,1,1........]
accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))
# 收集变量,单个数字值搜集
tf.summary.scalar("losses", loss)
tf.summary.scalar("acc", accuracy)
# 高纬度变量收集
tf.summary.histogram("weights", weight)
tf.summary.histogram("biases", bias)
# 定义一个初始化变量的op
init_op = tf.global_variables_initializer()
# 定义合并变量的op
merged = tf.summary.merge_all()
# 开启会话,开始训练
with tf.Session() as sess:
# 初始化变量
sess.run(init_op)
# 建立events文件, 然后写入
file_writer = tf.summary.FileWriter("./tmp/summary/test/", graph=sess.graph)
# 迭代步数训练, 更新参数预测
for i in range(2000):
# 获得真实存在的特征值和目标值
mnist_x, mnist_y = mnist.train.next_batch(50)
# 运行train_op训练
sess.run(train_op, feed_dict={x: mnist_x, y_true: mnist_y})
# 写入每一步训练的值
summary = sess.run(merged, feed_dict={x: mnist_x, y_true: mnist_y})
file_writer.add_summary(summary, i)
# 注意巡行的时候,要始终跟上feed_dict
print("训练第{}步, 准确率为:{}".format(i, sess.run(accuracy, feed_dict={x: mnist_x, y_true: mnist_y})))
if __name__ == "__main__":
full_connected()
4.2. 观测变量(图)
4.3. 预测结果
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
FLAGS = tf.app.flags.FLAGS
tf.app.flags.DEFINE_integer("is_train", 1, "指定程序是预测还是训练")
def full_connected():
# 获取真实的数据
mnist = input_data.read_data_sets("./mnist_data/input/", one_hot=True)
# 1. 建立数据的占位符 x[None, 784] y_true[None, 10]
with tf.variable_scope("data"):
x = tf.placeholder(tf.float32, [None, 784])
y_true = tf.placeholder(tf.int32, [None, 10])
# 2. 建立一个全连接层的神经网络, 权重w[784, 10], 偏置bias [10]
with tf.variable_scope("fc_model"):
# 随机初始化权重和偏置
weight = tf.Variable(tf.random_normal([784, 10], mean=0.0, stddev=1.0), name='w')
bias = tf.Variable(tf.constant(0.0, shape=[10]))
# 预测None个样本的输出结果matrix [None, 784] * [784, 10] + [10] = [None, 10]
y_predict = tf.matmul(x, weight) + bias
# 3. 求出所有样本的损失,然后求平均值
with tf.variable_scope("soft_cross"):
# 求平均交叉熵损失
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_predict))
# 4. 梯度下降,求出损失
with tf.variable_scope("optimizer"):
train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
# 5. 计算准确率
with tf.variable_scope("acc"):
equal_list = tf.equal(tf.argmax(y_true, 1), tf.argmax(y_predict, 1))
# equal_list None个样本[1,0,1,0,1,1........]
accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))
# 收集变量,单个数字值搜集
tf.summary.scalar("losses", loss)
tf.summary.scalar("acc", accuracy)
# 高纬度变量收集
tf.summary.histogram("weights", weight)
tf.summary.histogram("biases", bias)
# 定义一个初始化变量的op
init_op = tf.global_variables_initializer()
# 定义合并变量的op
merged = tf.summary.merge_all()
# 创建一个saver
saver = tf.train.Saver()
# 开启会话,开始训练
with tf.Session() as sess:
# 初始化变量
sess.run(init_op)
# 建立events文件, 然后写入
file_writer = tf.summary.FileWriter("./tmp/summary/test/", graph=sess.graph)
if FLAGS.is_train == 1:
# 迭代步数训练, 更新参数预测
for i in range(2000):
# 获得真实存在的特征值和目标值
mnist_x, mnist_y = mnist.train.next_batch(50)
# 运行train_op训练
sess.run(train_op, feed_dict={x: mnist_x, y_true: mnist_y})
# 写入每一步训练的值
summary = sess.run(merged, feed_dict={x: mnist_x, y_true: mnist_y})
file_writer.add_summary(summary, i)
# 注意巡行的时候,要始终跟上feed_dict
print("训练第{}步, 准确率为:{}".format(i, sess.run(accuracy, feed_dict={x: mnist_x, y_true: mnist_y})))
# 保存模型
saver.save(sess, "./tmp/ckpt/fc_model")
else:
# 加载模型
saver.restore(sess, "./tmp/ckpt/fc_model")
# 如果是0,做出预测
for i in range(100):
# 每次测试一张图片[0,0,0,0,1,0,0,0,0,0]
x_test, y_test = mnist.test.next_batch(1)
print("第{}张图片,手写数字目标是:{}, 预测结果是:{}".format(
i,
tf.argmax(y_test, 1).eval(),
tf.argmax(sess.run(y_predict, feed_dict={x: x_test, y_true: y_test}), 1).eval()
))
if __name__ == "__main__":
full_connected()