手写数字识别流程
MNIST手写数字集7000*10张图片
60k张图片训练,10k张图片测试
每张图片是28*28,如果是彩色图片是28*28*3-255表示图片的灰度值,0表示纯白,255表示纯黑
打平28*28的矩阵,得到28*28=784的向量
对于b张图片得到[b,784];然后对于b张图片可以给定编码
把上述的普通编码给定成独热编码,但是独热编码都是概率值,并且概率值相加为1,类似于softmax回归
套用线性回归公式
X[b,784] W[784,10] b[10] 得到 [b,10]
高维图片实现非常复杂,一个线性模型无法完成,因此可以添加非线性因子
f(X@W+b),使用激活函数让其非线性化,引出relu函数
1 =relu(X@W1+b1)
H2 = relu(h1@W2+b2)
Out = relu(h2@W3+b3)
第一步,把[1,784]变成[1,512]变成[1,256]变成[1,10]
得到[1,10]后将结果进行独热编码
使用欧氏距离或者使用mse进行误差度量
[1,784]通过三层网络输出一个[1,10]
# [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))
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]))
# learning rate
lr = 1e-3
for epoch in range(10):  # iterate db for 10
# tranin every train_db
for step, (x, y) in enumerate(train_db):
# x: [128,28,28]
# y: [128]
# [b,28,28] ==> [b,28*28]
x = tf.reshape(x, [-1, 28*28])
with tf.GradientTape() as tape: # only data types of tf.variable are logged
# x: [b,28*28]
# h1 = x@w1 + b1
# [b,784]@[784,256]+[256] ==> [b,256] + [256] ==> [b,256] + [b,256]
h1 = x @ w1 + tf.broadcast_to(b1, [x.shape[0], 256])
h1 = tf.nn.relu(h1)
# [b,256] ==> [b,128]
# h2 = x@w2 + b2 # b2 can broadcast automatic
h2 = h1 @ w2 + b2
h2 = tf.nn.relu(h2)
# [b,128] ==> [b,10]
out = h2 @ w3 + b3
# compute loss
# out: [b,10]
# y:[b] ==> [b,10]
y_onehot = tf.one_hot(y, depth=10)
# mse = mean(sum(y-out)^2)
# [b,10]
loss = tf.square(y_onehot - out)
# mean:scalar
loss = tf.reduce_mean(loss)
# compute gradients
grads = tape.gradient(loss, [w1, b1, w2, b2, w3, b3])
# w1 = w1 - lr * w1_grad
# w1 = w1 - lr * grads[0] # not in situ update
# in situ update
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(f'epoch:{epoch}, step: {step}, loss:{float(loss)}')

吴裕雄--天生自然TensorFlow2教程:前向传播(张量)- 实战的更多相关文章

  1. 吴裕雄--天生自然TensorFlow2教程:反向传播算法

  2. 吴裕雄--天生自然TensorFlow2教程:测试(张量)- 实战

    import tensorflow as tf from tensorflow import keras from tensorflow.keras import datasets import os ...

  3. 吴裕雄--天生自然TensorFlow2教程:张量排序

    import tensorflow as tf a = tf.random.shuffle(tf.range(5)) a tf.sort(a, direction='DESCENDING') # 返回 ...

  4. 吴裕雄--天生自然TensorFlow2教程:Broadcasting

    Broadcasting可以理解成把维度分成大维度和小维度,小维度较为具体,大维度更加抽象.也就是小维度针对某个示例,然后让这个示例通用语大维度. import tensorflow as tf x ...

  5. 吴裕雄--天生自然TensorFlow2教程:维度变换

    图片视图 [b, 28, 28] # 保存b张图片,28行,28列(保存数据一般行优先),图片的数据没有被破坏 [b, 28*28] # 保存b张图片,不考虑图片的行和列,只保存图片的数据,不关注图片 ...

  6. 吴裕雄--天生自然TensorFlow2教程:手写数字问题实战

    import tensorflow as tf from tensorflow import keras from keras import Sequential,datasets, layers, ...

  7. 吴裕雄--天生自然TensorFlow2教程:函数优化实战

    import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D def himme ...

  8. 吴裕雄--天生自然TensorFlow2教程:链式法则

    import tensorflow as tf x = tf.constant(1.) w1 = tf.constant(2.) b1 = tf.constant(1.) w2 = tf.consta ...

  9. 吴裕雄--天生自然TensorFlow2教程:多输出感知机及其梯度

    import tensorflow as tf x = tf.random.normal([2, 4]) w = tf.random.normal([4, 3]) b = tf.zeros([3]) ...

随机推荐

  1. pom.xml报unknown error

    1. 从https://start.spring.io/的spring initializr生成demo,使用默认的2.1.6.release(2019年7月10日) 2. 在eclipse加载后,p ...

  2. 2020/2/22 74cms3.5.1 代码审计

    0x00 网站结构 简单试了一下.每一个模块还是比较清楚的,分别对应网站的一个模块.还有一些没有权限访问 0x01 通读代码 先看入口文件,index.php 开头先对网站是否安装做了判断 然后就是判 ...

  3. Linux学习《第五章 用户身份与文件权限》

  4. CSS - input 只显示下边框

      CSS 样式 :   border:none;   border-bottom: 1px solid #000

  5. jquery隐藏表格的某列

    $('#tableId tr').find('th:eq(3)').hide(); ---------------------------------------------------------- ...

  6. tools.eclipse.内存配置

    环境:jdk1.7+eclipse luna 选择:Run ->Run Configurations, 在弹出框右侧中选择Arguments, 在VM arguments最后加入 -Xms256 ...

  7. Spring 控制反转容器(Inversion of Control – IOC)

    系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of Contro ...

  8. ACM-售货员难题

    题目描述:售货员的难题  某乡有n个村庄(1< n < 20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0 < s < 1000)是已知的,且A村到B村与B村到 ...

  9. 一、VIP课程:互联网工程专题 05-快速掌握Jenkins原理与核心功能

    第五课:快速掌握jenkins核心功能.docx 2.164 (2019-02) and newer: Java 8 or Java 11 一.jenkins 概述与环境配置 知识点: 关于可持续化集 ...

  10. P 1030 完美数列

    转跳点: