Tensorflow-线性回归与手写数字分类
线性回归
步骤
- 构造线性回归数据
- 定义输入层
- 设计神经网络中间层
- 定义神经网络输出层
- 计算二次代价函数,构建梯度下降
- 进行训练,获取预测值
- 画图展示
代码
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
tf.compat.v1.disable_eager_execution() #3-1非线性回归
#使用numpy生成200个随机点,200行1列
x_data=np.linspace(-0.5,0.5,200)[:,np.newaxis]
noise=np.random.normal(0,0.02,x_data.shape)
#square为平方
y_data=np.square(x_data)+noise
print(x_data)
print(y_data)
print(y_data.shape) #定义两个placeholder
#输入层:一个神经元
x=tf.compat.v1.placeholder(tf.float32,[None,1])
y=tf.compat.v1.placeholder(tf.float32,[None,1]) #定义神经网络中间层
#中间层:10个神经元
Weights_L1=tf.Variable(tf.compat.v1.random_normal([1,10]))
biases_L1=tf.Variable(tf.zeros([1,10]))
Wx_plus_b_L1=tf.matmul(x,Weights_L1)+biases_L1
#L1中间层的输出,tanh为激活函数
L1=tf.nn.tanh(Wx_plus_b_L1) #定义神经网络输出层
#输出层:一个神经元
Weights_L2=tf.Variable(tf.compat.v1.random_normal([10,1]))
biases_L2=tf.Variable(tf.zeros([1,1]))
#输出层的输入就是中间层的输出,故为L1
Wx_plus_b_L2=tf.matmul(L1,Weights_L2)+biases_L2
#预测结果
prediction=tf.nn.tanh(Wx_plus_b_L2) #二次代价函数
#真实值减去预测值的平方的平均值
loss=tf.reduce_mean(tf.square(y-prediction))
#梯度下降:学习率,最下化为loss
train_step=tf.compat.v1.train.GradientDescentOptimizer(0.1).minimize(loss) #定义会话
with tf.compat.v1.Session() as sess:
# 变量初始化
sess.run(tf.compat.v1.global_variables_initializer())
# 开始训练
for _ in range(2000):
#使用placeholder进行传值,传入样本值
sess.run(train_step,feed_dict={x:x_data,y:y_data}) #训练好后,获得预测值,同时传入样本参数
prediction_value=sess.run(prediction,feed_dict={x:x_data}) #画图
plt.figure()
# 用散点图,来画出样本点
plt.scatter(x_data,y_data)
# 预测图,红色实现,线款为5
plt.plot(x_data,prediction_value,'r-',lw=5)
plt.show()
展示

手写数字分类
MNIST数据集
MNIST数据集的官网:Yann LeCun's website下载下来的数据集被分成两部分:60000行的训练数据集(mnist.train)和10000行的测试数据集(mnist.test)
数据集详情
每一张图片包含28*28个像素,我们把这一个数组展开成一个向量,长度是28*28=784。因此在
MNIST训练数据集中mnist.train.images 是一个形状为 [60000, 784] 的张量,第一个维度数字用
来索引图片,第二个维度数字用来索引每张图片中的像素点。图片里的某个像素的强度值介于0-1
之间。



神经网络搭建

Softmax函数
代码
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
tf.compat.v1.disable_eager_execution()
import numpy as np #载入数据集
mnist=input_data.read_data_sets("MNIST_data",one_hot=True) #每个批次大小
batch_size=100
#计算一共有多少个批次
n_bath=mnist.train.num_examples // batch_size
print(n_bath)
#定义两个placeholder
x=tf.compat.v1.placeholder(tf.float32,[None,784])
y=tf.compat.v1.placeholder(tf.float32,[None,10]) #创建一个简单的神经网络
W=tf.Variable(tf.zeros([784,10]))
b=tf.Variable(tf.zeros([10]))
prediction=tf.nn.softmax(tf.matmul(x,W)+b) #二次代价函数
loss=tf.reduce_mean(tf.square(y-prediction))
#梯度下降
train_step=tf.compat.v1.train.GradientDescentOptimizer(0.2).minimize(loss) #初始化变量
init=tf.compat.v1.global_variables_initializer() #结果存放在一个布尔型列表中
#返回的是一系列的True或False argmax返回一维张量中最大的值所在的位置,对比两个最大位置是否一致
correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(prediction,1)) #求准确率
#cast:将布尔类型转换为float,将True为1.0,False为0,然后求平均值
accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32)) with tf.compat.v1.Session() as sess:
sess.run(init)
for epoch in range(21):
for batch in range(n_bath):
#获得一批次的数据,batch_xs为图片,batch_ys为图片标签
batch_xs,batch_ys=mnist.train.next_batch(batch_size)
#进行训练
sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys})
#训练完一遍后,测试下准确率的变化 acc=sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels})
print("Iter "+str(epoch)+",Testing Accuracy "+str(acc))
输出:

