tensorflow神经网络与单层手写字识别
1、知识点
"""
1、基础知识:
1、神经网络结构:1、输入层 2、隐含层 3、全连接层(类别个数=全连接层神经元个数)+softmax函数 4、输出层
2、逻辑回归:只能解决二分类问题
3、线性回归:只能用于预测
4、softmax:有多少类别,就会有多少个输出
5、信息熵:信息熵越大,不确定性越大,信息熵越小,则不确定小,属于的类别也更加清晰
6、softmax公式: Si = e^i / (e^1+....+e^j) ,用于计算概率值。 特点:所有类别概率值相加等于1
7、损失函数:交叉熵损失 ,一个样本就有一个交叉熵损失。公式: H(y) = -y'log y(i)对i的求和值,其中y'为真实结果,y(i)为预测结果,一 2、感知机:有n个输入数据,通过权重与各数据之间的计算和,比较激活函数结果,得出输出
应用场景:很容易解决与、或、非问题,即二分类问题 3、神经网络的种类:
1、基础神经网络:单层感知器,线性神经网络,BP神经网络,Hopfield神经网络等
2、进阶神经网络:玻尔兹曼机,受限玻尔兹曼机,递归神经网络等
3、深度神经网络:深度置信网络,卷积神经网络,循环神经网络,LSTM网络等 4、神经网络特点:
1、输入向量的维度和输入神经元的个数相同
2、每个连接都有个权值
3、同一层神经元之间没有连接
4、由输入层,隐层,输出层组成
5、第N层与第N-1层的所有神经元连接,也叫全连接 5、神经网络API模块:
1、tf.nn:提供神经网络相关操作的支持,包括卷积操作(conv)、池化操作(pooling)、归一化、loss、分类操作、embedding、RNN、Evaluation.
2、tf.layers:主要提供的高层的神经网络,主要和卷积相关的,对tf.nn进一步封装。
3、tf.contrib:tf.contrib.layers提供将计算图中的网络层、正则化、摘要操作,是构建计算图的高级操作,但是tf.contrib包不稳定以及一些实验代码 算法对比总结:
算法 策略 优化
线性回归 均方误差 梯度下降 预测
逻辑回归 对数似然损失 梯度下降 二分类
神经网络 交叉熵损失 反响传播算法(就是梯度下降算法) 单层(全连接层)实现手写数字识别:
1、定义数据占位符,针对特征值和目标值矩阵
特征值[None,784] 目标值[None,10]
2、建立模型
随机初始化权重和偏置 y_predict = tf.matmul(x,w)+b
3、计算损失
loss平均样本损失(交叉熵损失)
4、梯度下降优化(梯度下降算法)
"""
2、代码
# coding = utf-8
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 fullconnnected():
"""
全连接层
:return: """
#获取数据
minist = input_data.read_data_sets("./data/mnist/input_data/", 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、建立一个全连接层的神经网络
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个样本的输出结果
y_predict = tf.matmul(x,weight)+bias #3、计算交叉熵损失
with tf.variable_scope("cross_entropy"):
#求取平均交叉熵损失
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.2).minimize(loss) #5、计算准确率
with tf.variable_scope("accuracy"):
equal_list = tf.equal(tf.argmax(y_true,1),tf.argmax(y_predict,1))
#equal_list None个样本 [1,0,1,1,0,0,0......]
accuracy = tf.reduce_mean(tf.cast(equal_list,tf.float32)) #6、收集变量
tf.summary.scalar("losses",loss)
tf.summary.scalar("acc",accuracy)
tf.summary.histogram("weights",weight)
tf.summary.histogram("baises",bias)
merge = tf.summary.merge_all() #7、初始化变量
init_op = tf.global_variables_initializer() #8、创建一个Saver
saver = tf.train.Saver() #9、开启会话进行训练
with tf.Session() as sess:
#初始化变量
sess.run(init_op)
fileWriter = tf.summary.FileWriter("./event/",graph=sess.graph) if FLAGS.IS_TRAIN == 1:
#迭代步数训练,更新参数预测
for i in range(2000):
#取出数据的特征自和目标值
mnist_x,mnist_y =minist.train.next_batch(50)
#训练
sess.run(train_op,feed_dict={x: mnist_x, y_true:mnist_y})
summary = sess.run(merge,feed_dict={x: mnist_x, y_true:mnist_y})
fileWriter.add_summary(summary,i)
print("训练第%d步,准确率为:%f" %(i,sess.run(accuracy,feed_dict={x: mnist_x, y_true:mnist_y})) )
#保存模型
saver.save(sess,"./ckpt/fc_model")
else:
#如果是0,那么做预测
for i in range(10):
saver.restore(sess,"./ckpt/fc_model")
#每次测试一张图片
x_test,y_test = minist.test.next_batch(1)
print("第%d张图片,手写数字是%d,,预测结果是%d" %(
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__':
"测试:python 简单神经网络介绍.py --IS_TRAIN=0"
#默认训练
fullconnnected()
pass
tensorflow神经网络与单层手写字识别的更多相关文章
- 用TensorFlow教你手写字识别
博主原文链接:用TensorFlow教你做手写字识别(准确率94.09%) 如需转载,请备注出处及链接,谢谢. 2012 年,Alex Krizhevsky, Geoff Hinton, and Il ...
- 10分钟搞懂Tensorflow 逻辑回归实现手写识别
1. Tensorflow 逻辑回归实现手写识别 1.1. 逻辑回归原理 1.1.1. 逻辑回归 1.1.2. 损失函数 1.2. 实例:手写识别系统 1.1. 逻辑回归原理 1.1.1. 逻辑回归 ...
- knn算法手写字识别案例
import pandas as pd import numpy as np import matplotlib.pyplot as plt import os from sklearn.neighb ...
- tensorflow卷积神经网络与手写字识别
1.知识点 """ 基础知识: 1.神经网络(neural networks)的基本组成包括输入层.隐藏层.输出层.而卷积神经网络的特点在于隐藏层分为卷积层和池化层(po ...
- Tensorflow之基于MNIST手写识别的入门介绍
Tensorflow是当下AI热潮下,最为受欢迎的开源框架.无论是从Github上的fork数量还是star数量,还是从支持的语音,开发资料,社区活跃度等多方面,他当之为superstar. 在前面介 ...
- [纯C#实现]基于BP神经网络的中文手写识别算法
效果展示 这不是OCR,有些人可能会觉得这东西会和OCR一样,直接进行整个字的识别就行,然而并不是. OCR是2维像素矩阵的像素数据.而手写识别不一样,手写可以把用户写字的笔画时间顺序,抽象成一个维度 ...
- 46、tensorflow入门初步,手写识别0,1,2,3,4,5,6
1.使用tensorflow的SoftMax函数,对手写数字进行识别 Administrator@SuperComputer MINGW64 ~ $ docker run -it -p 8888:88 ...
- 基于PyTorch实现MNIST手写字识别
本篇不涉及模型原理,只是分享下代码.想要了解模型原理的可以去看网上很多大牛的博客. 目前代码实现了CNN和LSTM两个网络,整个代码分为四部分: Config:项目中涉及的参数: CNN:卷积神经网络 ...
- 8.CNN应用于手写字识别
import numpy as np from keras.datasets import mnist from keras.utils import np_utils from keras.mode ...
随机推荐
- hive--构建于hadoop之上、让你像写SQL一样编写MapReduce程序
hive介绍 什么是hive? hive:由Facebook开源用于解决海量结构化日志的数据统计 hive是基于hadoop的一个数据仓库工具,可以将结构化的数据映射为数据库的一张表,并提供类SQL查 ...
- Linux学习--第九天--du、df、fsck、dumpe2fs、mount、NTFS-3G、fdisk、partprobe、/etc/fstab、free、mkswap、swapon
分区类型 主分区:最多只能分四个 扩展分区:只能有一个,如果有了扩展分区,主分区只能有三个.扩展分区不能格式化和存储数据,再划分为逻辑分区才能进行相应操作. 逻辑分区:IDE硬盘,linux最多支持5 ...
- STM32WB 振荡器与时钟
一.振荡器类型与配置 1.振荡器类型:LSE.LSI1.LSI2.MSI.HSI.HSI48.HSE 2.MX中的振荡器配置 3.代码配置样例 RCC_OscInitStruct.Oscillator ...
- python函数:函数参数、对象、嵌套、闭包与名称空间、作用域
今天的内容整理共有5部分 一.命名关键字参数 二.函数对象 三.函数的嵌套 四.名称空间与作用域 五.闭包函数 一.命名关键字参数 # 命名关键字参数: 在定义函数时,*与**之间参数称之为命名关键字 ...
- java8学习之Supplier与函数式接口总结
Supplier接口: 继续学习一个新的函数式接口--Supplier,它的中文意思为供应商.提供者,下面看一下它的javadoc: 而具体的方法也是相当的简单,就是不接受任何参数,返回一个结果: 对 ...
- emplace_back() 和 push_back 的区别
在引入右值引用,转移构造函数,转移复制运算符之前,通常使用push_back()向容器中加入一个右值元素(临时对象)的时候,首先会调用构造函数构造这个临时对象,然后需要调用拷贝构造函数将这个临时对象放 ...
- WPF绑定命令
一.目的 降低代码耦合度(降低UI层和BLL层的代码耦合度),将UI层的后台代码更好的转移到BLL层中,让视图和业务逻辑分离的更好 二.使用方式 1.创建一个RelayCommand,继承IComma ...
- 关于Spring MVC写的不错的几篇博客
关于Spring MVC写的不错的几篇博客 https://my.oschina.net/kolbe/blog/509810 https://www.cnblogs.com/sunniest/p/45 ...
- iOS View的一些操作定义为宏
#define ViewOf(__View__,__TAG__) [__View__ viewWithTag:__TAG__]#define LabelOf(__View__,__TAG__) ((U ...
- vue项目搭建和开发流程 vue项目配置ElementUI、jQuery和Bootstrap环境
目录 一.VUE项目的搭建 1. 环境搭建 2. 项目的创建和启动 二. 开发项目 1. 配置vue项目启动功能 2. 开发vue项目 (1)项目文件的作用 (2)vue项目开发流程 (3)vue项目 ...