Python神经网络6之神经网络
神经网络
神经网络基础
神经网络
人工神经网络也简称为神经网络,是一种模仿和生物神经网络结构和功能的计算模型。经典的神经网络结构包含三个层次的神经网络。分别为输入层,输出层以及隐藏层
其中每层的圆圈代表一个神经元,隐藏层和输出层的神经元有输入的数据计算后输出,输入层的神经元只需输入
感知机
感知机就是模拟这样的大脑神经网络处理数据的过程,感知机模型如下图:
感知机是一种最基础的分类模型,类似于法逻辑回归,不同的是,感知机的激活函数用的是sign,而逻辑回归用的是sigmoid,感知机也具有连接的权重和偏置
sign函数9
playground使用
官方网址
感知机可以解决的问题:简单的与或问题
- 或
0 0 =>0
0 1 =>1
1 0 =>1
1 1 =>0 - 与
0 0 =>0
0 1 =>0
1 0 =>0
1 1 =>1
任意画一条对角线来分隔两组数据点,定义一个阈值以确定每个数据点属于哪一个组
其中b是确定线的位置的阈值,通过分别对x1和x2赋予权重w1和w2,就可以进行分类了
红色划分 与,绿色划分 或
- 异或
0 0 => 0
0 1 => 1
1 0 =>1
1 1 => 0
神经网络原理
神经网络的主要用途在于分类
softmax回归
softmax回归将神经网络输出转换成概率结果
logits加上softmax映射 - 多分类问题
交叉熵损失
- 公式
为了能够衡量距离,目标值需要进行one-hot编码,能与概率值一一对应,如下图:
yi’ 是真实值,yi 是输出的结果
-0*log0.1-0*log0.05-…-1*log0.1=1
上述的结果是1*log(0.1),那么为了减少这个样本的损失,神经网络应该提高对应目标值为1的位置输出概率的大小,由于softmax公式的影响,其他的概率必定会减少,进行这样的调整就能预测成功了。
- 损失大小
神经网络最后的损失为平均每个样本的损失大小
- 对所有的样本的损失求和取其平均值
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手写数字识别
数据集介绍
- 特征值
数据集被划分为两部分:55000行的训练数据集(mnist.train)和10000行的测试数据集(mnist.test)。每一个MNIST数据单元有两部分组成:一张包含手写数字的图片和一个对应的标签。我们把这些图片设为“xs”,把这些标签设为“ys”。训练数据集合测试数据集都包含xs和ys,比如训练数据集的图片是mnist.train.images,训练集的标签是mnist.train.labels。
图片是黑白图片,每一张图片包含28像素×28像素。我们把这个数组展开成一个向量,长度是28×28=784。因此,在MNIST训练数据集中,mnist.train.images是一个形状为[60000,784]的张量 - 目标值
用one-hot编码
表示3的话:
0,1,2,3,4,…,9
0,0,0,1,0,…,0
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手写数字识别
- 网络设计
我们采用只有一层,即最后一个输出层的神经网络,也称之为全连接层神经网络
- 全连接层计算
本质:矩阵计算
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):最小化损失
- 代码展示
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()
- 完善模型功能
- 准确率计算
- 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()