对比PyTorch和TensorFlow的自动差异和动态子类化模型

本文涉及的产品
模型训练 PAI-DLC,5000CU*H 3个月
交互式建模 PAI-DSW,每月250计算时 3个月
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
简介: 对比PyTorch和TensorFlow的自动差异和动态子类化模型

使用自定义模型类从头开始训练线性回归,比较PyTorch 1.x和TensorFlow 2.x之间的自动差异和动态模型子类化方法。

640.png

这篇简短的文章重点介绍如何在PyTorch 1.x和TensorFlow 2.x中分别使用带有模块/模型API的动态子类化模型,以及这些框架在训练循环中如何使用AutoDiff获得损失的梯度并从头开始实现 一个非常幼稚的渐变后代实现。

生成噪声的线性数据

为了专注于自动差异/自动渐变功能的核心,我们将使用最简单的模型,即线性回归模型,然后我们将首先使用numpy生成一些线性数据,以添加随机级别的噪声。

defgenerate_data(m=0.1, b=0.3, n=200):
x=np.random.uniform(-10, 10, n)
noise=np.random.normal(0, 0.15, n)
y= (m*x+b ) +noisereturnx.astype(np.float32), y.astype(np.float32)
x, y=generate_data()
plt.figure(figsize= (12,5))
ax=plt.subplot(111)
ax.scatter(x,y, c="b", label="samples")

640.png

模型

然后,我们将在TF和PyTorch中实现从零开始的线性回归模型,而无需使用任何层或激活器,而只需定义两个张量w和b,分别代表线性模型的权重和偏差,并简单地实现线性函数即可:y = wx + b

正如您在下面看到的,我们的模型的TF和PyTorch类定义基本上完全相同,但在一些api名称上只有很小的差异。

唯一值得注意的区别是,PyTorch明确地使用Parameter对象定义权重和要由图形“捕获”的偏置张量,而TF似乎在这里更“神奇”,而是自动捕获用于图形的参数。

确实在PyTorch参数中是Tensor子类,当与Module api一起使用时,它们具有非常特殊的属性,可以自动将自身添加到Module参数列表中,并会出现在在parameters()迭代器中。

无论如何,两个框架都能够从此类定义和执行方法(callforward ),参数和图形定义中提取信息,以便向前执行图形执行,并且正如我们将看到的那样,通过自动可微分获得梯度功能,以便能够执行反向传播。

TensorFlow动态模型

classLinearRegressionKeras(tf.keras.Model):
def__init__(self):
super().__init__()
self.w=tf.Variable(tf.random.uniform(shape=[1], -0.1, 0.1))
self.b=tf.Variable(tf.random.uniform(shape=[1], -0.1, 0.1))
def__call__(self,x):
returnx*self.w+self.b

PyTorch动态模型

classLinearRegressionPyTorch(torch.nn.Module):
def__init__(self):
super().__init__()
self.w=torch.nn.Parameter(torch.Tensor(1, 1).uniform_(-0.1, 0.1))
self.b=torch.nn.Parameter(torch.Tensor(1).uniform_(-0.1, 0.1))
defforward(self, x):  
returnx@self.w+self.b

训练循环,反向传播和优化器

现在我们已经实现了简单的TensorFlow和PyTorch模型,我们可以定义TF和PyTorch api来实现均方误差的损失函数,最后实例化我们的模型类并运行训练循环。

同样,本着眼于自动差异/自动渐变功能核心的目的,我们将使用TF和PyTorch特定的自动差异实现方式实现自定义训练循环,以便为我们的简单线性函数提供渐变并手动优化权重和偏差参数以及临时和朴素的渐变后代优化器。

在TensorFlow训练循环中,我们将特别明确地使用GradientTape API来记录模型的正向执行和损失计算,然后从该GradientTape中获得用于优化权重和偏差参数的梯度。

相反,在这种情况下,PyTorch提供了一种更“神奇”的自动渐变方法,隐式捕获了对参数张量的任何操作,并为我们提供了相同的梯度以用于优化权重和偏置参数,而无需使用任何特定的api。

一旦我们有了权重和偏差梯度,就可以在PyTorch和TensorFlow上实现我们的自定义梯度派生方法,就像将权重和偏差参数减去这些梯度乘以恒定的学习率一样简单。

此处的最后一个微小区别是,当PyTorch在向后传播中更新权重和偏差参数时,以更隐蔽和“魔术”的方式实现自动差异/自动graf时,我们需要确保不要继续让PyTorch从最后一次更新操作中提取grad,这次明确调用no_grad api,最后将权重和bias参数的梯度归零。

TensorFlow训练循环

defsquared_error(y_pred, y_true):
returntf.reduce_mean(tf.square(y_pred-y_true))
tf_model=LinearRegressionKeras()
[w, b] =tf_model.trainable_variablesforepochinrange(epochs):
withtf.GradientTape() astape:
predictions=tf_model(x)
loss=squared_error(predictions, y)
w_grad, b_grad=tape.gradient(loss, tf_model.trainable_variables)
w.assign(w-w_grad*learning_rate)
b.assign(b-b_grad*learning_rate)
ifepoch%20==0:
print(f"Epoch {epoch} : Loss {loss.numpy()}")

PyTorch训练循环

