04. 简单神经网络

1. 神经网络基础

1.1. 感知机

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

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

  • 感知机解决的是分类问题

  • 效果演示

    • 链接:http://playground.tensorflow.org/#activation=sigmoid&regularization=L2&batchSize=10&dataset=circle&regDataset=reg-plane&learningRate=0.03&regularizationRate=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&regularizationRate_hide=true&percTrainData_hide=true&numHiddenLayers_hide=true&discretize_hide=true&activation_hide=true&problem_hide=true&noise_hide=true&regularization_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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值