对手写数字的预测



这里我们第一个激活函数一般选用Relu,最后输出的是对应的多个分类的概率值,所以最后一个激活函数选用softmax函数。中间的隐藏层的个数和大小可以改变,但最后必须是10

代码实现

import tensorflow as tf
import matplotlib.pyplot as plt
#输入层 h1 784
#隐藏层 h2 256
#隐藏层 h3 128
#输出层 h4 10
#初始化参数
w1=tf.Variable(tf.random.truncated_normal([784,256],stddev=0.1))
w2=tf.Variable(tf.random.truncated_normal([256,128],stddev=0.1))
w3=tf.Variable(tf.random.truncated_normal([128,10],stddev=0.1))b1=tf.Variable(tf.zeros([256]))
b2=tf.Variable(tf.zeros([128]))
b3=tf.Variable(tf.zeros([10]))

数据下载

(x_train, y_train), (x_test, y_test)=tf.keras.datasets.mnist.load_data()
#这里把路径删掉


这里我们先看看训练集x,y的数据,发现x是0-255的数据,我们要将它变成0-1(也就是将图二值化处理),而y的值发现他是0-9的整数类型,也就是我们的最后的标签

#先将x的类型由np转为tf,然后将数据类型变为浮点型,并除以255归到0-1
x_train=tf.convert_to_tensor(x_train,dtype=tf.float32)/255
y_train=tf.convert_to_tensor(y_train,dtype=tf.int32)#可以看出训练集的数据格式三维,我们这里将它拉成二维的(60000,784)
#转成tensor类型
x_train=tf.reshape(x_train,[-1,28*28])
print(x_train.shape)

TensorShape([60000, 784])

完成一次向前计算

x_train.shape,w1.shape,b1.shape

(TensorShape([60000, 784]), TensorShape([784, 256]), TensorShape([256]))

#第一层h1:net1(z=sum(wx+b))  out1:(relu(z))
#[60000,784]@[784,256]+[256]
# net1=x_train@w1+tf.broadcast_to(b1,[x_train.shape[0],256])
#这里我们发现b1要想和他们相加必须改为(60000,256),这里我们用广播,但是在tf里可以直接广播,如下
net1=x_train@w1+b1
out1=tf.nn.relu(net1)

这里的relu函数可以直接取官网查他的用法,和之前的网页一样

#h2 :net2(net1=sum(wx+b))  out2:(relu(net1))
#[60000,256]@[256,128]+[128]
net2=out1@w2+b2
out2=tf.nn.relu(net2)#h3 :net3(net2=sum(wx+b))  out3:(softmax(net2))
#[60000,128]@[128,10]+[10]
net3=out2@w3+b3
out3=tf.nn.softmax(net3)

#这里的用法也是去官网查
#对训练集进行热编码
y_train=tf.one_hot(y_train,depth=10)
y_train,y_train.shape

:(<tf.Tensor: id=921573, shape=(60000, 10), dtype=float32, numpy=
array([[0., 0., 0., …, 0., 0., 0.],
[1., 0., 0., …, 0., 0., 0.],
[0., 0., 0., …, 0., 0., 0.],
…,
[0., 0., 0., …, 0., 0., 0.],
[0., 0., 0., …, 0., 0., 0.],
[0., 0., 0., …, 0., 1., 0.]], dtype=float32)>,
TensorShape([60000, 10]))

loss=tf.nn.softmax_cross_entropy_with_logits(labels=y_train, logits=out3, axis=-1)
loss

<tf.Tensor: id=921605, shape=(60000,), dtype=float32, numpy=
array([2.2913394, 2.3099377, 2.3125176, …, 2.3297052, 2.337242 ,
2.2942417], dtype=float32)>

#我们看看在当前模型下的损失值的大概大小
loss=tf.reduce_mean(loss)
loss

<tf.Tensor: id=921607, shape=(), dtype=float32, numpy=2.3081443>

反向传播

这里我们先做一次的反向传播,仅仅是看下编码的步骤

with tf.GradientTape() as tape:tape.watch([w1,b1,w2,b2,w3,b3])out3=tf.nn.softmax(tf.nn.relu(tf.nn.relu(x_train@w1+b1)@w2+b2)@w3+b3)loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_train, logits=out3, axis=-1))grads=tape.gradient(loss,[w1,b1,w2,b2,w3,b3])
lr=0.01
num=5001

更新参数(这里就是对之前的那一次进行重复的迭代了)

w=w-lrgrads
w-=lr
grads
tf.assign_sub

all_loss=[]
for step in range(num):with tf.GradientTape() as tape:tape.watch([w1,b1,w2,b2,w3,b3])out3=tf.nn.softmax(tf.nn.relu(tf.nn.relu(x_train@w1+b1)@w2+b2)@w3+b3)loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_train, logits=out3, axis=-1))all_loss.append(loss)grads=tape.gradient(loss,[w1,b1,w2,b2,w3,b3])#更新参数w1.assign_sub(lr*grads[0])b1.assign_sub(lr*grads[1])w2.assign_sub(lr*grads[2])b2.assign_sub(lr*grads[3])w3.assign_sub(lr*grads[4])b3.assign_sub(lr*grads[5])#输出if step%100==0:print(step,'loss:',float(loss))

plt.plot(all_loss)

测试模型

x_test=tf.convert_to_tensor(x_test,dtype=tf.float32)/255
y_test=tf.convert_to_tensor(y_test,dtype=tf.int32)
x_test=tf.reshape(x_test,[-1,28*28])
x_test.shape

TensorShape([10000, 784])

