首页 > 其他分享 >关于入门深度学习mnist数据集前向计算的记录

关于入门深度学习mnist数据集前向计算的记录

时间:2022-11-07 21:14:25浏览次数:46  
标签:10 入门 28 lr mnist w1 tf 集前 grads

import os

import lr as lr
import tensorflow as tf
from pyspark.sql.functions import stddev
from tensorflow.keras import datasets

os.environ['TF_CPP_MIN_LOG_LEVEL']='2' #只打印error的信息
(x,y),_=datasets.mnist.load_data()
#x: [60k,28,28]
#y: [60k]

x=tf.convert_to_tensor(x,dtype=tf.float32)/255 #使x的值从0~255降到0~1
y=tf.convert_to_tensor(y,dtype=tf.int32)

print(x.shape,y.shape,x.dtype,y.dtype)
print(tf.reduce_min(x),tf.reduce_max(x))
print(tf.reduce_min(y),tf.reduce_max(y))

train_db=tf.data.Dataset.from_tensor_slices((x,y)).batch(100) #每次从60k中取100张
train_iter=iter(train_db) #迭代器
sample=next(train_iter)
print('batch:',sample[0].shape,sample[1].shape)

#[b,784]=>[b,256]=>[b,128]=>[b,10]
#[dim_in,dim_out],[dim_out]
w1=tf.Variable(tf.random.truncated_normal([784,256],stddev=0.1)) #防止梯度爆炸,需要设定均值和方差的范围,原来是均值为0,方差为1,现在设置方差为0.1
b1=tf.Variable(tf.zeros([256]))
w2=tf.Variable(tf.random.truncated_normal([256,128],stddev=0.1))
b2=tf.Variable(tf.zeros([128]))
w3=tf.Variable(tf.random.truncated_normal([128,10],stddev=0.1))
b3=tf.Variable(tf.zeros([10]))

#h1=x@w1+b1 x指的是之前的一个batch,100个28*28的图片
for epoch in range(10): #对整个数据集进行10次迭代
for step,(x,y) in enumerate(train_db): # x:[100,28,28] y:[100] 对每个batch进行,整体进度
x=tf.reshape(x,[-1,28*28]) #[b,28,28]=>[b,28*28] 维度变换
with tf.GradientTape() as tape: #tf.Variable
h1 = x @ w1 + b1 # [b,784]@[784,256]+[256]=>[b,256]
h1 = tf.nn.relu(h1) # 加入非线性因素
h2 = h1 @ w2 + b2 # [b,256]@[256,128]+[128]=>[b,128]
h2 = tf.nn.relu(h2)
out = h2 @ w3 + b3 # [b,128]@[128,10]+[10]=>[b,10] 前项计算结束

# compute loss
# out:[b,10]
# y:[b]=>[b,10]
y_onehot = tf.one_hot(y, depth=10) #将y one_hot编码为长度为10的一维数组,好与x*w+b的[b,10]进行相减误差运算

# mes=mean(sum(y_onehot-out)^2)
loss = tf.square(y_onehot - out)
# mean:scalar
loss = tf.reduce_mean(loss) #求均值,就是计算100张图片的平均误差
#compute gradient
grads=tape.gradient(loss,[w1,b1,w2,b2,w3,b3]) #loss函数中队w1,b1,w2,b2,w3,b3求导
# print(grads)
#w1=w1-lr*w1_grad 求下一个w1,梯度下降算法
# w1 = w1 - lr * grads[0] #tf.Variable相减之后还是tf.tensor,需要原地更新
# b1 = b1 - lr * grads[1]
# w2 = w2 - lr * grads[2]
# b2 = b2 - lr * grads[3]
# w3 = w3 - lr * grads[4]
# b3 = b3 - lr * grads[5]

lr = 1e-3 #0.001
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])

# print(isinstance(b3, tf.Variable))
# print(isinstance(b3, tf.Tensor))

if step%100==0: #每进行100个batch输出一次
print(epoch,step,loss,float(loss))


#本次学习也算是继续理解线性回归模型,mnist图像识别的学习,收获还是很不错的,不过还有一些知识希望在之后的学习中进行计算理解。还挺开心的学这个东西,挺有意思的哈哈。


标签:10,入门,28,lr,mnist,w1,tf,集前,grads
From: https://www.cnblogs.com/gtb-blog/p/16867462.html

相关文章

  • 搭建一个小巧完备的K8S环境(chrono《kubernetes入门实战课》笔记整理)
     【概念说明】kubernetes,因为k和s之间,有8个字母,所以通常又称为K8S。用来对容器进行调度和管理的,即用来对容器进行编排的。如果只有简单的几个镜像,确实不需要k8s,但是如果......
  • 【python】机器学习算法(KNN)入门——手写数字识别
    前言嗨喽~大家好呀,这里是魔王呐!最近邻(kNearestNeighbors,KNN)算法是一种分类算法1968年由Cover和Hart提出,应用场景有宁符识别、文本分类、图像识别等领域。手......
  • 编写windbg调试器扩展 入门篇1
      我博客的左侧专栏曾经转过windows下编写调试器的一系列文章,这类文章是从零打造调试器,而这篇文章是介绍如何为windbg编写调试器扩展命令。0.前言  windbg的命令......
  • [Linux入门必备]17个案例带运维小白快速精通Awk命令,拿来即用!
    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的......
  • C++入门知识点
        今天我为大家带来的是有关C++入门知识点,总共分为5个小知识点,分别是:命名空间,缺省参数,函数重载,引用和auto关键字(C++11)。在这其中,我们还会穿插将一些知识点,希望大......
  • 4.深度学习(1) --神经网络编程入门
    前言目前深度学习、AI研究很火爆,它们依赖的最底层就是简单的神经网络,本文将介绍神经网络基础,了解基本的神经网络原理,同时给出样例参考,该样例可以推广到其他的分类、回归问题......
  • 〖TensorFlow2.0笔记22〗使用Numpy在MNIST数据集上实现3层BP神经网络!
    使用Numpy在MNIST数据集上实现3层BP神经网络!本文章是TensorFlow2.0学习笔记系列,欢迎关注该,专栏链接:​​TensorFlow2.0学习笔记​​,文章会持续更细,多希望大家点赞收藏......
  • 什么是 Python?Python 基础编程入门指南
    Python是当今最流行的编程语言之一。Python以其简单的语法和多功能性而闻名,既易于学习又可用于高级应用程序。可以使用Python的领域也非常广泛,人工智能、机器学习、Web开......
  • junit 入门实例
    需要在工程中引入junit的jar包,测试sum方法的返回值是否正确,代码如下:packagecom.channelsoft.cmmb.cspapi.webservice;importjunit.framework.TestCase;publicclassT......
  • k8s实战入门——Pod
    PodPod是kubernetes集群进行管理的最小单元,程序要运行必须部署在容器中,而容器必须存在于Pod中。Pod可以认为是容器的封装,一个Pod中可以存在一个或者多个容器。kubernet......