优化代码
优化方面:
①批次个数减小到20
②权值不再为0,改为随机数,设置参数要尽可能小
③增加一个隐藏层,节点数是sqrt(n*l),其中n是输入节点数,l是输出节点数,故为89
④代价函数更换为:交叉熵
⑤梯度下降函数更换为-->动量随机梯度下降,如果上次的准确率比这次准确率还要大,则将0.2乘以0.5
代码:
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
tf.compat.v1.disable_eager_execution()
import numpy as np #载入数据集
mnist=input_data.read_data_sets("MNIST_data",one_hot=True) #每个批次大小
batch_size=20
#计算一共有多少个批次
n_bath=mnist.train.num_examples // batch_size
print(n_bath)
#定义两个placeholder
x=tf.compat.v1.placeholder(tf.float32,[None,784])
y=tf.compat.v1.placeholder(tf.float32,[None,10]) #创建一个简单的神经网络
#1.初始化非常重要,参数要尽可能小
W=tf.Variable(tf.compat.v1.random_normal([784,89])/np.sqrt(784))
b=tf.Variable(tf.zeros([89]))
prediction=tf.nn.relu(tf.matmul(x,W)+b) #第二层
#2.我增加了一个神经网络层,节点数是sqrt(n*l),其中n是输入节点数,l是输出节点数
W2=tf.Variable(tf.compat.v1.random_normal([89,10])/np.sqrt(89))
b2=tf.Variable(tf.zeros([10]))
#将其转换为概率值
prediction2=tf.nn.softmax(tf.matmul(prediction,W2)+b2) #二次代价函数
# loss=tf.reduce_mean(tf.square(y-prediction2))
#交叉熵
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction2))
#动量随机梯度下降
#3.如果上次的准确率比这次准确率还要大,则将0.2乘以0.5
train_step=tf.compat.v1.train.MomentumOptimizer(0.2,0.5).minimize(loss) #初始化变量
init=tf.compat.v1.global_variables_initializer() #结果存放在一个布尔型列表中
#返回的是一系列的True或False argmax返回一维张量中最大的值所在的位置,对比两个最大位置是否一致
correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(prediction2,1)) #求准确率
#cast:将布尔类型转换为float,将True为1.0,False为0,然后求平均值
accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32)) with tf.compat.v1.Session() as sess:
sess.run(init)
for epoch in range(21):
for batch in range(n_bath):
#获得一批次的数据,batch_xs为图片,batch_ys为图片标签
batch_xs,batch_ys=mnist.train.next_batch(batch_size)
#进行训练
sess.run(train_step,feed_dict={x:batch_xs,y:batch_ys})
#训练完一遍后,测试下准确率的变化 acc=sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels})
print("Iter "+str(epoch)+",Testing Accuracy "+str(acc))
输出:

