关于入门深度学习mnist数据集前向计算的记录
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图像识别的学习,收获还是很不错的,不过还有一些知识希望在之后的学习中进行计算理解。还挺开心的学这个东西,挺有意思的哈哈。
关于入门深度学习mnist数据集前向计算的记录的更多相关文章
- (转)零基础入门深度学习(6) - 长短时记忆网络(LSTM)
无论即将到来的是大数据时代还是人工智能时代,亦或是传统行业使用人工智能在云上处理大数据的时代,作为一个有理想有追求的程序员,不懂深度学习(Deep Learning)这个超热的技术,会不会感觉马上就o ...
- 问题集录--新手入门深度学习,选择TensorFlow 好吗?
新手入门深度学习,选择 TensorFlow 有哪些益处? 佟达:首先,对于新手来说,TensorFlow的环境配置包装得真心非常好.相较之下,安装Caffe要痛苦的多,如果还要再CUDA环境下配合O ...
- [源码解析] 深度学习流水线并行 PipeDream(2)--- 计算分区
[源码解析] 深度学习流水线并行 PipeDream(2)--- 计算分区 目录 [源码解析] 深度学习流水线并行 PipeDream(2)--- 计算分区 0x00 摘要 0x01 前言 1.1 P ...
- 深度学习常用数据集 API(包括 Fashion MNIST)
基准数据集 深度学习中经常会使用一些基准数据集进行一些测试.其中 MNIST, Cifar 10, cifar100, Fashion-MNIST 数据集常常被人们拿来当作练手的数据集.为了方便,诸如 ...
- Recorder︱深度学习小数据集表现、优化(Active Learning)、标注集网络获取
一.深度学习在小数据集的表现 深度学习在小数据集情况下获得好效果,可以从两个角度去解决: 1.降低偏差,图像平移等操作 2.降低方差,dropout.随机梯度下降 先来看看深度学习在小数据集上表现的具 ...
- Python3读取深度学习CIFAR-10数据集出现的若干问题解决
今天在看网上的视频学习深度学习的时候,用到了CIFAR-10数据集.当我兴高采烈的运行代码时,却发现了一些错误: # -*- coding: utf-8 -*- import pickle as p ...
- 深度学习-mnist手写体识别
mnist手写体识别 Mnist数据集可以从官网下载,网址: http://yann.lecun.com/exdb/mnist/ 下载下来的数据集被分成两部分:55000行的训练数据集(mnist.t ...
- 零基础入门深度学习(6) - 长短时记忆网络(LSTM)
代码: def forward(self, x): ''' 根据式1-式6进行前向计算 ''' self.times += 1 # 遗忘门 fg = self.calc_gate(x, self.Wf ...
- mxnet实战系列(一)入门与跑mnist数据集
最近在摸mxnet和tensorflow.两个我都搭起来了.tensorflow跑了不少代码,总的来说用得比较顺畅,文档很丰富,api熟悉熟悉写代码没什么问题. 今天把两个平台做了一下对比.同是跑mn ...
随机推荐
- [HNOI2010]弹飞绵羊 (平衡树,LCT动态树)
题面 题解 因为每个点都只能向后跳到一个唯一的点,但可能不止一个点能跳到后面的某个相同的点, 所以我们把它抽象成一个森林.(思考:为什么是森林而不是树?) 子节点可以跳到父节点,根节点再跳就跳飞了. ...
- 1.1_selenium+Python自动化测试大纲
- PHP8中match新语句的操作方法
PHP8 新出的一个语法很好用,就是 match 语句.match 语句跟原来的 switch 类似,不过比 switch 更加的严格和方便 原来的 switch 语句代码如下: 1 function ...
- KingbaseES 函数稳定性与SQL性能
背景:客户现场的一次艰苦的调优过程(https://www.cnblogs.com/kingbase/p/16015834.html),让我觉得非常有必要让数据库用户了解函数的不同稳定性属性,及其对于 ...
- 生信云实证Vol.12:王者带飞LeDock!开箱即用&一键定位分子库+全流程自动化,3.5小时完成20万分子对接
LeDock是苏黎世大学Zhao HongTao在博士期间开发的一款分子对接软件,专为快速准确地将小分子灵活对接到蛋白质而设计.LeDock优于大部分商业软件,在Astex多样性集合上实现了大于90% ...
- 谣言检测——(GCAN)《GCAN: Graph-aware Co-Attention Networks for Explainable Fake News Detection on Social Media》
论文信息 论文标题:GCAN: Graph-aware Co-Attention Networks for Explainable Fake News Detection on Social Medi ...
- C++程序的内存分布
4.文字常量区: p与p1的指针地址一致,且字符串常量是不能被改变的. 5.程序代码区:存放一系列代码. 动态内存 1.按需分配,根据需要分配内存,不浪费. 内存拷贝函数 void *memcpy(v ...
- Mysqldump 的 的 6 大使用场景的导出命令
Mysqldump 选项解析 场景描述 1. 导出 db1.db2 两个数据库的所有数据. mysqldump -uroot -p -P8635 -h192.168.0.199 --hex-blob ...
- 在云原生中监控JVM指标
一般 Java 集成 Prometheus 监控指标有两种方式.一种是依赖中引入,另外一种是通过agent执行. 依赖引入 <!-- The client --> <dependen ...
- MHA架构的实现方式
转载自:https://www.linuxprobe.com/centos7-mha-mysql5.html 安装mysql5.7,并配置好主从复制 第一:安装mysql57,并关闭防火墙 yum i ...