tensorflow2.0(一)----多层感知机(MLP)

2023-11-12

在TensorFlow 1.X版本中,调用tf.enable_eager_execution()函数启动Eager Execution模式。则需要调用tf.compat.v1.disable_eager_execution()函数)张量流使用张量(张量)作为数据的基本单元。

自动求导机制
对y = x*x的导数

import tensorflow as tf
x = tf.Variable(initial_value=3.)
with tf.GradientTape() as tape: # 在 tf.GradientTape() 的上下文内,所有计算步骤都会被记录以用于求导
	y = tf.square(x)
y_grad = tape.gradient(y, x) # 计算y关于x的导数
print([y, y_grad])

x 是一个初始化为3的 变量 (Variable),使用 tf.Variable() 声明。与普通张量一样,变量同样具有形状、类型和值三种属性。使用变量需要有一个初始化过程,可以通过在tf.Variable() 中指定initial_value 参数来指定初始值。变量与普通张量的一个重要区别是其默认能够被TensorFlow的自动求导机制所求导,因此往往被用于定义机器学习模型的参数。tf.GradientTape() 是一个自动求导的记录器,在其中的变量和计算步骤都会被自动记录。在上面的示例中,变量 x 和计算步骤 y = tf.square(x) 被自动记录,因此可以通过 y_grad =tape.gradient(y, x) 求张量 y 对变量 x 的导数。在机器学习中,更加常见的是对多元函数求偏导数,以及对向量或矩阵的求导。以下代码是如何使用 tf.GradientTape() 计算函数的偏导数。

x = tf.constant([[1., 2.], [3., 4.]])
y = tf.constant([[1.], [2.]])
w = tf.Variable(initial_value=[[1.], [2.]])
b = tf.Variable(initial_value=1.)
with tf.GradientTape() as tape:
	L = 0.5 * tf.reduce_sum(tf.square(tf.matmul(x, w) + b - y))
w_grad, b_grad = tape.gradient(L, [w, b]) # 计算L(w, b)关于w, b的偏导数
print([L.numpy(),w_grad.numpy(),b_grad.numpy])

numpy下线性回归:

a, b = 0, 0
num_epoch = 10000
learning_rate = 1e-3
for e in range(num_epoch):
# 手动计算损失函数关于自变量(模型参数)的梯度
y_pred = a * X + b
grad_a, grad_b = (y_pred - y).dot(X), (y_pred - y).sum()
# 更新参数
a, b = a - learning_rate * grad_a, b - learning_rate * grad_b
print(a, b)

tensorflow下的线性回归

import tensorflow as tf
x = tf.constant(x)
y = tf.constant(y)

a = tf.Variable(initial_value=0.)
b = tf.Variable(initial_value=0.)
variables = [a,b]

num_epoch = 10000
optimizer = tf.keras.optimizers.SGD(learning_rate = 0.0003)
for e in range(num_epoch):
	# 使用tf.GradientTape()记录损失函数的梯度
	with tf.GradientTape() as tape:
		y_pred = a * x + b
		loss = 0.5 * tf.reduce_sum(tf.square(y_pred - y)) # 损失函数
	grads = tape.gradient(loss, variables) # 求偏导
	optimizer.apply_gradients(grads_and_vars = zip(grads, variables)) # 优化器
print(a, b)

使用tf.keras.optimizers.SGD(learning_rate=1e-3) 声明了一个梯度下降 优化器 (Optimizer)。优化器可以帮助我们根据计算出的求导结果更新模型参数,从而最小化某个特定的损失函数,具体使用方式是调用其 apply_gradients() 方法。 optimizer.apply_gradients() 需要提供参数 grads_and_vars ,即待更新的变量(如上述代码中的 variables )及损失函数关于这些变量的偏导数(如上述代码中的grads )。这里需要传入一个Python列表(List),列表中的每个元素是一个 (变量的偏导数,变量)对。比如这里是 [(grad_a, a), (grad_b, b)] 。我们通过 grads = tape.gradient(loss,variables) 求出tape中记录的 loss 关于 variables = [a, b] 中每个变量的偏导数,也就是grads = [grad_a, grad_b] ,再使用Python的 zip() 函数将 grads = [grad_a, grad_b] 和variables = [a, b] 拼装在一起,就可以组合出所需的参数了。

