Python深度学习6之神经网络

Python神经网络6之神经网络

  • 神经网络
    • 神经网络基础
      • 神经网络
        • 感知机
      • playground使用
    • 神经网络原理
      • softmax回归
      • 交叉熵损失
      • softmax、交叉熵损失API
    • 案例:Mnist手写数字识别
      • 数据集介绍
      • Mnist数据获取API
      • 实战:Mnist手写数字识别

神经网络

神经网络基础

神经网络

人工神经网络也简称为神经网络,是一种模仿和生物神经网络结构和功能的计算模型。经典的神经网络结构包含三个层次的神经网络。分别为输入层,输出层以及隐藏层
Python深度学习6之神经网络_第1张图片
其中每层的圆圈代表一个神经元,隐藏层和输出层的神经元有输入的数据计算后输出,输入层的神经元只需输入

感知机

感知机就是模拟这样的大脑神经网络处理数据的过程,感知机模型如下图:
Python深度学习6之神经网络_第2张图片
感知机是一种最基础的分类模型,类似于法逻辑回归,不同的是,感知机的激活函数用的是sign,而逻辑回归用的是sigmoid,感知机也具有连接的权重和偏置Python深度学习6之神经网络_第3张图片
sign函数9
Python深度学习6之神经网络_第4张图片

playground使用

官方网址Python深度学习6之神经网络_第5张图片
感知机可以解决的问题:简单的与或问题


  1. 0 0 =>0
    0 1 =>1
    1 0 =>1
    1 1 =>0

  2. 0 0 =>0
    0 1 =>0
    1 0 =>0
    1 1 =>1

任意画一条对角线来分隔两组数据点,定义一个阈值以确定每个数据点属于哪一个组
其中b是确定线的位置的阈值,通过分别对x1和x2赋予权重w1和w2,就可以进行分类了
Python深度学习6之神经网络_第6张图片
红色划分 与,绿色划分 或
Python深度学习6之神经网络_第7张图片

  1. 异或
    0 0 => 0
    0 1 => 1
    1 0 =>1
    1 1 => 0
    Python深度学习6之神经网络_第8张图片

神经网络原理

神经网络的主要用途在于分类Python深度学习6之神经网络_第9张图片

softmax回归

softmax回归将神经网络输出转换成概率结果

Python深度学习6之神经网络_第10张图片
Python深度学习6之神经网络_第11张图片
Python深度学习6之神经网络_第12张图片
Python深度学习6之神经网络_第13张图片
logits加上softmax映射 - 多分类问题

交叉熵损失

  1. 公式

Python深度学习6之神经网络_第14张图片
为了能够衡量距离,目标值需要进行one-hot编码,能与概率值一一对应,如下图:
Python深度学习6之神经网络_第15张图片
yi’ 是真实值,yi 是输出的结果
-0*log0.1-0*log0.05-…-1*log0.1=1
上述的结果是1*log(0.1),那么为了减少这个样本的损失,神经网络应该提高对应目标值为1的位置输出概率的大小,由于softmax公式的影响,其他的概率必定会减少,进行这样的调整就能预测成功了。

  1. 损失大小
    神经网络最后的损失为平均每个样本的损失大小
  • 对所有的样本的损失求和取其平均值

softmax、交叉熵损失API

  • tf.nn.softmax_cross_entropy_with_logits(labels=None,logits=None,name=None)
    计算logits和labels之间的交叉损失熵
    labels:标签值
    logits:样本加权之后的值
    return:返回损失值列表
  • tf.reduce_mean(input_tensor)
    计算张量的尺寸的元素平均值

案例:Mnist手写数字识别

数据集介绍


下载网址
Python深度学习6之神经网络_第16张图片

  1. 特征值
    数据集被划分为两部分:55000行的训练数据集(mnist.train)和10000行的测试数据集(mnist.test)。每一个MNIST数据单元有两部分组成:一张包含手写数字的图片和一个对应的标签。我们把这些图片设为“xs”,把这些标签设为“ys”。训练数据集合测试数据集都包含xs和ys,比如训练数据集的图片是mnist.train.images,训练集的标签是mnist.train.labels。
    Python深度学习6之神经网络_第17张图片
    图片是黑白图片,每一张图片包含28像素×28像素。我们把这个数组展开成一个向量,长度是28×28=784。因此,在MNIST训练数据集中,mnist.train.images是一个形状为[60000,784]的张量Python深度学习6之神经网络_第18张图片
  2. 目标值
    用one-hot编码
    表示3的话:
    0,1,2,3,4,…,9
    0,0,0,1,0,…,0
    Python深度学习6之神经网络_第19张图片

Mnist数据获取API

