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
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值