文章目录

# 将无关信息屏蔽掉
import os
# 取值有四个:0,1,2,3,分别对应INFO,WARNING,ERROR,FATAL
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import datasets# 加载数据集 x:[60k,28,28]  y:[60k]
(x, y), (x_test,y_test) = datasets.mnist.load_data()
# x: [0~255] => [0~1.]
x = tf.convert_to_tensor(x, dtype=tf.float32) / 255
y = tf.convert_to_tensor(y, dtype=tf.int32)x_test = tf.convert_to_tensor(x_test, dtype=tf.float32) / 255
y_test = tf.convert_to_tensor(y_test, 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))# from_tensor_slices表示切分传入Tensor的第一个维度,生成相应的dataset
train_db = tf.data.Dataset.from_tensor_slices((x,y)).batch(128)
test_db = tf.data.Dataset.from_tensor_slices((x_test,y_test)).batch(128)train_iter = iter(train_db)
test_iter = iter(test_db)sample = next(train_iter)
print('batch:', sample[0].shape, sample[1].shape)      # batch: (128, 28, 28) (128,)# 构建权值
# X: [b,784] => [b,256] => [b,128] => [b,10]
# W: [dim_in,dim_out]   b: [dim_out]
# truncated_normal表示正态分布,设置为均值为0,方差为0.1的范围,可解决梯度爆炸与梯度离散的情况
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]))lr = 1e-3
for epoch in range(100):         # 迭代整个数据集,一般次数越多,准确率越高for step, (x, y) in enumerate(train_db):        # for every batch# x:[128,28,28]  y:[128]# [b,28,28] => [b,28*28]x = tf.reshape(x, [-1, 28*28])# 求梯度# GradientTape默认只会跟踪类型为tf.Variablewith tf.GradientTape() as tape:# 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 = h1 @ w2 + b2h2 = 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: scalarloss = tf.reduce_mean(loss)# 计算梯度,返回对应的梯度列表grads = tape.gradient(loss, [w1, b1, w2, b2, w3, b3])# print(grads)# 更新可训练参数# w1.assign_sub表示原地更新,保持tf.Variablew1.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(epoch,step, 'loss', float(loss))# test/evluation# [w1,b1,w2,b2,w3,b3]total_correct,total_num = 0,0for step,(x,y) in enumerate(test_db):# x:[b,28,28]-->[b,28*28]x = tf.reshape(x,[-1,28*28])# [b,784] => [b,256] => [b,128] => [b,10]h1 = tf.nn.relu(x@w1 + b1)h2 = tf.nn.relu(h1@w2 + b2)out = h2@w3 + b3# out:[b,10](R) --> [b,10](0,1)prob = tf.nn.softmax(out,axis=1)# [b,10] -> [b]  取出最大值所在的索引pred = tf.argmax(prob,axis=1)pred = tf.cast(pred,dtype=tf.int32)# y--> int32correct = tf.cast(tf.equal(pred,y),dtype=tf.int32)correct = tf.reduce_sum(correct)total_correct += int(correct)total_num += x.shape[0]# 准确率acc = total_correct / total_numprint('准确率=',acc)
97 0 loss 0.040837474167346954
97 100 loss 0.04371170699596405
97 200 loss 0.039664216339588165
97 300 loss 0.040850065648555756
97 400 loss 0.04408892244100571
准确率= 0.8363
98 0 loss 0.040709733963012695
98 100 loss 0.04357054457068443
98 200 loss 0.03953211382031441
98 300 loss 0.04072430729866028
98 400 loss 0.04395816847681999
准确率= 0.837
99 0 loss 0.04058240354061127
99 100 loss 0.04343107342720032
99 200 loss 0.03940089792013168
99 300 loss 0.040600381791591644
99 400 loss 0.043828316032886505
准确率= 0.8376

