神经网络—Tensorflow

神经网络


一、神经网络基础


1、感知机

有n个输入数据,通过权重与各数据之间的计算和,比较激活函数结果,得出输出

应用:很容易解决与、或问题

2、人工神经网络

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

二、人工神经网络(ANN)

  1. 神经网络的发展

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

    ​ 基础神经网络:单层感知器,线性神经网络,BP神经网络,Hopfield神经网络等

    ​ 进阶神经网络:或尔兹曼机,受限玻尔兹曼机,递归神经网络等

    深度神经网络:深度置信网络,卷积神经网络,循环神经网络,LSTM网络等

    杰佛里 · 埃弗里斯特 · 辛顿(英语:Geoffrey Everest Hinton)(1947年12月6日)是一位英国出生的计算机科学家和心理学家,以其在神经网络方面的贡献闻名。辛顿是反向传播算法的发明人之一,也是深度学习的积极推动者。

  2. 神经网络的特点

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

  3. 神经网络的组成

    • 结构(Architecture)例如,神经网络中的权重,神经元等等
    • 激活函数(Activity Rule
    • 学习规则(Learning Rule)学习规则指定了网络中的权重如何随着时间推进而调整。(反向传播算法

  4. 神经网络API模块

    在使用tensorflow的时候,tf.nn,tf.layers,tf.contrib模块有很多功能是重复的。

    下面是对三个模块的简述:

    1. tf.nn:提供神经网络相关操作的支持,包括卷积操作(conv)、池化操作(pooling)、归一化、loss、分类操作、embedding、RNN、Evaluation。
    2. tf.layers:主要提供的高层的神经网络,主要和卷积相关的,对tf.nn的进一步封装。
    3. tf.contrib::tf.contrib.layers提供够将计算图中的网络层、正则化、摘要操作,是构建计算图的高级操作,但是tf.contrib包不稳定以及一些实验代码。
  1. 浅层人工神经网络模型

    1. SoftMax回归

    2. 损失计算API

      • 损失计算-交叉熵损失公式(了解)

      1. 全连接-从输入直接到输出

        特征加权

        • tf.matmul(a, b, name=None) + bias
          • return:全连接结果,供交叉损失运算
          • 不需要激活函数(因为是最后的输出)
      2. SoftMax计算、交叉熵

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

          计算logits和labels之间的交叉损失熵

          • labels:标签值(真实值)
          • logits:样本加权之后的值
          • return:返回损失值列表
      3. 损失值列表平均值计算

        • tf.reduce_mean(input_tensor)

          计算张量的尺寸的元素平均值

      4. aaaaa

      5. aaaaaa

    3. 其他方法API介绍

      • 其他方法-损失下降API

        • tf.train.GradientDescentOptimizer(learning_rate)

          梯度下降优化

        • learning_rate:学习率,一般为

        • minimize(loss):最小化损失

        • return:梯度下降OP

      • one-hot API介绍

        tf.one_hot

        tf.one_hot(indices, depth, on_value=None, off_value=None, axis=None, dtype=None, name=None)

        • indices 在独热编码中位值,即数据集标签
        • depth 张量的深度,即类别数


三、Mnist数据集浅层神经网络分析

1、Mnist手写数字识别

Mnist数据集可以从官网下载,网址:http://yann.lecun.com/exdb/mnist/ 下载下来的数据集被分成两部分:55000行的训练数据集(mnist.train)和10000行的测试数据集(mnist.text),每一个MNIST数据单元有两部分组成:一张包含手写数字的图片和一个对应的标签,我们把这些图片设为“xs”,把这些标签设为“ys‘。训练数据集和测试数据集都包含xs和ys,比如训练数据集的图片是mnist.train.images,训练数据集的标签是mnist.train.labels。


2、Mnist数据集神经网络实现流程

  1. 准备数据

    1. 获取数据

      from tensorflow.examples.tutorials.mnist import input_data
      
      mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True)
  1. 准确性计算

    equal_list = tf.equal(tf.argmax(y, 1), tf.argmax(y_label, 1))
    
    accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))

  1. 全连接结果计算

  2. 损失优化

  3. 模型评估(计算准确性)

Tensorboard可视化数据以及运算流程图

  • 命令行输入:tensorboard –logdir=”path”

完整训练预测数据代码实现

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

# lst = list(FLAGS._flags().keys())
# for key in lst:
#     FLAGS.__delattr__(key)
#     print('重启完毕')

FLAGS = tf.app.flags.FLAGS
tf.app.flags.DEFINE_string('f', '', 'kernel')
tf.app.flags.DEFINE_integer('is_train', 1 , '指定程序是预测还是训练')

def full_connected():
    # 获取真实的数据
    mnist = input_data.read_data_sets('/home/hbsi/Downloads/MNIST', 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]   b [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()

    # 6.开启会话去训练
    with tf.Session() as sess:
        # 初始化变量
        sess.run(init_op)

        # 建立events文件,然后写入
        filewriter = tf.summary.FileWriter('/home/hbsi/Documents', 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})
                filewriter.add_summary(summary, i)

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

        # 保存模型
            saver.save(sess, '/home/hbsi/Documents/ckpt/fc_model')
        else:

            # 加载模型
            saver.restore(sess, '/home/hbsi/Documents/ckpt/fc_model')

            # 如果是Flase,做出预测
            for i in range(100):

                # 每次测试一张图片 [0,0,0,0,0,1,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()))

    return None


if __name__ == '__main__':
    full_connected() 

四、深层的神经网络——卷积神经网络(CNN)

  • 深度学习网络更常见的单一隐藏层神经网络的区别在于深度,深度学习网络中,每一个节点层在前一层输出的基础上学习识别一组特定的特征。随着神经网络深度增加,节点所能识别的特征也就越来越复杂。

1、卷积神经网络与简单的单层神经网络的比较

  1. 全连接神经网络的缺点
    • 参数太多,在cifar-10的数据集中,只有 32x32x3,就会有这么多权重,如果说更大的图片,比如 200x200x3 就需要120000多个,这完全是浪费
    • 没有利用像素之间位置信息,对于图像识别任务来说,每个像素与周围的像素都是联系比较紧密的。
    • 层数限制
  2. 卷积神经网络错误率


2、卷积神经网络的发展历史


3、卷积神经网络的结构分析

神经网络(neural networks)的基本组成包括输入层、隐藏层、输出层。而卷积神经网络的特点在于隐藏层分为卷积层和池化层(pooling layer,又叫下采样层)。

  • 卷积层:通过在原始图像上平移来提取特征
  • 池化层:通过特征后稀疏参数来减少学习的参数,降低网络的复杂度,(最大池化和平均池化)

  1. 卷积神经网络的结构

    1. 卷积层过滤器

      • 个数 · 输入体积大小H1 x W1 x D1

      • 大小(1x1,3x3,5x5) · 四个超参数:

      • 步长

      • 零填充 ○ Filter数量K

        ​ ○ Filter大小F

      • 卷积层输出深度、输出宽度 ○ 步长S

        • 深度由过滤器个数决定 ○ 零填充大小P

        • 输出宽度 —————————> · 输入体积大小H2 x W2 x D2

          ​ ○ H2 = (H1 - F + 2P)/S + 1

  2. 激活函数 ○ W2 = (W1 - F + 2P)/S + 1

  3. 池化层 ○ D2 = K

  4. 全连接层

注:在大型网络当中会有一个droupout层(减少过拟合)

后续: 待更……


  转载请注明: 浩大大 神经网络—Tensorflow

  目录