自定义模型类

在实际中使用实例化的模型类model = Modle 代替y = a * x +b ,然后使用y_pred = model(x)调用模型,并使用model.variables获取模型参数

tensorflow模型建立和训练,模型(model)和层(layer)

'''
模型类
'''
class MyModel(tf.keras.Model):
	def __init__(self):
		super().__init__()   # python2中 super(MyModel,self).__init__()
		# 此处添加初始代码(包含call方法中会用到的层),例如
		# layer1 = tf.keras.layers.BuiltInLayer(...)
		# layer2 = MyCustomLayer()

	def call(self,input):
		# 此处添加模型调用的代码(处理输入并返回输出),例如
		# x = layer1(input)
		# output = layer2(x)

	# 还可以添加自定义的函数
		

将上面线性模型y_pred = a * x + b ,以模型类的方式编写:

import tensorflow as tf

x = tf.constant([[1.0,2.0,3.0],[4.0,5.0,6.0]])
y = tf.constant([[10.0],[20.0]])

class Linear(tf.keras.Model):
	def __init__(self):
		super().__init__()
		self.dense = tf.keras.layer.Dence(
			units = 1,
			activation=None,
			kernel_initializer=tf.zeors_initializer(),
			bias_initializer=tf.zeros_initializer(),
		)
	def call(self,input):
		output = self.dense(input)

		return output = 

model = Linear()
optimizer = tf.keras.optimizers.SGD(learning_rate=0.01)
for i in range(100):
	with tf.GradieneTape() as tape:
		y_pred = model(x)    # 全连接层(不激活时)相当于线性变换
		loss = tf.reduce_mean(tf.square(y_pred - y))
	grads = tape.gradient(loss,model.variables) # model.variables获取模型中的所有变量
	optimizer.apply_gradients(grads_and_vars=zip(grads,model.variables))
print(model.variables)

多层感知机(MLP),进行一下步骤:
1、使用 tf.keras,datasets 获取数据集并预处理
2、使用 tf.keras.Model 和 tf.keras.layers 构建模型
3、构建模型训练流程,使用 tf.keras.losses 进行损失函数的计算,并使用 tf.keras.optimizer 优化模型
4、构建模型评估流程,使用 tf.keras.metrics计算评估指标

import tensorflow as tf 

'''
加载数据
'''

class MNISTLoader():
	def __init__(self):
		mnist = tf.keras.datasets.mnist # 自动从网上加载数据
		(self.train_data,self.train_label),(self.test_train,self.test_label) = mnist.load_data()
		# MNIST中的图像默认为unit8(0-255)。下面将其归一化,并在最后加一维作为颜色通道
		self.train_data = np.expand_dims(self.train_data.astype(np.float32) / 255.0,axis = -1)
		# [60000,28,28,1],np.expand_dims()添加一维通道
		self.test_data = np.expand_dims(self.test_data.astype(np.float32) / 255.0,axis = -1)
		# [10000,28,28,1]
		self.train_label = self.train_label.astype(np.int32) 
		self.test_label = self.test_label.astype(np.int32)
		self.num_train_data,self_num_test_data = self.train_data.shape[0],self.test_data.shape[0]
	
	def get_batch(self,batch_size):
		# 从数据中随机取出batch_size个元素并返回
		index = np.random.randint(0,np.shape(self.train_data)[0],batch_size)
		return self.train_data[index,:],self.train_label[index]