深度学习2.0-13.神经网络与全连接层之张量实战相关推荐

  1. 深度学习(22)神经网络与全连接层五: 误差计算

    深度学习(22)神经网络与全连接层五: 误差计算 1. MSE 2. Entropy(熵) 3. Cross Entropy 4. Binary Classification 5. Single ou ...

  2. 深度学习(21)神经网络与全连接层四: 输出方式

    深度学习(21)神经网络与全连接层四: 输出方式 1. y∈Rdy∈R^dy∈Rd 2. yi∈[0,1]y_i∈[0,1]yi​∈[0,1] 3. sigmoid函数 (1) 目的 (2) tf.s ...

  3. 深度学习(19)神经网络与全连接层二: 测试(张量)实战

    深度学习(19)神经网络与全连接层二: 测试(张量)实战 1. 传入测试集数据 2. 数据类型转换 3. 创建test_db 4. test/evluation 5. 创建神经网络 6. 输出 7. ...

  4. 深度学习(18)神经网络与全连接层一: 数据加载

    深度学习(18)神经网络与全连接层一: 数据加载 1. 常用数据集 2. MNIST数据集 (1) MNIST样本 (2) MNIST加载案例 3. CIFAR10/100 (1) CIFAR10/1 ...

  5. 卷积层和全连接层的区别_卷积神经网络中全连接层作用理解总结

    前言 一般来说,卷积神经网络会有三种类型的隐藏层--卷积层.池化层.全连接层.卷积层和池化层比较好理解,主要很多教程也会解释. •  卷积层(Convolutional layer)主要是用一个采样器 ...

  6. (15)tensorflow全连接层的张量实现

    全连接层的张量实现----单层神经网络的实现 定义好权值张量

  7. 神经网络学习(二)Tensorflow-简单神经网络(全连接层神经网络)实现手写字体识别

    神经网络学习(二)神经网络-手写字体识别 框架:Tensorflow 1.10.0 数据集:mnist数据集 策略:交叉熵损失 优化:梯度下降 五个模块:拿数据.搭网络.求损失.优化损失.算准确率 一 ...

  8. Python学习笔记--pytorch--随机梯度下降、神经网络与全连接层

    随机梯度下降 是一个向量,代表函数在某一个点增长的方向,模代表了在该点增长的速率 影响搜索过程的因素: 初始状态,学习率,动量 激活函数 1.torch.sigmoid (0,1) a=torch.l ...

  9. 深度学习之CNN卷积神经网络详解以及猫狗识别实战

    文章目录 CNN 解决了什么问题? 需要处理的数据量太大 图像简单数字化无法保留图像特征 CNN核心思想 局部感知 参数共享 卷积神经网络-CNN 的基本原理 卷积--提取特征 池化层(下采样)--数 ...

  10. 神经网络学习笔记(一):全连接层的作用是什么?

    以下是我看过最好的全连接层的解释! 原文链接:卷积神经网络(CNN)入门讲解关注专栏 以上图为例,我们仔细看上图全连接层的结构,全连接层中的每一层是由许多神经元组成的(1 × 4096)的平铺结构,上 ...

最新文章

  1. 爬虫核心原理:一次 HTTP 请求到底是如何完成的?
  2. python赋值语句的一般格式为_Python 基础语法
  3. android cmd 右键菜单不见了,为Windows右键菜单提供打开命令行选项
  4. 什么是OOM,为什么会OOM及一些解决方法
  5. 【数据结构与算法】之深入解析“求根节点到叶节点数字之和”的求解思路与算法示例
  6. linux平滑升级nginx,Nginx的平滑重启和平滑升级,nginx
  7. 简化从Win32到Windows 10的迁移之路
  8. java web中整合mq_spring-web 集成 rabbitmq
  9. php接口三结构,grape动态PHP结构(三)——API接口
  10. Objective-c 中 nil, Nil, NULL和NSNull的区别
  11. #define、typedef与const
  12. Linux Buffers和Cached的区别(转)
  13. Redis缓存相关问题总结
  14. VC2015搭建OpenCV环境(超详细教程)
  15. dts音效大师安卓版_dts音效大师
  16. 合作动态 | 方正璞华与日立签订战略合作协议,加快推进数字化管理变革!
  17. 强大的web打印插件--Lodop
  18. C语言课程设计服装店,《C语言程序设计》课程设计实验报告-服装网店信息管理系统.doc...
  19. 【干货】Java实习面试经验汇总
  20. iOS 主题色切换(附上源码)

热门文章

  1. 百度云推广~麻烦各位点一下吧
  2. 数据结构学习记录连载1
  3. SQL 和T-SQL学习(一)
  4. java day40【会话技术:Cookie 、会话技术:Session 、JSP:入门学习】
  5. 丢失更新的问题产生和解决
  6. o'Reill的SVG精髓(第二版)学习笔记——第四章
  7. BigDecimal.divide方法
  8. maven项目在eclipse启动报错:java.lang.ClassNotFoundException
  9. Myeclipse中web project各种常见错误及解决方法(持续更新)
  10. Makeflie自动生成依赖,自动化编译