1. 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数据集前向计算的记录的更多相关文章

  1. (转)零基础入门深度学习(6) - 长短时记忆网络(LSTM)

    无论即将到来的是大数据时代还是人工智能时代,亦或是传统行业使用人工智能在云上处理大数据的时代,作为一个有理想有追求的程序员,不懂深度学习(Deep Learning)这个超热的技术,会不会感觉马上就o ...

  2. 问题集录--新手入门深度学习,选择TensorFlow 好吗?

    新手入门深度学习,选择 TensorFlow 有哪些益处? 佟达:首先,对于新手来说,TensorFlow的环境配置包装得真心非常好.相较之下,安装Caffe要痛苦的多,如果还要再CUDA环境下配合O ...

  3. [源码解析] 深度学习流水线并行 PipeDream(2)--- 计算分区

    [源码解析] 深度学习流水线并行 PipeDream(2)--- 计算分区 目录 [源码解析] 深度学习流水线并行 PipeDream(2)--- 计算分区 0x00 摘要 0x01 前言 1.1 P ...

  4. 深度学习常用数据集 API(包括 Fashion MNIST)

    基准数据集 深度学习中经常会使用一些基准数据集进行一些测试.其中 MNIST, Cifar 10, cifar100, Fashion-MNIST 数据集常常被人们拿来当作练手的数据集.为了方便,诸如 ...

  5. Recorder︱深度学习小数据集表现、优化(Active Learning)、标注集网络获取

    一.深度学习在小数据集的表现 深度学习在小数据集情况下获得好效果,可以从两个角度去解决: 1.降低偏差,图像平移等操作 2.降低方差,dropout.随机梯度下降 先来看看深度学习在小数据集上表现的具 ...

  6. Python3读取深度学习CIFAR-10数据集出现的若干问题解决

    今天在看网上的视频学习深度学习的时候,用到了CIFAR-10数据集.当我兴高采烈的运行代码时,却发现了一些错误: # -*- coding: utf-8 -*- import pickle as p ...

  7. 深度学习-mnist手写体识别

    mnist手写体识别 Mnist数据集可以从官网下载,网址: http://yann.lecun.com/exdb/mnist/ 下载下来的数据集被分成两部分:55000行的训练数据集(mnist.t ...

  8. 零基础入门深度学习(6) - 长短时记忆网络(LSTM)

    代码: def forward(self, x): ''' 根据式1-式6进行前向计算 ''' self.times += 1 # 遗忘门 fg = self.calc_gate(x, self.Wf ...

  9. mxnet实战系列(一)入门与跑mnist数据集

    最近在摸mxnet和tensorflow.两个我都搭起来了.tensorflow跑了不少代码,总的来说用得比较顺畅,文档很丰富,api熟悉熟悉写代码没什么问题. 今天把两个平台做了一下对比.同是跑mn ...

随机推荐

  1. Python小游戏——外星人入侵(保姆级教程)第一章 03设置飞船图片 04创建Ship类

    系列文章目录 第一章:武装飞船 03:设置飞船图片 04:创建Ship类--管理飞船行为的类 一.设置飞船图片 1.注意事项 A.将图片设置为位图bmp格式最简单,因为pygame默认加载位图 B.飞 ...

  2. 回溯、贪心、DP的区别和联系

    四大常用算法:分治.贪心.回溯.动态规划 回溯算法是个"万金油".基本上能用跟动态规划.贪心解决的问题,都可以用回溯去解决.回溯算法相当于穷举搜索,穷举所有情况,然后得到最优解.不 ...

  3. 「雅礼集训 2017 Day7」跳蚤王国的宰相(树的重心)

    题面 来源 「 雅 礼 集 训 2017 D a y 7 」 跳 蚤 王 国 的 宰 相   传 统 2000   m s 1024   M i B {\tt「雅礼集训 2017 Day7」跳蚤王国的 ...

  4. 员工离职困扰?来看AI如何解决,基于人力资源分析的 ML 模型构建全方案 ⛵

    作者:韩信子@ShowMeAI 数据分析实战系列:https://www.showmeai.tech/tutorials/40 机器学习实战系列:https://www.showmeai.tech/t ...

  5. 【Android 逆向】ARM while 逆向

    #include <stdio.h> int dowhile(int n){ int i = 1; int s = 0; do{ s += i; }while(i++ < n); r ...

  6. 操作服务器的神奇工具Tmux

    Tmux 是什么? 会话与进程 命令行的典型使用方式是,打开一个终端窗口(terminal window,以下简称"窗口"),在里面输入命令.用户与计算机的这种临时的交互,称为一次 ...

  7. 为开源提 PR

    PR 可让你在 GitHub 上向他人告知你已经推送到存储库中分支的更改. 在 PR 打开后,你可以与协作者讨论并审查潜在更改,在更改合并到基本分支之前添加跟进提交. 为什么 PR 使用 PR 的主要 ...

  8. 好书推荐之Mysql三剑客 :《高性能Mysql》、《Mysql技术内幕》、《数据库索引设计与优化》

    Mysql三剑客系列书籍: 大佬推荐 首先推荐<高性能 MySQL>,这本书是 MySQL 领域的经典之作,拥有广泛的影响力.不但适合数据库管理员(DBA)阅读,也适合开发人员参考学习.不 ...

  9. 分布式安装部署MinIO

    官方文档地址:http://docs.minio.org.cn/docs/master/distributed-minio-quickstart-guide 前提条件:分布式Minio至少需要4个硬盘 ...

  10. Jupyter Notebook单元格加宽的方法3种

    Jupyter Notebook的代码单元格比较窄,在我的屏幕上只占了一半都不到,网络搜索下,共找到3种加宽的方法,总结一下. (一)只改变当前Jupyter笔记本的单元格宽度 在Jupyter No ...