人走茶凉|API统一、干净,新型EagerPy实现多框架无缝衔接( 三 )


无论是哪种原生张量 , 通常都可以使用 ep.astensor 将它转换为适当的 EagerPy 张量 。 在此步骤中 , 通过使用正确的 EagerPy 张量类来自动封装原生张量 。 此外 , 最初的原生张量通常可以利用. raw 属性实现访问 。 完整示例如下代码 6 所示:
人走茶凉|API统一、干净,新型EagerPy实现多框架无缝衔接EagerPy 和原生张量之间的转换 。
在函数中通常将所有输入转换为 EagerPy 张量 。 这可以通过单独调用 ep.astensor 完成 , 但在使用 ep.astensors 时 , 代码可以更加简洁 , 如下:
人走茶凉|API统一、干净,新型EagerPy实现多框架无缝衔接实现框架无关的通用函数
通过上文中的转换函数 , 我们可以定义一个简单的框架无关函数 , 如下代码 8 所示:
人走茶凉|API统一、干净,新型EagerPy实现多框架无缝衔接代码 8:一个简单的框架无关范数函数 。
如下代码 9 所示 , 通过一个 PyTorch 张量来调用范数函数:
人走茶凉|API统一、干净,新型EagerPy实现多框架无缝衔接如下代码 10 所示 , 通过一个 TensorFlow 张量来调用范数函数:
人走茶凉|API统一、干净,新型EagerPy实现多框架无缝衔接此外 , 还需要注意一点 , 如果如上代码 8 所示使用 EagerPy 张量来调用函数 , 则 ep.astensor 调用只会返回它的输入 。 但是 , 最后一行代码中的 result.raw 调用依然会提取底层原生张量 。 通常而言 , 实现的通用函数最好可以透明地操控任何原生张量和 EagerPy 张量 , 也就是说返回类型应该总是与输入类型相匹配 。
这在 Foolbox 等库中非常有用 , 可以使用户同时处理 EagerPy 和原生张量 。
为此 , EagerPy 提供上述转换函数的两种派生函数 , 分别是 ep.astensor_和 ep.astensors_ , 它们可以返回一个能够恢复输入类型的反转函数 。
如果 astensor_的输入是一个原生张量 , 则 restore_type 等同于. raw;而如果原输入是一个 EagerPy 张量 , 则 restore_type 将不会调用. raw 。 因此 , 我们可以编写对任何输入都透明的改进版框架无关通用函数 , 如下代码 11 所示:
人走茶凉|API统一、干净,新型EagerPy实现多框架无缝衔接【人走茶凉|API统一、干净,新型EagerPy实现多框架无缝衔接】最后 , 如下代码 12 所示 , 使用 ep.astensors_来转换和恢复多个输入:
人走茶凉|API统一、干净,新型EagerPy实现多框架无缝衔接