Jav*_*Jav 6 deep-learning tensorflow resnet pre-trained-model pytorch
“显然!”,你可能会说……但是有一个显着的差异,我很难通过随机初始化的差异来解释。
采用两个预先训练的基网(在平均池化层之前)并为它们提供相同的图像,您会注意到输出特征不遵循相同的分布。具体来说,与Pytorch的主干相比, TensorFlow的主干具有更多受 ReLU 抑制的功能。此外,如第三张图所示,两个框架的动态范围不同。
当然,这种差异被处理分类任务的密集层所吸收,但是:这种差异可以用训练过程中的随机性来解释吗?还是训练时间?或者还有其他什么可以解释这种差异吗?
重现代码:
import imageio
import numpy as np
image = imageio.imread("/tmp/image.png").astype(np.float32)/255
import tensorflow as tf
inputs = image[np.newaxis]
model = tf.keras.applications.ResNet50(include_top=False, input_shape=(None, None, 3))
output = model(inputs).numpy()
print(f"TensorFlow features range: [{np.min(output):.02f};{np.max(output):.02f}]")
import torchvision
import torch
model = torch.nn.Sequential(*list(torchvision.models.resnet50(pretrained=True).children())[0:8])
inputs = torch.tensor(image).permute(2,0,1).unsqueeze(0)
output = model(inputs).detach().permute(0,2,3,1).numpy()
print(f"Pytorch features range: [{np.min(output):.02f};{np.max(output):.02f}]")
Run Code Online (Sandbox Code Playgroud)
输出
TensorFlow features range: [0.00;25.98]
Pytorch features range: [0.00;12.00]
Run Code Online (Sandbox Code Playgroud)
注意:它与任何图像相似。
iam*_*sha -1
Keras 和 PyTorch 在标准深度学习模型的定义、修改、训练、评估和导出方式方面存在显着差异。对于某些部分,它纯粹是关于不同的 API 约定,而对于其他部分,则涉及抽象级别之间的根本差异。
\nKeras 在更高的抽象级别上运行。它更加即插即用,通常也更加简洁,但代价是灵活性。PyTorch 提供了更明确和详细的代码。在大多数情况下,这意味着可调试且灵活的代码,并且只需很小的开销。然而,PyTorch 中的训练要冗长得多。这很痛苦,但有时提供了很大的灵活性。
\n除此之外,在 TensorFlow 和 PyTorch 中创建相同网络的方式是不同的。在 TensorFlow 中,网络预测概率(具有内置的 softmax 函数),其内置成本函数假设它们与概率一起工作。在 PyTorch 中我们有更多的自由,但首选的方式是返回 logits。这样做是出于数值原因,执行 softmax 然后对数损失意味着执行不必要的 log(exp(x)) 操作。因此,我们不使用 softmax,而是使用 LogSoftmax(和 NLLLoss)或将它们组合成一个 nn.CrossEntropyLoss 损失函数。
\n\n 归档时间: |
|
查看次数: |
1461 次 |
最近记录: |