精华内容
下载资源
问答
  • pyTorch与TensorFlow的综合对比

    千次阅读 2021-01-13 10:44:18
    之前,斯坦福大学研究机器学习的博士生Awni Hannun,围绕PyTorch还是TensorFlow这个话题,做了一个深入的比较。 综合对比对比类别 pyTorch tensorFlow 较优 上手时间 PyTorch本质上是Numpy的替代...

    前言

    之前,斯坦福大学研究机器学习的博士生Awni Hannun,围绕PyTorch还是TensorFlow这个话题,做了一个深入的比较。

    综合对比表

    对比类别pyTorchtensorFlow较优
    上手时间PyTorch本质上是Numpy的替代者,而且支持GPU、带有高级功能,可以用来搭建和训练深度神经网络。如果你熟悉Numpy、Python以及常见的深度学习概念(卷积层、循环层、SGD等),会非常容易上手PyTorch。

    而TensorFlow可以看成是一个嵌入Python的编程语言。你写的TensorFlow代码会被Python编译成一张图,然后由TensorFlow执行引擎运行。我见过好多新手,因为这个增加的间接层而困扰。也正是因为同样的原因,TensorFlow有一些额外的概念需要学习,例如会话、图、变量作用域(variable scoping)、占位符等

     

    PyTorch

    图创建与测试

    动态,PyTorch中简单的图结构更容易理解,更重要的是,还更容易调试。调试PyTorch代码就像调试Python代码一样。你可以使用pdb并在任何地方设置断点。

     

    静态,而TensorFlow中,这需要使用“控制流操作”来构建图,例如tf.while_loop。TensorFlow确实提供了dynamic_rnn用于常见结构,但是创建自定义动态计算真的更加困难。调试TensorFlow代码可不容易。要么得从会话请求要检查的变量,要么学会使用TensorFlow的调试器(tfdbg)PyTorch
    丰富性

    随着PyTorch逐渐成熟,我预计这部分的差距会趋近于零。

     

    但目前,TensorFlow还是有一些PyTorch不支持的功能。它们是:

    • 沿维翻转张量(np.flip, np.flipud, np.fliplr)
    • 检查无穷与非数值张量(np.is_nan, np.is_inf)
    • 快速傅里叶变换(np.fft)

    这些TensorFlow都支持。另外,TensorFlow的contrib软件包中,有更多PyTorch没有的高级功能和模型。

    TensorFlow

    序列化

    PyTorch有一个特别简单的API,可以保存模型的所有权重或pickle整个类

    TensorFlow的Saver对象也很易用,而且为检查提供了更多的选项。

    TensorFlow序列化的主要优点是可以将整个图保存为protocol buffer。包括参数和操作。然而图还能被加载进其他支持的语言(C++、Java)。这对于部署堆栈至关重要。理论上,当你想改动模型源代码但仍希望运行旧模型时非常有用。

    TensorFlow

    部署

    对于小规模的服务器端部署(例如一个Flask web server),两个框架都很简单

    对于移动端和嵌入式部署,TensorFlow更好。不只是比PyTorch好,比大多数深度学习框架都要要。使用TensorFlow,部署在Android或iOS平台时只需要很小的工作量,至少不必用Java或者C++重写模型的推断部分。

    对于高性能服务器端的部署,还有TensorFlow Serving能用。除了性能之外,TensorFlow Serving一个显著的优点是可以轻松的热插拔模型,而不会使服务失效。

     

    TensorFlow

    数据加载

     

    PyTorch中用于加载数据的API设计的很棒。接口由一个数据集、一个取样器和一个数据加载器构成。数据加载器根据取样器的计划,基于数据集产生一个迭代器。并行化数据加载简单的就像把num_workers参数传递给数据加载器一样简单我在TensorFlow中没有发现特别有用的数据加载工具。很多时候,并不总能直接把准备并行运行的预处理代码加入TensorFlow图。以及API本身冗长难学PyTorch
    设备管理在PyTorch中,我发现代码需要更频繁的检查CUDA是否可用,以及更明确的设备管理。在编写能够同时在CPU和GPU上运行的代码时尤其如此。以及得把GPU上的PyTorch变量转换为Numpy数组,这就显得有点冗长。

    TensorFlow的设备管理非常好用。通常你不需要进行调整,因为默认的设置就很好。例如,TensorFlow会假设你想运行在GPU上(如果有的话)。而在PyTorch中,即使启用了CUDA,你也需要明确把一切移入设备。

    TensorFlow设备管理唯一的缺点是,默认情况下,它会占用所有的GPU显存。简单的解决办法是指定CUDA_VISIBLE_DEVICES。有时候大家会忘了这一点,所以GPU在空闲的时候,也会显得很忙。

     

    TensorFlow

    自定义扩展

    在PyTorch中,你只需为每个CPU和GPU编写一个接口和相应的实现。两个框架中编译扩展也是直接记性,并不需要在pip安装的内容之外下载任何头文件或者源代码。TensorFlow仍然需要更多的样板代码,尽管这对于支持多类型和设备可能更好PyTorch

     

    展开全文
  • 本文分享推理时性能、GPU占用对比pytorch tensorflow 上的对比。 DenseNet定义 论文链接:Densely Connected Convolutional Networks 参考:深度/机器学习基础知识要点:CNN、ResNet、DenseNet DenseNet参数 ...

    本文分享模型训练及推理时性能、GPU占用对比:pytorch 与 tensorflow 上的对比。


    DenseNet定义

    论文链接:Densely Connected Convolutional Networks

    参考:深度/机器学习基础知识要点:CNN、ResNet、DenseNet


    DenseNet参数

    • 参数情况
      在这里插入图片描述

    • flops

      在这里插入图片描述

    DensetNet201 性能对比

    • 图片输入尺寸
      224 × 256

    • 环境

      • Ubuntu 16.04
      • torch 1.2.0
      • torchvision 0.4.0
      • tensorflow 1.14.0
    • 对比

      平台训练GPU占用(M)推理GPU占用(M)推理速度(100张s)模型文件大小(M)
      tensorflow53003.170
      pytorch4706002.373.6

    参考

    展开全文
  • Pytorch与Tensorflow权重互转

    千次阅读 2021-02-19 14:10:23
    文章目录准备测试输入数据将Pytorch卷积层权重转到Tensorflow中将Pytorch DW卷积层权重转到Tensorflow中将Pytorch BN层权重转到Tensorflow中全连接层完整测试代码 在Pytorch以及Tensorflow官方,都有提供一些常用的...

    在Pytorch以及Tensorflow官方,都有提供一些常用的预训练模型权重(在ImageNet上预训练得到的)。但有些时候,Pytorch官方提供的模型Tensorflow官方并没有。此时就会想些办法,将Pytorch官方提供的模型权重转到Tensorflow的模型中。反之亦然。
    首先,在Pytorch和Tensorflow中不同层结构的权重存储格式略有不同。比如普通的卷积层,在Pytorch卷积层中,kernel weights存储格式是[kernel_number, kernel_channel, kernel_height, kernel_width],但在Tensorflow卷积层中kernel weights存储格式是[kernel_height, kernel_width, kernel_channel, kernel_number]。下面我们主要针对常见的几个层结构来进行转换,没有训练权重的层结构(例如激活层)我们可以不用管。

    注意,这里测试使用的是Pytorch1.6及以上,以及tensorflow2.2及以上测试的


    准备测试输入数据

    这里直接使用numpy随机创建了一个宽高为5,channel为3的矩阵。然后分别构建提供给Pytorch以及Tensorflow的Tensor。需要注意的是Pytorch要求输入的Tensor格式是[B, C, H, W],而Tensorflow要求输入的Tensor格式是[B, H, W, C]

    import tensorflow as tf
    import torch
    from torch import nn
    import numpy as np
    
    
    image = np.random.rand(5, 5, 3)
    torch_image = np.transpose(image, (2, 0, 1)).astype(np.float32)
    # [B, C, H, W] for pytorch
    torch_image = torch.unsqueeze(torch.as_tensor(torch_image), dim=0)
    # [B, H, W, C] for tensorflow
    tf_image = np.expand_dims(image, axis=0)
    

    将Pytorch卷积层权重转到Tensorflow中

    上面刚刚说了在Pytorch的卷积层中,kernel weights存储格式是[kernel_number, kernel_channel, kernel_height, kernel_width],但在Tensorflow的卷积层中kernel weights存储格式是[kernel_height, kernel_width, kernel_channel, kernel_number]。还有就是在卷积层中如果使用了bias那么bias weights是不需要处理的,因为卷积的bias weights只有一个维度,所以Pytorch和Tensorflow中存储的格式是一样的(后面测试也能验证这个结论)。
    在下面代码中:

    • 分别使用Pytorch和Tensorflow的Keras模块创建了卷积层
    • 获取Pytorch创建卷积层的kernel weight以及bias weight
    • 使用numpy对kernel weight的进行transpose处理
    • 将转换后的权重载入到tensorflow的卷积层中
    • 将之前创建的数据分别传入Pytorch和Tensorflow的卷积层中进行正向传播
    • 再使用numpy对Pytorch得到的结果进行transpose处理(保证和tensorflow输出的结果Tensor格式一致)
    • 对比两者输出的结果是否一致
    def conv_test(torch_image, tf_image):
        """
        测试转换权重后pytorch的卷积层和tensorflow的卷积层输出是否一致
        :param torch_image:
        :param tf_image:
        :return:
        """
        # 创建pytorch卷积层
        torch_conv = nn.Conv2d(in_channels=3, out_channels=32, kernel_size=3, padding=1)
        # [kernel_number, kernel_channel, kernel_height, kernel_width]
        # 卷积层的weights
        torch_conv_weight = torch_conv.weight
        # 卷积层的bias
        torch_conv_bias = torch_conv.bias
    
        # 创建tensorflow卷积层
        tf_conv = tf.keras.layers.Conv2D(filters=32, kernel_size=3, padding='same')
        tf_conv.build([1, 5, 5, 3])
        # 将pytorch的卷积层权重进行转换并载入tf的卷积层中
        # to [kernel_height, kernel_width, kernel_channel, kernel_number]
        value = np.transpose(torch_conv_weight.detach().numpy(), (2, 3, 1, 0)).astype(np.float32)
        tf_conv.set_weights([value, torch_conv_bias.detach().numpy()])
    
        # 计算pytorch卷积层的输出
        # [B, C, H, W]
        v1 = torch_conv(torch_image).detach().numpy()
        v1 = np.squeeze(v1, axis=0)
        # [H, W, C]
        v1 = np.transpose(v1, (1, 2, 0))
    
        # 计算tensorflow卷积层的输出
        # [B, H, W, C]
        v2 = tf_conv(tf_image).numpy()
        # [H, W, C]
        v2 = np.squeeze(v2, axis=0)
    
        # 检查pytorch和tensorflow的输出结果是否一致
        np.testing.assert_allclose(v1, v2, rtol=1e-03, atol=1e-05)
        print("convolution layer test is great!")
    

    将Pytorch DW卷积层权重转到Tensorflow中

    在Pytorch的dw卷积层中,dw kernel weights存储格式是[kernel_number, kernel_channel, kernel_height, kernel_width],但在Tensorflow的dw卷积层中dw kernel weights存储格式是[kernel_height, kernel_width, kernel_number, kernel_channel](注意这里最后两个维度和卷积层有些差异)。同样在dw卷积层中如果使用了bias那么dw bias weights是不需要处理的。
    在下面代码中:

    • 分别使用Pytorch和Tensorflow的Keras模块创建了dw卷积层
    • 获取Pytorch创建dw卷积层的dw kernel weight以及dw bias weight
    • 使用numpy对dw kernel weight的进行transpose处理
    • 将转换后的权重载入到tensorflow的dw卷积层中
    • 将之前创建的数据分别传入Pytorch和Tensorflow的dw卷积层中进行正向传播
    • 再使用numpy对Pytorch得到的结果进行transpose处理(保证和tensorflow输出的结果Tensor格式一致)
    • 对比两者输出的结果是否一致
    def dw_conv_test(torch_image, tf_image):
        """
        测试转换权重后pytorch的dw卷积层和tensorflow的dw卷积层输出是否一致
        :param torch_image:
        :param tf_image:
        :return:
        """
        # 创建pytorch的dw卷积层
        torch_conv = nn.Conv2d(in_channels=3, out_channels=3, kernel_size=3, padding=1, groups=3)
        # [kernel_number, kernel_channel, kernel_height, kernel_width]
        # dw卷积层的weights
        torch_conv_weight = torch_conv.weight
        # dw卷积层的bias
        torch_conv_bias = torch_conv.bias
    
        # 创建tensorflow的dw卷积层
        tf_conv = tf.keras.layers.DepthwiseConv2D(kernel_size=3, padding='same')
        tf_conv.build([1, 5, 5, 3])
        # 将pytorch的dw卷积层权重进行转换并载入tf的dw卷积层中
        # to [kernel_height, kernel_width, kernel_number, kernel_channel]
        value = np.transpose(torch_conv_weight.detach().numpy(), (2, 3, 0, 1)).astype(np.float32)
        tf_conv.set_weights([value, torch_conv_bias.detach().numpy()])
    
        # 计算pytorch卷积层的输出
        # [B, C, H, W]
        v1 = torch_conv(torch_image).detach().numpy()
        v1 = np.squeeze(v1, axis=0)
        # [H, W, C]
        v1 = np.transpose(v1, (1, 2, 0))
    
        # 计算tensorflow卷积层的输出
        # [B, H, W, C]
        v2 = tf_conv(tf_image).numpy()
        # [H, W, C]
        v2 = np.squeeze(v2, axis=0)
    
        # 检查pytorch和tensorflow的输出结果是否一致
        np.testing.assert_allclose(v1, v2, rtol=1e-03, atol=1e-05)
        print("depthwise convolution layer test is great!")
    

    将Pytorch BN层权重转到Tensorflow中

    BatchNorm中涉及4个参数:gammabetameanvar。由于这四个参数的shape都是一维的,所以只要找到对应权重名称关系就行了,不需要对数据进行转换。
    在Pytorch中,这四个参数的名称分别对应weightbiasrunning_meanrunning_var
    在Tensorflow中,分别对应gammabetamoving_meanmoving_variance
    在下面代码中:

    • 分别使用Pytorch和Tensorflow的Keras模块创建了bn层(注意,epsilon要保持一致)
    • 随机初始化Pytorch创建bn层的权重信息(默认初始化weight都是1,bias都是0)
    • 获取Pytorch随机初始化后bn的weightbiasrunning_mean以及running_var
    • 将对应的权重载入到tensorflow的bn层中
    • 将之前创建的数据分别传入Pytorch和Tensorflow的bn层中进行正向传播
    • 再使用numpy对Pytorch得到的结果进行transpose处理(保证和tensorflow输出的结果Tensor格式一致)
    • 对比两者输出的结果是否一致
    def bn_test(torch_image, tf_image):
        """
        测试转换权重后pytorch的bn层和tensorflow的bn层输出是否一致
        :param torch_image:
        :param tf_image:
        :return:
        """
        # 创建pytorch的bn层
        torch_bn = nn.BatchNorm2d(num_features=3, eps=1e-5)
        # 随机初始化bn的参数
        nn.init.uniform_(torch_bn.weight, a=1, b=5)
        nn.init.uniform_(torch_bn.bias, a=0.05, b=0.1)
        nn.init.uniform_(torch_bn.running_mean, a=0.05, b=0.1)
        nn.init.uniform_(torch_bn.running_var, a=1, b=5)
        # bn的weights
        torch_bn_weight = torch_bn.weight
        # bn的bias
        torch_bn_bias = torch_bn.bias
        # bn的running_mean
        torch_bn_mean = torch_bn.running_mean
        # bn的running_var
        torch_bn_var = torch_bn.running_var
    
        # 创建tensorflow的bn层
        tf_bn = tf.keras.layers.BatchNormalization(epsilon=1e-5)
        tf_bn.build([1, 5, 5, 3])
        # 将pytorch的bn权重载入tf的bn中
        tf_bn.set_weights([torch_bn_weight.detach().numpy(),
                           torch_bn_bias.detach().numpy(),
                           torch_bn_mean.detach().numpy(),
                           torch_bn_var.detach().numpy()])
    
        # 计算pytorch bn的输出
        # [B, C, H, W]
        torch_bn.eval()
        v1 = torch_bn(torch_image).detach().numpy()
        v1 = np.squeeze(v1, axis=0)
        # [H, W, C]
        v1 = np.transpose(v1, (1, 2, 0))
    
        # 计算tensorflow bn的输出
        # [B, H, W, C]
        v2 = tf_bn(tf_image, training=False).numpy()
        # [H, W, C]
        v2 = np.squeeze(v2, axis=0)
    
        # 检查pytorch和tensorflow的输出结果是否一致
        np.testing.assert_allclose(v1, v2, rtol=1e-03, atol=1e-04)
        print("bn layer test is great!")
    

    将Pytorch全连接层权重转到Tensorflow中

    在全连接层中涉及两个参数:输入节点个数,和输出节点个数。转换权重时只用转换fc weight即可,fc bias不用做任何处理。
    在下面代码中:

    • 对输入的特征矩阵在height以及width维度上进行全局平均池化
    • 分别使用Pytorch和Tensorflow的Keras模块创建了fc层
    • 获取Pytorch创建fc层的fc weight以及fc bias
    • 使用numpy对fc weight的进行transpose处理
    • 将转换后的权重载入到tensorflow的fc层中
    • 将之前创建的数据分别传入Pytorch和Tensorflow的卷积层中进行正向传播
    • 对比两者输出的结果是否一致
    def fc_test(torch_image, tf_image):
        """
        测试转换权重后pytorch的fc层和tensorflow的fc层输出是否一致
        :param torch_image:
        :param tf_image:
        :return:
        """
    
        # mean height and width dim
        torch_image = torch.mean(torch_image, dim=[2, 3])
        tf_image = np.mean(tf_image, axis=(1, 2))
    
        # 创建pytorch的fc卷积层
        torch_fc = nn.Linear(in_features=3, out_features=5)
        # [output_units, input_units]
        # fc层的weights
        torch_fc_weight = torch_fc.weight
        # fc层的bias
        torch_fc_bias = torch_fc.bias
    
        # 创建tensorflow的fc层
        tf_fc = tf.keras.layers.Dense(units=5)
        tf_fc.build([1, 3])
        # 将pytorch的fc层权重进行转换并载入tf的fc层中
        # to [input_units, output_units]
        value = np.transpose(torch_fc_weight.detach().numpy(), (1, 0)).astype(np.float32)
        tf_fc.set_weights([value, torch_fc_bias.detach().numpy()])
    
        # 计算pytorch fc的输出
        # [B, C]
        v1 = torch_fc(torch_image).detach().numpy()
        v1 = np.squeeze(v1, axis=0)
    
        # 计算tensorflow fc的输出
        # [C, B]
        v2 = tf_fc(tf_image).numpy()
        v2 = np.squeeze(v2, axis=0)
    
        # 检查pytorch和tensorflow的输出结果是否一致
        np.testing.assert_allclose(v1, v2, rtol=1e-03, atol=1e-05)
        print("fc layer test is great!")
    

    完整测试代码

    import tensorflow as tf
    import torch
    from torch import nn
    import numpy as np
    
    
    def conv_test(torch_image, tf_image):
        """
        测试转换权重后pytorch的卷积层和tensorflow的卷积层输出是否一致
        :param torch_image:
        :param tf_image:
        :return:
        """
        # 创建pytorch卷积层
        torch_conv = nn.Conv2d(in_channels=3, out_channels=32, kernel_size=3, padding=1)
        # [kernel_number, kernel_channel, kernel_height, kernel_width]
        # 卷积层的weights
        torch_conv_weight = torch_conv.weight
        # 卷积层的bias
        torch_conv_bias = torch_conv.bias
    
        # 创建tensorflow卷积层
        tf_conv = tf.keras.layers.Conv2D(filters=32, kernel_size=3, padding='same')
        tf_conv.build([1, 5, 5, 3])
        # 将pytorch的卷积层权重进行转换并载入tf的卷积层中
        # to [kernel_height, kernel_width, kernel_channel, kernel_number]
        value = np.transpose(torch_conv_weight.detach().numpy(), (2, 3, 1, 0)).astype(np.float32)
        tf_conv.set_weights([value, torch_conv_bias.detach().numpy()])
    
        # 计算pytorch卷积层的输出
        # [B, C, H, W]
        v1 = torch_conv(torch_image).detach().numpy()
        v1 = np.squeeze(v1, axis=0)
        # [H, W, C]
        v1 = np.transpose(v1, (1, 2, 0))
    
        # 计算tensorflow卷积层的输出
        # [B, H, W, C]
        v2 = tf_conv(tf_image).numpy()
        # [H, W, C]
        v2 = np.squeeze(v2, axis=0)
    
        # 检查pytorch和tensorflow的输出结果是否一致
        np.testing.assert_allclose(v1, v2, rtol=1e-03, atol=1e-05)
        print("convolution layer test is great!")
    
    
    def dw_conv_test(torch_image, tf_image):
        """
        测试转换权重后pytorch的dw卷积层和tensorflow的dw卷积层输出是否一致
        :param torch_image:
        :param tf_image:
        :return:
        """
        # 创建pytorch的dw卷积层
        torch_conv = nn.Conv2d(in_channels=3, out_channels=3, kernel_size=3, padding=1, groups=3)
        # [kernel_number, kernel_channel, kernel_height, kernel_width]
        # dw卷积层的weights
        torch_conv_weight = torch_conv.weight
        # dw卷积层的bias
        torch_conv_bias = torch_conv.bias
    
        # 创建tensorflow的dw卷积层
        tf_conv = tf.keras.layers.DepthwiseConv2D(kernel_size=3, padding='same')
        tf_conv.build([1, 5, 5, 3])
        # 将pytorch的dw卷积层权重进行转换并载入tf的dw卷积层中
        # to [kernel_height, kernel_width, kernel_number, kernel_channel]
        value = np.transpose(torch_conv_weight.detach().numpy(), (2, 3, 0, 1)).astype(np.float32)
        tf_conv.set_weights([value, torch_conv_bias.detach().numpy()])
    
        # 计算pytorch卷积层的输出
        # [B, C, H, W]
        v1 = torch_conv(torch_image).detach().numpy()
        v1 = np.squeeze(v1, axis=0)
        # [H, W, C]
        v1 = np.transpose(v1, (1, 2, 0))
    
        # 计算tensorflow卷积层的输出
        # [B, H, W, C]
        v2 = tf_conv(tf_image).numpy()
        # [H, W, C]
        v2 = np.squeeze(v2, axis=0)
    
        # 检查pytorch和tensorflow的输出结果是否一致
        np.testing.assert_allclose(v1, v2, rtol=1e-03, atol=1e-05)
        print("depthwise convolution layer test is great!")
    
    
    def bn_test(torch_image, tf_image):
        """
        测试转换权重后pytorch的bn层和tensorflow的bn层输出是否一致
        :param torch_image:
        :param tf_image:
        :return:
        """
        # 创建pytorch的bn层
        torch_bn = nn.BatchNorm2d(num_features=3, eps=1e-5)
        # 随机初始化bn的参数
        nn.init.uniform_(torch_bn.weight, a=1, b=5)
        nn.init.uniform_(torch_bn.bias, a=0.05, b=0.1)
        nn.init.uniform_(torch_bn.running_mean, a=0.05, b=0.1)
        nn.init.uniform_(torch_bn.running_var, a=1, b=5)
        # bn的weights
        torch_bn_weight = torch_bn.weight
        # bn的bias
        torch_bn_bias = torch_bn.bias
        # bn的running_mean
        torch_bn_mean = torch_bn.running_mean
        # bn的running_var
        torch_bn_var = torch_bn.running_var
    
        # 创建tensorflow的bn层
        tf_bn = tf.keras.layers.BatchNormalization(epsilon=1e-5)
        tf_bn.build([1, 5, 5, 3])
        # 将pytorch的bn权重载入tf的bn中
        tf_bn.set_weights([torch_bn_weight.detach().numpy(),
                           torch_bn_bias.detach().numpy(),
                           torch_bn_mean.detach().numpy(),
                           torch_bn_var.detach().numpy()])
    
        # 计算pytorch bn的输出
        # [B, C, H, W]
        torch_bn.eval()
        v1 = torch_bn(torch_image).detach().numpy()
        v1 = np.squeeze(v1, axis=0)
        # [H, W, C]
        v1 = np.transpose(v1, (1, 2, 0))
    
        # 计算tensorflow bn的输出
        # [B, H, W, C]
        v2 = tf_bn(tf_image, training=False).numpy()
        # [H, W, C]
        v2 = np.squeeze(v2, axis=0)
    
        # 检查pytorch和tensorflow的输出结果是否一致
        np.testing.assert_allclose(v1, v2, rtol=1e-03, atol=1e-04)
        print("bn layer test is great!")
    
    
    def fc_test(torch_image, tf_image):
        """
        测试转换权重后pytorch的fc层和tensorflow的fc层输出是否一致
        :param torch_image:
        :param tf_image:
        :return:
        """
    
        # mean height and width dim
        torch_image = torch.mean(torch_image, dim=[2, 3])
        tf_image = np.mean(tf_image, axis=(1, 2))
    
        # 创建pytorch的fc卷积层
        torch_fc = nn.Linear(in_features=3, out_features=5)
        # [output_units, input_units]
        # fc层的weights
        torch_fc_weight = torch_fc.weight
        # fc层的bias
        torch_fc_bias = torch_fc.bias
    
        # 创建tensorflow的fc层
        tf_fc = tf.keras.layers.Dense(units=5)
        tf_fc.build([1, 3])
        # 将pytorch的fc层权重进行转换并载入tf的fc层中
        # to [input_units, output_units]
        value = np.transpose(torch_fc_weight.detach().numpy(), (1, 0)).astype(np.float32)
        tf_fc.set_weights([value, torch_fc_bias.detach().numpy()])
    
        # 计算pytorch fc的输出
        # [B, C]
        v1 = torch_fc(torch_image).detach().numpy()
        v1 = np.squeeze(v1, axis=0)
    
        # 计算tensorflow fc的输出
        # [C, B]
        v2 = tf_fc(tf_image).numpy()
        v2 = np.squeeze(v2, axis=0)
    
        # 检查pytorch和tensorflow的输出结果是否一致
        np.testing.assert_allclose(v1, v2, rtol=1e-03, atol=1e-05)
        print("fc layer test is great!")
    
    
    def main():
        image = np.random.rand(5, 5, 3)
        torch_image = np.transpose(image, (2, 0, 1)).astype(np.float32)
        # [B, C, H, W]
        torch_image = torch.unsqueeze(torch.as_tensor(torch_image), dim=0)
        # [B, H, W, C]
        tf_image = np.expand_dims(image, axis=0)
    
        conv_test(torch_image, tf_image)
        dw_conv_test(torch_image, tf_image)
        bn_test(torch_image, tf_image)
        fc_test(torch_image, tf_image)
    
    
    if __name__ == '__main__':
        main()
    
    
    展开全文
  • pytorch与tensorflow部署角度对比

    千次阅读 2019-05-18 23:46:17
    由于pytorch的动态图特性很py的脚本语言特性结合得比较好,pytorch在algo developer会比较受欢迎,而tf的图需要提前定义和编译(这里只讨论V1,*),易用性要比pytorch差一些,这就是tf 2.0后续要优化的其中一个点。...
  • DL:深度学习框架PytorchTensorflow各种角度对比 目录 先看两个框架实现同样功能的代码 1、PytorchTensorflow代码比较 2、Tensorflow(数据即是代码,代码就是数据)+Pytorch(随着进展定义、更改和...
  • 如何定制化编译PytorchTensorFlow,使得CNN模型在CPU,GPU,ARM架构和X86架构,都能快速运行,需要对每一个平台,有针对性的调整。如何做到最大化加速深度学习在不同平台部署性能。请看我的这篇文章。) 深度学习...
  • Pytorch与Tensorflow,哪个更适合你?

    千次阅读 2021-01-08 17:00:00
    本文将探讨PyTorchTensorFlow这两种流行深度学习框架之间的关键相似点和不同点。为什么选择这两个框架,而不是其他的呢?目前有很多的深度学习框架,而且很多都可用于实际的生产,...
  • 一文说清楚pytorchtensorFlow的区别究竟在哪里

    万次阅读 多人点赞 2018-11-19 23:05:52
    最近用了一点pytorch,想着稍稍理一下,这样一个和TensorFlow抗衡的一个框架,究竟是何方神圣? 首先我们要搞清楚pytorchTensorFlow的一点区别,那就是pytorch是一个动态的框架,而TensorFlow是一个静态的框架。...
  • 在安装好ubuntu系统后,我们将开启深度学习的进程,首先是配置...简单对比pytorchtensorflow1.0、tensorflow2.0 一,linux系统中安装anaconda 1,在网站中下载anaconda https://mirrors.tuna.tsinghua.edu.cn/anaco
  • 我们现在使用PyTorch进行相同的曲线拟合,进而来比较一下TensorFlow与PyTorch的异同。 搭建神经网络进行训练的步骤基本相同,我们现在开始用PyTorch来实现。 问题描述 拟合y= x*x -2x +3 + 0.1(-1到1的随...
  • pytorch与TensorFlow卷积层实现对比 torch.nn.Conv2d tensorflow.keras.layers.Conv2D torch.nn.Conv2d // 输入channel为3,输出channel为16,卷积核尺寸为5*5 torch.nn.Conv2d(3, 16, 5); // 输入channel为16,输出...
  • 本文将探讨PyTorchTensorFlow这两种流行深度学习框架之间的关键相似点和不同点。为什么选择这两个框架,而不是其他的呢?目前有很多的深度学习框架,而且很多都可用于实际的生产,我...
  • 本文将探讨PyTorchTensorFlow这两种流行深度学习框架之间的关键相似点和不同点。为什么选择这两个框架,而不是其他的呢?目前有很多的深度学习框架,而且很多都可用于实际的生产,我...
  • [MXNet逐梦之旅]实战一·使用MXNet拟合曲线(对比MXNet,PyTorch与TensorFlow实现的区别) 在之前的博文中我们用TensorFlow与PyTorch进行了拟合曲线,到达了不错的效果。 我们现在使用MXNet进行相同的曲线拟合,进而...
  • 如果您正在阅读本文,则可能已经开始了深度学习的旅程 。为了帮助开发这些架构,...在本文中,我们将研究两个流行的框架并进行比较:PyTorch与TensorFlow。 简要地比较一下,最常用和依赖的Python框架TensorFlow和Py...
  • 因为本人主要从事的是自然语言领域的工作,经常使用的三个框架:pytorch、keras、tensorflow,下面就对这三个框架做一个简单的对比。 二、keras Keras是一个高层神经网络API,后端有三种:tensorflow、Theano、...
  • 近日, 斯坦福大学计算机科学博士生Awni Hannun就发表了一篇文章,对比当前两个主流框架PyTorchTensorFlow。 雷锋网 AI 科技评论编译如下: 这篇指南是我目前发现的PyTorchTensorFlow之间的主要差异。写这篇...
  • 原标题:PyTorchTensorFlow哪家强:九项对比读懂各自长项短板文章来源:斯坦福大学计算机科学系博士生 Awni Hannun这篇指南主要介绍了我找到的 PyTorchTensorFlow 之间的不同之处。这篇文章的目的是帮助那些想...
  • 本文打算讨论在深度学习中常用的十余种损失函数,结合PyTorchTensorFlow2对其概念、公式及用途进行阐述,希望能达到看过的伙伴对各种损失函数有个大致的了解以及使用。本文对原理只是浅尝辄止,不进行深挖,感兴趣...
  • Pytorch VS TensorFlow (2020年最新对比

    千次阅读 2021-03-11 15:06:30
    现在的主流深度学习框架,主要是 Google 系的 TensorFlow 以及 Facebook 系的 Pytorch,其他还有 Keras,Caffe, 微软的 CNTK 等 2020年结束,TF 和 Pytorch 两大框架基本上可以说是平分天下!形势有点像手机操作...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,327
精华内容 2,130
关键字:

pytorch与tensorflow对比