TensorFlow框架自带了获取这个数据集的接口,所以不需要自行读取

  • from tensorflow.examples.tutorials.mnist import input_data
    mnist=input_data.read_data_sets(path,one_hot=True)
    • mnist.train.next_batch(100)(提供批量获取功能)
    • mnist.train.images、labels
    • mnist.test.images、labels

实战:Mnist手写数字识别

  1. 网络设计
    我们采用只有一层,即最后一个输出层的神经网络,也称之为全连接层神经网络
    Python深度学习6之神经网络_第20张图片
  2. 全连接层计算
    本质:矩阵计算
    y=w1 x1+w2 x2+…+b
    x[None,784]*weights[784,10]+bias[10] =y_predict[None,10]
    error=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true,logits=y_predic t,name=None))
    优化损失:梯度下降
  • tf.matmul(a,b,name=None)+bias
    return:全连接结果,供交叉损失运算
  • tf.train.GradientDescentOptimizer(learning_rate)
    梯度下降
    learning_rate:学习率
    method:
    • minimize(loss):最小化损失
  1. 代码展示
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data

def full_connection():
    """
    用全连接来对手写数字进行识别
    :return:
    """
    #1.准备数据
    mnist=input_data.read_data_sets("./mnist_data",one_hot=True)
    x=tf.placeholder(dtype=tf.float32,shape=(None,784))
    y_true=tf.placeholder(dtype=tf.float32,shape=(None,10))

    #2.构建模型
    Weights=tf.Variable(initial_value=tf.random_normal(shape=[784,10]))
    bias=tf.Variable(initial_value=tf.random_normal(shape=[10]))
    y_predict=tf.matmul(x,Weights)+bias

    #3.构造损失函数
    error=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true,logits=y_predict))

    #4.优化损失
    optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)

    #初始化变量
    init=tf.global_variables_initializer()

    #开启会话
    with tf.Session() as sess:
        sess.run(init)
        image,label=mnist.train.next_batch(100)

        print("训练之前,损失为%f"%sess.run(error,feed_dict={x:image,y_true:label}))

        #开始训练
        for i in range(100):
            _,loss=sess.run([optimizer,error],feed_dict={x:image,y_true:label})
            print("第%d次的训练,损失为%f"%(i+1,loss))

if __name__ == "__main__":
    full_connection()

Python深度学习6之神经网络_第21张图片
Python深度学习6之神经网络_第22张图片

  1. 完善模型功能
  • 准确率计算
    Python深度学习6之神经网络_第23张图片
  • equal_list=tf.equal(tf.argmax(y,1),tf.argmax(y_label,1))
  • accuracy=tf.reduce_mean(tf.cast(equal_list,tf.float32))

比较输出结果最大值所在位置和真实值的最大值所在位置
y_true的形状:(None,10)
tf.argmax(y_true,1)
tf.argmax(y_predict,1)

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

def full_connection():
    """
    用全连接来对手写数字进行识别
    :return:
    """
    #1.准备数据
    mnist=input_data.read_data_sets("./mnist_data",one_hot=True)
    x=tf.placeholder(dtype=tf.float32,shape=(None,784))
    y_true=tf.placeholder(dtype=tf.float32,shape=(None,10))

    #2.构建模型
    Weights=tf.Variable(initial_value=tf.random_normal(shape=[784,10]))
    bias=tf.Variable(initial_value=tf.random_normal(shape=[10]))
    y_predict=tf.matmul(x,Weights)+bias

    #3.构造损失函数
    error=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true,logits=y_predict))

    #4.优化损失
    optimizer=tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)

    #5.准确率计算
    #比较输出结果最大值所在位置和真实值的最大值所在位置
    equal_list=tf.equal(tf.argmax(y_true,1),tf.argmax(y_predict,1))
    accuracy=tf.reduce_mean(tf.cast(equal_list,tf.float32))

    #初始化变量
    init=tf.global_variables_initializer()

    #开启会话
    with tf.Session() as sess:
        sess.run(init)
        image,label=mnist.train.next_batch(100)

        print("训练之前,损失为%f"%sess.run(error,feed_dict={x:image,y_true:label}))

        #开始训练
        for i in range(4000):
            _,loss,accuracy_value=sess.run([optimizer,error,accuracy],feed_dict={x:image,y_true:label})
            print("第%d次的训练,损失为%f,准确率为%f"%(i+1,loss,accuracy_value))

if __name__ == "__main__":
    full_connection()

Python深度学习6之神经网络_第24张图片
Python深度学习6之神经网络_第25张图片
Python深度学习6之神经网络_第26张图片

你可能感兴趣的:(神经网络,python)