【问题标题】:Is it possible to get the architecture of neural network built with Tensorflow and Pytorch using static analysis?是否有可能使用静态分析获得使用 Tensorflow 和 Pytorch 构建的神经网络架构?
【发布时间】:2022-08-14 22:30:17
【问题描述】:

我目前正在分析数百个代码存储库,以识别 ML 算法的参数设置。在这方面,我想知道是否可以使用静态分析提取使用 Tensorflow 和 Pytorch 构建的神经网络的架构?

为了澄清我的问题,请考虑使用 TF 和 Pytorch 开发神经网络。通常,模型是通过实现从 TF 或 Pytorch 继承的类来创建的。在类中,指定了架构(例如,层)。例如,请参阅下面的代码片段:

import torch
import torch.nn as nn

class Net(nn.Module):
    def __init__(self):
    super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 6, 5)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

我想知道是否可以使用静态分析提取架构。 TF 提供了一个名为 summary() 的函数,它打印网络的摘要,包括其层、输出形状和参数数量。这正是我想通过静态分析提取的内容。使用静态分析的基本原理是我分析了数百个代码存储库,因此为每个存储库运行代码是不可行的。

    标签: tensorflow neural-network pytorch static-analysis


    【解决方案1】:

    您必须计算包含模型的代码的抽象语法树 (AST)。为此,您可以使用开源解析器。

    当您必须进行 AST 时,您可以通过跟踪数据流来遍历图并提取模型架构。不过,这部分并不简单。您可能需要查看一些示例并编写好的测试。但是当您在其他文件中定义模型的某些部分时,这将不起作用。您需要一些方法来进行文件间静态分析,但这很难。

    哈克的方法

    对于每个 repo,您​​检测包含从 nn.Module 继承的类的文件。您可以通过对每个文件使用计算 AST 或仅基于文件内容来做到这一点。现在,一旦您知道包含模块的文件,您就可以创建一个 python 文件。您在这个新文件中导入该文件,定义该类的实例。然后您可以使用 .summary 函数并将其写入文件。当模型的部分定义在多个文件中时,每个 repo 可能会有多个 nn.Module。要找出网络,您可以只取最长的摘要。

    for repo in repositories:
      for file in repo.get_files():
        if containsNNModule(file):
          create_new_file_with_content(file)
          # The file content contains one line for importing file
          # One line for defining an instance of the module
          # One line to print the summary.
          # Create a python subprocess run the new file, capture its output and save it.
    

    【讨论】:

    • 我已经尝试过使用 AST。这里的问题是每个网络的实现方式不同。并非所有变量都必须是网络架构的一部分。也就是说,AST 分析必须适应每个网络才能提取架构。但是,正如已经提到的,由于要分析的代码存储库的数量,这是不可行的。
    • 这个例子是一个理想的例子,但在野外,神经网络看起来不同,而且要复杂得多。
    • “并非所有变量都必须成为网络架构的一部分”是什么意思?为什么你需要适应 AST?您是指从另一个文件导入网络的某些部分的情况吗?
    • 好吧,我在不同的存储库中看到了许多神经网络。有时有些变量不属于架构,至少我没有意识到它们是这样的。你的例子也是一个特例。那么,问题是如果每个神经网络都不同,我如何可靠地提取架构?当然,AST 可能是一个很好的起点。但是,我不能涵盖所有特殊情况。
    • 我更新了我的答案。我认为你最好的选择是以我描述的 hacky 方式来做。
    猜你喜欢
    • 2018-12-11
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多