深度学习模型转换器

pytorch2keras的Python项目详细描述


pytorch2keras

Build StatusGitHub LicensePython VersionDownloadsPyPIReadthedocs

Pythorch到Keras模型转换器。

安装

pip install pytorch2keras 

重要注意事项

要正确使用转换器,请在~/.keras/keras.json

...
"backend": "tensorflow",
"image_data_format": "channels_first",
...

tensorflow.js

要正确转换为tensorflow.js格式,请使用新标志names='short'

下面是如何获取tensorflow.js模型的简短说明:

  1. 首先,您必须使用此转换器将模型转换为路缘石:
k_model = pytorch_to_keras(model, input_var, [(10, 32, 32,)], verbose=True, names='short')  
  1. 现在你有了凯拉斯模型。您可以将它保存为h5文件,然后用tensorflowjs_converter转换它,但它有时不起作用。作为替代方案,您可以获得tensorflow图并将其保存为冻结模型:
# Function below copied from here:
# https://stackoverflow.com/questions/45466020/how-to-export-keras-h5-to-tensorflow-pb 
def freeze_session(session, keep_var_names=None, output_names=None, clear_devices=True):
    """
    Freezes the state of a session into a pruned computation graph.

    Creates a new computation graph where variable nodes are replaced by
    constants taking their current value in the session. The new graph will be
    pruned so subgraphs that are not necessary to compute the requested
    outputs are removed.
    @param session The TensorFlow session to be frozen.
    @param keep_var_names A list of variable names that should not be frozen,
                          or None to freeze all the variables in the graph.
    @param output_names Names of the relevant graph outputs.
    @param clear_devices Remove the device directives from the graph for better portability.
    @return The frozen graph definition.
    """
    from tensorflow.python.framework.graph_util import convert_variables_to_constants
    graph = session.graph
    with graph.as_default():
        freeze_var_names = \
            list(set(v.op.name for v in tf.global_variables()).difference(keep_var_names or []))
        output_names = output_names or []
        output_names += [v.op.name for v in tf.global_variables()]
        input_graph_def = graph.as_graph_def()
        if clear_devices:
            for node in input_graph_def.node:
                node.device = ""
        frozen_graph = convert_variables_to_constants(session, input_graph_def,
                                                      output_names, freeze_var_names)
        return frozen_graph


from keras import backend as K
import tensorflow as tf
frozen_graph = freeze_session(K.get_session(),
                              output_names=[out.op.name for out in k_model.outputs])

tf.train.write_graph(frozen_graph, ".", "my_model.pb", as_text=False)
print([i for i in k_model.outputs])

  1. 您将看到输出层名称,因此,现在是将my_model.pb转换为tfjs模型的时候了:
tensorflowjs_converter  \
    --input_format=tf_frozen_model \
    --output_node_names='TANHTObs/Tanh' \
    my_model.pb \
    model_tfjs
  1. 就这些!
const MODEL_URL = `model_tfjs/tensorflowjs_model.pb`;
const WEIGHTS_URL = `model_tfjs/weights_manifest.json`;
cont model = await tf.loadFrozenModel(MODEL_URL, WEIGHTS_URL);

如何使用

它是pytorch图到keras(tensorflow backend)模型的转换。

首先,我们需要加载(或创建)一个有效的pytorch模型:

class TestConv2d(nn.Module):
    """
    Module for Conv2d testing
    """

    def __init__(self, inp=10, out=16, kernel_size=3):
        super(TestConv2d, self).__init__()
        self.conv2d = nn.Conv2d(inp, out, stride=1, kernel_size=kernel_size, bias=True)

    def forward(self, x):
        x = self.conv2d(x)
        return x

model = TestConv2d()

# load weights here
# model.load_state_dict(torch.load(path_to_weights.pth))

下一步-创建形状正确的虚拟变量:

input_np = np.random.uniform(0, 1, (1, 10, 32, 32))
input_var = Variable(torch.FloatTensor(input_np))

我们使用虚拟变量来跟踪模型(使用jit.trace):

from pytorch2keras import pytorch_to_keras
# we should specify shape of the input tensor
k_model = pytorch_to_keras(model, input_var, [(10, 32, 32,)], verbose=True)  

您还可以将h和w维度设置为none以使您的模型形状不可知(例如完全卷积网络):

from pytorch2keras.converter import pytorch_to_keras
# we should specify shape of the input tensor
k_model = pytorch_to_keras(model, input_var, [(10, None, None,)], verbose=True)  

就这些!如果所有模块都已正确转换,那么keras模型将存储在k_model变量中。

API

这里是来自pytorch2keras模块的唯一方法pytorch_to_keras

def pytorch_to_keras(
    model, args, input_shapes=None,
    change_ordering=False, verbose=False, name_policy=None,
):

选项:

  • model-要转换的pytorch模型(nn.module);
  • args-具有适当形状的伪变量列表;
  • input_shapes(实验性)列表,包含输入的重写形状;
  • change_ordering-(实验)布尔值,如果启用,转换器将尝试将BCHW更改为BHWC
  • verbose-布尔值,详细的转换日志
  • name_policy(实验性)从keepshortrandom中进行选择。选择器设置目标层命名策略。

支持的层

  • 激活:

    • relu
    • 漏洞百出
    • selu
    • 乙状结肠
    • softmax
  • 常数

  • 卷积:

    • conv2d
    • convtrsnpose2d
  • 元素:

    • 添加
    • mul
    • sub
    • div
  • 线性

  • 规格化:

    • 批次标准2
    • 瞬间rm2d
  • 池:

    • MaxPool2d
    • avgpool2d
    • 全局maxpool2d(自适应池到形状[1,1])

使用pytorch2keras转换的模型

  • resnet*
  • VGG*
  • preresnet*
  • 登塞内特*
  • 亚历克斯内特
  • MobileNet 2版

用法

看看tests目录。

许可证

此软件受麻省理工学院许可证的保护。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java类之间并发性不一致的HashMap   插件如何在JavaSwing中使用UIManager和Classloader从外部jar安装外观?   java JasperReports:找不到子报表   在项目中找不到java生成的Javadoc文件   java BigDecimal。multiply()和divide()方法返回十六进制数。为什么?   java统计出现次数并从字符串中删除重复项   调用运算符时发生java NullPointerException   Spring和Hibernate之间的java配置错误   JavaZK将用户重定向回上一页   Javasocket为传出连接指定特定的网络接口   如果拖动到某个区域外,java Make按钮操作将被取消   如何在Eclipse for selenium 3.141.59中添加Java文档链接   java从匹配条件的数组中获取所有索引   docker未连接到RemoteWebDriver的java Gitlab ci selenium测试   java重写run方法   utf 8如何使用java解码UTF8编码的字符串?   java如何从eclipse调试部署在tomcat上的web应用程序?   将字母字符与前面没有百分号的Java正则表达式匹配