'''
模型构建:tf.keras.Model 和 tf.keras.Layer
'''
class MLP(tf.keras.Model):
	def __init__(self):
		super().__init__:
		self.flatten = tf.keras.layers.Flatten() # 将除第一维(batch_size以外的维度展平
		self.dense1 = tf.keras.layers.Dense(units=100,activation=tf.nn.relu)
		self.dense2 = tf.keras.layers.Dense(units=10)
	
	def call(self,inputs):            # [batch_size,28,28,1]
		x = self.flatten(inputs)      # [batch_size,784]
		x = self.dense1(x)            # [batch_size,100]
		x = self.dense2(x)            # [batch_size,10]
		output = tf.nn.softmax(x)

'''
模型训练:tf.keras.losses 和 tf.keras.optimizer
'''
num_epochs = 5
batch_size = 50
learning_rate = 0.001
model = MLP()
data_loader = MNISTLoader()
optimizer = tf.keras.optimizers.Adam(learning_rate)

num_batches = int(data_loader.num_train_data // batch_size * num_epochs)
for batch_index in range(num_batches):
	x,y = data_loader.get_batch(batch_size)
	with tf.GradieneTape() as tape:
		y_pred = model(x)
		loss = tf.keras.losses.sparse_categorical_crossentropy(y_true=y,y_pred=y_pred)
		print("batch &d:loss %f" % (batch_index.loss.numpy()))
	grads = tape.gradient(loss,model.variables)
	optimizer.apply_gradients(grads_and_vars=zip(grads,model.variables))

'''
模型评估:tf.keras.metrics
'''
sparse_categorical_accuracy = tf.keras.metrics.SparseCategoricalAccuracy()
num_batches = int(data_losder.num_test_data // batch_size)
for batch_index in range(num_batches):
	start_index,end_index = batch_index *batch_size,(batch_index + 1* batch_size 
	y_pred = model.predict(data_loader.test_data [START_INDEX:END_INDEX])
	sparse_categorical_accuracy.update_state(y_ture = data_loader.test_label[start_index:
	end_index],y_pred=y_pred)
	print("test accuracy: %f" % sparse_categorical_accuracy.result())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

tensorflow2.0(一)----多层感知机(MLP) 的相关文章

随机推荐

  • 一文看尽深度学习中的15种损失函数

    转自 https zhuanlan zhihu com p 377799012 在机器学习中 损失函数是代价函数的一部分 而代价函数则是目标函数的一种类型 1 Loss function 即损失函数 用于定义单个训练样本与真实值之间的误差
  • 解决PL/SQL 8 ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务的问题

    今天晚上貌似遇到的ORACLE11G问题特别多 不过还好 几经尝试 都在网上找到了答案并解决了这些问题 留个备份 PL SQL Developer工具在连oracle11g的时候 碰到了这个问题 ORA 12514 TNS 监听程序当前无法
  • 【C语言数据结构】带头节点与不带头节点的单链表头插法对比

    前言 近期在学习STM32代码框架的过程中 老师使用链表来注册设备 发现使用了不带头节点的单链表 注册时使用头插法 之前在本专题整理学习过带头节点的单链表 因此本文整理对比一下两种方式的头插法区别 具体实现在次 重点在于用以理解两种思路 以
  • Apikit 自学日记:API 异常监控-创建 API 监控

    如何在apikit中 创建 API 监控呢 创建并开启监控API 一 手动创建监控API Eolink API 网络监控平台支持从 Eolink API Management API管理产品 中导入API信息 或者手动创建监控API 进入A
  • (杭电多校)2023“钉耙编程”中国大学生算法设计超级联赛(3)

    1005 Out of Control 先将序列a升序 然后离散化 比如说序列a为1000 1000 500 200 10 然后升序后为10 200 500 1000 1000 映射到从1开始的数 为1 2 3 4 4 此即为前缀最大值序列
  • Flask 学习-70.Flask-RESTX 注册接口实例

    前言 注册接口主要是密码需要加密 用到werkzeug security 模块的2个方法generate password hash check password hash 数据库操作用到Flask SQLAlchemy 相关的基础配置就不
  • 如何利用路由器连接wifi并将wifi网络分发出去

    有时候 我们的wifi网络设置了最大连接数 该数字小于我们的需求数 我们可以考虑利用路由器来进一步分发wifi网络 下面以tp link的产品为例介绍如何分发网络 1 开启路由器 让其发出广播信号 2 使用电脑无线功能连接该路由器 登录路由
  • Vue项目this.$router.push()找不到push问题

    在使用Vue cli开发项目时 我喜欢使用Es6语法 但在使用语法跳路由时却会受到报错 因为Es6的箭头函数的this指向的是最近的一个this 而不是全局的 所以会造成找不到路由方法的问题 解决方法 使用传统语法 XXX function
  • 7-4 多态练习-计算面积

    定义三个类 父类 抽象类 GeometricObject代表几何形状 子类Circle代表圆形 子类Rectangle代表矩形 具体属性和方法如下 父类 抽象类 GeometricObject 属性 private String color
  • 华硕主板BIOS设置虚拟化技(virtualization technology)

    华硕主板BIOS设置虚拟化技 virtualization technology 背景 环境介绍 win安装docker介绍 bios虚拟技术是否开启检查 虚拟技术开启 打开bios设置 虚拟技术设置 参考文献 背景 从2013开始 doc
  • A,NS,cname,forward,txt,aaaa记录讲解

    最近刚好处理DNS问题比较多 对DNS复习一下基础知识 在DNS域名解析中 记录存在很多种 例如主要的A记录 NS记录 CNAME记录 FORWARD记录 还有X记录等等 现在就对它们的区别与联系做总结 1 A记录 A记录又称IP指向 用户
  • 前端面试题总结带答案(持续更新)

    Vue面试题 1 什么是 vue 生命周期 Vue 实例从创建到销毁的过程 就是生命周期 也就是从开始创建 初始化数据 编译模板 挂载Dom 渲染 更新 渲染 卸载等一系列过程 我们称这是 Vue 的生命周期 它可以总共分为8个阶段 创建前
  • 音乐铃声解析提取API接口

    接口地址 https api hackeus cn api kgring 请求协议 HTTP HTTPS 请求方式 GET POST 返回格式 JSON 请求示例 https api hackeus cn api kgring api ke
  • intellij IDEA中我一运行程序,就提示我edit configuration

    因为你直接使用open来打开别人的项目 所以有问题 正确方法 重新打开intellij界面 使用import来导入别人的项目
  • [UnityShader入门精要读书笔记]06.顶点/片元着色器基本结构

    Unity Shader基本结构包含Shader Properties SubShader FallBack等语义块 结构如下 Shader MyShaderName Properties 属性 SubShader 针对显卡A的SubSha
  • GoWeb——处理XML文件

    目录 处理XML文件 1 解析XML文件 2 生成XML文件 处理XML文件 XML eXtensible Markup Language 可扩展标记语言 是一种数据表示格式 可以描述非常复杂的数据结构 常用于传输和存储数据 1 解析XML
  • x86 calling conventions

    原文地址 http en wikipedia org wiki X86 calling conventions x86 calling conventions From Wikipedia the free encyclopedia Thi
  • 无监督分类的4种方法

    1 等宽法 类似于制作频数分布图 将属性分布值分为几个等分的分布区间 2 等频法 将相同数量的记录放入每个区间 3 基于聚类的分析方法 将属性按照K means算法进行聚类 然后根据聚类的分类 将同一聚类的记录合并到同一组内 4 模拟退火法
  • mysql 修改 sql model_mysql 开发基础系列22 SQL Model(带迁移事项)

    一 概述 与其它数据库不同 mysql 可以运行不同的sql model 下 sql model 定义了mysql应用支持的sql语法 数据校验等 这样更容易在不同的环境中使用mysql sql model 常用来解决下面几类问题 1 通过
  • tensorflow2.0(一)----多层感知机(MLP)

    在TensorFlow 1 X版本中 调用tf enable eager execution 函数启动Eager Execution模式 则需要调用tf compat v1 disable eager execution 函数 张量流使用张