Loading

【学习笔记】神经网络基础

神经网络方面的研究很早就已出现,今天“神经网络”已是一个相当大的、多学科交叉的学科领域。神经网络中最基本的成分是神经元模型。

上图中每个圆圈都是一个神经元,每条线表示神经元之间的连接。我们可以看到,上面的神经元被分成了多层,层与层之间的神经元有连接,而层内之间的神经元没有连接。

感知机

感知机Rosenblatt在1957年,于Cornell航空实验室时所发明的一种人工神经网络。

有n个输入数据,通过权重与各数据之间的计算和,比较激活函数结果,得出输出。很容易解决与、或、非问题。

可以看到,一个感知器有如下组成部分:

  • 输入权值,一个感知器可以有多个输入x1,x2,x3...xn,每个输入上有一个权值wi
  • 激活函数,感知器的激活函数有许多选择,以前用的是阶跃函数,,其中zz为权重数据积之和
  • 输出,

神经网络

定义:在机器学习和认知科学领域,人工神经网络(artificial neural network,缩写ANN),简称神经网络(:neural network,缩写NN)或类神经网络,是一种模仿生物神经网络的结构和功能的计算模型,用于对函数进行估计或近似。

神经网络的种类:

基础神经网络:单层感知器,线性神经网络,BP神经网络,Hopfield神经网络等
进阶神经网络:玻尔兹曼机,受限玻尔兹曼机,递归神经网络等
深度神经网络:深度置信网络,卷积神经网络,循环神经网络,LSTM网络等

神经网络的特点

  • 输入向量的维度和输入神经元的个数相同
  • 每个连接都有个权值
  • 同一层神经元之间没有连接
  • 由输入层,隐层,输出层组成
  • 第N层与第N-1层的所有神经元连接,也叫全连接

神经网络的组成

  • 结构(Architecture)例如,神经网络中的变量可以是神经元连接的权重
  • 激励函数(Activity Rule)大部分神经网络模型具有一个短时间尺度的动力学规则,来定义神经元如何根据其他神经元的活动来改变自己的激励值。
  • 学习规则(Learning Rule)学习规则指定了网络中的权重如何随着时间推进而调整。(反向传播算法)

浅层人工神经网络模型

SoftMax回归

MNIST中的每个图像都是零到九之间的手写数字。所以给定的图像只能有十个可能的东西。我们希望能够看到一个图像,并给出它是每个数字的概率。例如,我们的模型可能会看到一个九分之一的图片,80%的人肯定它是一个九,但是给它一个5%的几率是八分之一(因为顶级循环),并有一点概率所有其他,因为它不是100%确定。这是一个经典的情况,其中softmax回归是一种自然简单的模型。如果要将概率分配给几个不同的东西之一的对象,softmax是要做的事情,因为softmax给出了一个[0,1]之间的概率值加起来为1的列表。稍后,当我们训练更复杂型号,最后一步将是一层softmax。

那么我们通常说的激活函数有很多,我们这个使用softmax函数.softmax模型可以用来给不同的对象分配概率。即使在之后,我们训练更加精细的模型时,最后一步也需要用softmax来分配概率。这里的softmax可以看成是一个激励(activation)函数,把我们定义的线性函数的输出转换成我们想要的格式,也就是关于10个数字类的概率分布。因此,给定一张图片,它对于每一个数字的吻合度可以被softmax函数转换成为一个概率值。

softmax回归有两个步骤:首先我们将我们的输入的证据加在某些类中,然后将该证据转换成概率。每个输出的概率,对应着独热编码中具体的类别。

下面是softmax的公式

在神经网络中,整个过程如下:

也就是最后的softmax模型,用数学式子表示:

损失计算-交叉熵损失

我们前面学习过了一种计算误差损失,预测值与标准值差的平方和。不过在这里我们不能再使用这个方式,我们的输出值是概率并且还有标签。那么就需要一种更好的方法形容这个分类过程的好坏。这里就要用到交叉熵损失。

确定模型损失的一个非常常见的非常好的功能称为“交叉熵”。交叉熵来源于对信息理论中的信息压缩代码的思考,但是从赌博到机器学习在很多领域都是一个重要的思想。它定义为

SoftMax计算、交叉熵

tf.nn.softmax_cross_entropy_with_logits(labels=None, logits=None,name=None)

  • 计算logits和labels之间的交叉损失熵
  • labels:标签值(真实值)
  • logits:样本加权之后的值
  • return:返回损失值列表

准确性计算

equal_list = tf.equal(tf.argmax(y, 1), tf.argmax(y_label, 1))

accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))

Mnist数据集神经网络案例

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data


def full_connected():

    # 准备数据
    mnist = input_data.read_data_sets("./data/mnist/", one_hot=True)

    # 建立数据的占位符
    with tf.variable_scope("data"):
        x = tf.placeholder(tf.float32, [None, 28 * 28])
        y_true = tf.placeholder(tf.float32, [None, 10])

    # 建立全连接层的神经网络
    with tf.variable_scope("fc_model"):
        # 随机初始化权重和偏重
        weight = tf.Variable(tf.random_normal([28 * 28, 10], mean=0.0, stddev=1.0), name="w")
        bias = tf.Variable(tf.constant(0.0, shape=[10]))
        # 预测结果
        y_predict = tf.matmul(x, weight) + bias

    # 所有样本损失值的平均值
    with tf.variable_scope("soft_loss"):
        loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_predict))

    # 梯度下降
    with tf.variable_scope("optimizer"):
        train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

    # 计算准确率
    with tf.variable_scope("acc"):
        equal_list = tf.equal(tf.argmax(y_true, 1), tf.argmax(y_predict, 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文件
        fw = tf.summary.FileWriter("./temp/tf/summary/fc", graph=sess.graph)

        for i in range(3000):

            mnist_x, mnist_y = mnist.train.next_batch(100)

            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})
            fw.add_summary(summary, i)

            print("训练第%d步, 准确率为%f" % (i, sess.run(accuracy, feed_dict={x: mnist_x, y_true: mnist_y})))


if __name__ == '__main__':
    full_connected()

准确值变化:

损失变化:

流程:

  1. 准备数据
  2. 全连接计算结果
  3. 损失优化
  4. 模型评估(计算准确值)
posted @ 2019-04-06 18:54  coder-qi  阅读(1536)  评论(0编辑  收藏  举报