Tensorflow-线性回归与手写数字分类的更多相关文章
- Android+TensorFlow+CNN+MNIST 手写数字识别实现
Android+TensorFlow+CNN+MNIST 手写数字识别实现 SkySeraph 2018 Email:skyseraph00#163.com 更多精彩请直接访问SkySeraph个人站 ...
- 基于tensorflow的MNIST手写数字识别(二)--入门篇
http://www.jianshu.com/p/4195577585e6 基于tensorflow的MNIST手写字识别(一)--白话卷积神经网络模型 基于tensorflow的MNIST手写数字识 ...
- MNIST手写数字分类simple版(03-2)
simple版本nn模型 训练手写数字处理 MNIST_data数据 百度网盘链接:https://pan.baidu.com/s/19lhmrts-vz0-w5wv2A97gg 提取码:cgnx ...
- 基于TensorFlow的MNIST手写数字识别-初级
一:MNIST数据集 下载地址 MNIST是一个包含很多手写数字图片的数据集,一共4个二进制压缩文件 分别是test set images,test set labels,training se ...
- Tensorflow之MNIST手写数字识别:分类问题(1)
一.MNIST数据集读取 one hot 独热编码独热编码是一种稀疏向量,其中:一个向量设为1,其他元素均设为0.独热编码常用于表示拥有有限个可能值的字符串或标识符优点: 1.将离散特征的取值扩展 ...
- Tensorflow实现MNIST手写数字识别
之前我们讲了神经网络的起源.单层神经网络.多层神经网络的搭建过程.搭建时要注意到的具体问题.以及解决这些问题的具体方法.本文将通过一个经典的案例:MNIST手写数字识别,以代码的形式来为大家梳理一遍神 ...
- 在opencv3中实现机器学习算法之:利用最近邻算法(knn)实现手写数字分类
手写数字digits分类,这可是深度学习算法的入门练习.而且还有专门的手写数字MINIST库.opencv提供了一张手写数字图片给我们,先来看看 这是一张密密麻麻的手写数字图:图片大小为1000*20 ...
- Tensorflow可视化MNIST手写数字训练
简述] 我们在学习编程语言时,往往第一个程序就是打印“Hello World”,那么对于人工智能学习系统平台来说,他的“Hello World”小程序就是MNIST手写数字训练了.MNIST是一个手写 ...
- TensorFlow(四):手写数字识别
一:数据集 采用MNIST数据集:-->官网 数据集被分成两部分:60000行的训练数据集和10000行的测试数据集. 其中每一张图片包含28*28个像素,我们把这个数组展开成一个向量,长度为2 ...
随机推荐
- Maven笔记之面试题合集
简介:收集整理了网上关于Maven的面试问题,准备面试使用,答案通过各种资料查证编写. 1.什么是Maven? Maven主要服务于基于java平台的项目构建,依赖管理和项目信息管理.Maven项目对 ...
- 全栈工程师-史上最强VSCODE插件-提高开发效率
当你点进来的时候 ,你可能是被标题吸引进来的,也有可能是 偶然间,看到的,首先恭喜你,已经准备好向全栈开发工程师靠近 ,那我们不说废话,直接开始,咱们先从安装步骤开始讲起 ,因为有些人连插件在哪都不知 ...
- mysql锁机制 读书笔记
目录 MySQL锁机制 1.什么是锁 2.lock与latch 3.InnoDB存储引擎中的锁 3.1锁的类型 3.2 一致性非锁定读 3.3 一致性锁定读 4 锁的算法 4.1行锁的3中算法 4.2 ...
- C# 生成图片验证码 图片缩略图 水印
using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D ...
- matplotlib学习日记(九)-图形样式
(一)刻度线定位器和刻度格式器的使用方法 import matplotlib.pyplot as plt import numpy as np from matplotlib.ticker impor ...
- AutoMapper的源码分析
最近有一个小项目需要提供接口给第三方使用,接口会得到一个大的XML的字符串大约有8个对象100多个字段,在映射到Entity只能通过反射来赋值避免重复的赋值,但是明显感觉到性能下降严重,因为以前接触过 ...
- AndroidSDK安装选项说明
前言:本文的目的在于了解AndroidSDK相关安装选项,正确根据自身需要选择性安装,避免安装过多无用的东西导致硬盘爆满. 1. AndroidSDK安装选项说明,如上图. 2. 实际游戏打包使用到A ...
- 转载--对batch normalization的理解
转载的大神的: https://www.cnblogs.com/guoyaohua/p/8724433.html 上边这个应该是抄的下边这个原文,但是上边的有重点标记 https://blog.csd ...
- 入门oj 6492: 小B的询问
Description 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L ...
- Phoneix(一)简介及常用命令
一.简介 Apache Phoneix是运行在HBase之上的高性能关系型数据库,通过Phoneix可以像使用jdbc访问关系型数据库一样访问HBase. Phoneix操作的表以及数据存储在HBas ...