defsquared_error(y_pred, y_true):
returntorch.mean(torch.square(y_pred-y_true))
torch_model=LinearRegressionPyTorch()
[w, b] =torch_model.parameters()
forepochinrange(epochs):
y_pred=torch_model(inputs)
loss=squared_error(y_pred, labels)
loss.backward()
withtorch.no_grad():
w-=w.grad*learning_rateb-=b.grad*learning_ratew.grad.zero_()
b.grad.zero_()
ifepoch%20==0:
print(f"Epoch {epoch} : Loss {loss.data}")

结论

正如我们所看到的,TensorFlow和PyTorch自动区分和动态子分类API非常相似,当然,两种模型的训练也给我们非常相似的结果。

在下面的代码片段中,我们将分别使用Tensorflow和PyTorch trainable_variables和parameters方法来访问模型参数并绘制学习到的线性函数的图。

绘制结果

[w_tf, b_tf] =tf_model.trainable_variables[w_torch, b_torch] =torch_model.parameters()
withtorch.no_grad():
plt.figure(figsize= (12,5))
ax=plt.subplot(111)
ax.scatter(x, y, c="b", label="samples")
ax.plot(x, w_tf*x+b_tf, "r", 5.0, "tensorflow")
ax.plot(x, w_torch*inputs+b_torch, "c", 5.0, "pytorch")
ax.legend()
plt.xlabel("x1")
plt.ylabel("y",rotation=0)

640.png

目录
相关文章
|
2月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
深度学习之格式转换笔记(三):keras(.hdf5)模型转TensorFlow(.pb) 转TensorRT(.uff)格式
将Keras训练好的.hdf5模型转换为TensorFlow的.pb模型,然后再转换为TensorRT支持的.uff格式,并提供了转换代码和测试步骤。
99 3
深度学习之格式转换笔记(三):keras(.hdf5)模型转TensorFlow(.pb) 转TensorRT(.uff)格式
|
2月前
|
并行计算 PyTorch TensorFlow
Ubuntu安装笔记(一):安装显卡驱动、cuda/cudnn、Anaconda、Pytorch、Tensorflow、Opencv、Visdom、FFMPEG、卸载一些不必要的预装软件
这篇文章是关于如何在Ubuntu操作系统上安装显卡驱动、CUDA、CUDNN、Anaconda、PyTorch、TensorFlow、OpenCV、FFMPEG以及卸载不必要的预装软件的详细指南。
4518 3
|
2月前
|
算法 PyTorch 算法框架/工具
Pytorch学习笔记(九):Pytorch模型的FLOPs、模型参数量等信息输出(torchstat、thop、ptflops、torchsummary)
本文介绍了如何使用torchstat、thop、ptflops和torchsummary等工具来计算Pytorch模型的FLOPs、模型参数量等信息。
297 2
|
3月前
|
数据挖掘 PyTorch TensorFlow
|
24天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
67 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
24天前
|
机器学习/深度学习 人工智能 算法
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
蔬菜识别系统,本系统使用Python作为主要编程语言,通过收集了8种常见的蔬菜图像数据集('土豆', '大白菜', '大葱', '莲藕', '菠菜', '西红柿', '韭菜', '黄瓜'),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练最后得到一个识别精度较高的模型文件。在使用Django开发web网页端操作界面,实现用户上传一张蔬菜图片识别其名称。
67 0
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
|
2月前
|
机器学习/深度学习 自然语言处理 监控
利用 PyTorch Lightning 搭建一个文本分类模型
利用 PyTorch Lightning 搭建一个文本分类模型
63 8
利用 PyTorch Lightning 搭建一个文本分类模型
|
2月前
|
PyTorch TensorFlow 算法框架/工具
Jetson环境安装(一):Ubuntu18.04安装pytorch、opencv、onnx、tensorflow、setuptools、pycuda....
本文提供了在Ubuntu 18.04操作系统的NVIDIA Jetson平台上安装深度学习和计算机视觉相关库的详细步骤,包括PyTorch、OpenCV、ONNX、TensorFlow等。
79 1
Jetson环境安装(一):Ubuntu18.04安装pytorch、opencv、onnx、tensorflow、setuptools、pycuda....
|
2月前
|
机器学习/深度学习 自然语言处理 数据建模
三种Transformer模型中的注意力机制介绍及Pytorch实现:从自注意力到因果自注意力
本文深入探讨了Transformer模型中的三种关键注意力机制:自注意力、交叉注意力和因果自注意力,这些机制是GPT-4、Llama等大型语言模型的核心。文章不仅讲解了理论概念,还通过Python和PyTorch从零开始实现这些机制,帮助读者深入理解其内部工作原理。自注意力机制通过整合上下文信息增强了输入嵌入,多头注意力则通过多个并行的注意力头捕捉不同类型的依赖关系。交叉注意力则允许模型在两个不同输入序列间传递信息,适用于机器翻译和图像描述等任务。因果自注意力确保模型在生成文本时仅考虑先前的上下文,适用于解码器风格的模型。通过本文的详细解析和代码实现,读者可以全面掌握这些机制的应用潜力。
95 3
三种Transformer模型中的注意力机制介绍及Pytorch实现:从自注意力到因果自注意力
|
1月前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
79 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型

热门文章

最新文章