深度学习模型转换器
pytorch2keras的Python项目详细描述
pytorch2keras
Pythorch到Keras模型转换器。
安装
pip install pytorch2keras
重要注意事项
要正确使用转换器,请在~/.keras/keras.json
:
...
"backend": "tensorflow",
"image_data_format": "channels_first",
...
tensorflow.js
要正确转换为tensorflow.js格式,请使用新标志names='short'
。
下面是如何获取tensorflow.js模型的简短说明:
- 首先,您必须使用此转换器将模型转换为路缘石:
k_model = pytorch_to_keras(model, input_var, [(10, 32, 32,)], verbose=True, names='short')
- 现在你有了凯拉斯模型。您可以将它保存为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])
- 您将看到输出层名称,因此,现在是将
my_model.pb
转换为tfjs模型的时候了:
tensorflowjs_converter \
--input_format=tf_frozen_model \
--output_node_names='TANHTObs/Tanh' \
my_model.pb \
model_tfjs
- 就这些!
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
(实验性)从keep
,short
,random
中进行选择。选择器设置目标层命名策略。
支持的层
激活:
- relu
- 漏洞百出
- selu
- 乙状结肠
- softmax
- 谭
常数
卷积:
- conv2d
- convtrsnpose2d
元素:
- 添加
- mul
- sub
- div
线性
规格化:
- 批次标准2
- 瞬间rm2d
池:
- MaxPool2d
- avgpool2d
- 全局maxpool2d(自适应池到形状[1,1])
使用pytorch2keras转换的模型
- resnet*
- VGG*
- preresnet*
- 登塞内特*
- 亚历克斯内特
- MobileNet 2版
用法
看看tests
目录。
许可证
此软件受麻省理工学院许可证的保护。