out3=tf.nn.softmax(tf.nn.relu(tf.nn.relu(x_test@w1+b1)@w2+b2)@w3+b3)
out3

这里我们要对out3预测出来的概率结果取最大值

#用argmax函数
y_predict=tf.math.argmax(out3,axis=-1)y_predict,y_test

#这里看到预测值与真实值的数据类型不一样,所以后面一定会报错,所以强制改的一样了
y_test=tf.cast(y_test,tf.int64)y_c=tf.math.equal(y_predict,y_test)
y_c=tf.cast(y_c,tf.int64)
y_c

<tf.Tensor: id=2071859, shape=(10000,), dtype=int64, numpy=array([0, 1, 1, …, 1, 0, 1], dtype=int64)>

acc=tf.math.reduce_sum(y_c)/len(y_test)
acc.numpy()

0.8277

这里我们用的是所有的进行更新,每次使用60000张,速度太慢,我们可以使用小批量随机梯度下降法来改变

#利用batch size
batchDataset=tf.data.Dataset.from_tensor_slices((x_train,y_train)).batch(128)
#构造一个训练集的迭代器
train_iter=iter(batchDataset)
sample=next(train_iter)
sample[0].shape,sample[1].shape

前馈神经网络对mnist数据集实战相关推荐

  1. 基于Python实现的神经网络分类MNIST数据集

    神经网络分类MNIST数据集 目录 神经网络分类MNIST数据集 1 一 .问题背景 1 1.1 神经网络简介 1 前馈神经网络模型: 1 1.2 MINST 数据说明 4 1.3 TensorFlo ...

  2. 二隐层的神经网络实现MNIST数据集分类

    二隐层的神经网络实现MNIST数据集分类 传统的人工神经网络包含三部分,输入层.隐藏层和输出层.对于一个神经网络模型的确定需要考虑以下几个方面: 隐藏层的层数以及各层的神经元数量 各层激活函数的选择 ...

  3. Python实现bp神经网络识别MNIST数据集

    title: "Python实现bp神经网络识别MNIST数据集" date: 2018-06-18T14:01:49+08:00 tags: [""] cat ...

  4. [转载] 卷积神经网络做mnist数据集识别

    参考链接: 卷积神经网络在mnist数据集上的应用 Python TensorFlow是一个非常强大的用来做大规模数值计算的库.其所擅长的任务之一就是实现以及训练深度神经网络. 在本教程中,我们将学到 ...

  5. 神经网络——实现MNIST数据集的手写数字识别

    由于官网下载手写数字的数据集较慢,因此提供便捷下载地址如下 手写数字的数据集MNIST下载:https://download.csdn.net/download/gaoyu1253401563/108 ...

  6. 深度学习基础: BP神经网络训练MNIST数据集

    BP 神经网络训练MNIST数据集 不用任何深度学习框架,一起写一个神经网络训练MNIST数据集 本文试图让您通过手写一个简单的demo来讨论 1. 导包 import numpy as np imp ...

  7. 基于Python实现的卷积神经网络分类MNIST数据集

    卷积神经网络分类MNIST数据集 目录 人工智能第七次实验报告 1 卷积神经网络分类MNIST数据集 1 一 .问题背景 1 1.1 卷积和卷积核 1 1.2 卷积神经网络简介 2 1.3 卷积神经网 ...

  8. 机器学习实战10-Artificial Neural Networks人工神经网络简介(mnist数据集)

    目录 一.感知器 1.1.单层感知器 1.2.多层感知器MLP与反向传播 二.用 TensorFlow 高级 API 训练 MLP DNNClassifier(深度神经网络分类器) 2.1.初始化: ...

  9. 深度学习之利用TensorFlow实现简单的卷积神经网络(MNIST数据集)

    卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习 ...

最新文章

  1. [Android] Android统计Apk , jar包方法数
  2. 2009.12.9.工作日记
  3. mysql避免死锁的方法
  4. CCF201703-2 学生排队(100分)
  5. Linux Shell编程参考大全
  6. 查看dll是32还是64
  7. 四川大学计算机学院 学术委员会,学术委员会完整列表
  8. javaScript点击鼠标改变背景颜色
  9. android sim卡pin,如何设置手机的SIM卡的PIN码?
  10. html制作日程安排,如何制作一个Web日程安排表?
  11. 2020年408真题_2020年港澳台联考真题——地理!
  12. python读二进制文件
  13. playhome的php文件怎么导入,PLAY HOME家族崩坏Importor模型导入插
  14. 学习强国-为中华崛起而学习
  15. Web前端-网站首页和注册界面的实现
  16. NB-IoT低功耗技术与寻呼
  17. openwrt的UCI 网络配置与Luci在线安装
  18. Java实现 蓝桥杯VIP 算法训练 平方计算
  19. 推荐4款非常实用的电脑软件
  20. 怎样借助Python爬虫给宝宝起个好名字--python 学习

热门文章

  1. django3,vue前后端分离数据请求
  2. mysql 进阶到高级_MySQL 高级(进阶) SQL 语句精讲(一)
  3. mycat 分布式mysql_MySQL 部署分布式架构 MyCAT (五)
  4. python黑色背景白色背景_用Python去除图像的黑色或白色背景实例
  5. 940mx黑苹果驱动_让黑苹果变得更完美——BCM94532HMB无线蓝牙接力完美驱动!
  6. PostgreSQL从未授权到高权限命令执行
  7. Java实验9 T5. 给当前的类文件添加行号拷贝到txt文件
  8. 数字公式识别的学习笔记
  9. Python——print()函数的学习笔记
  10. Python3.x中数据随机重排基本方法