gpt4 book ai didi

javascript - 如何将 tensorflow.js 模型权重转换为 pytorch 张量,然后返回?

转载 作者:行者123 更新时间:2023-12-05 06:55:25 25 4
gpt4 key购买 nike

我正在使用 ml5.js ,一个围绕 tensorflowjs 的包装器。我想在浏览器中训练一个神经网络,下载权重,在 pyTorch 中将它们处理为张量,然后将它们加载回浏览器的 tensorflowjs 模型中。如何在这些格式之间进行转换 tfjs <-> pytorch

浏览器型号有save()生成三个文件的函数。一个特定于 ml5.js 的元数据文件 (json)、一个描述模型架构的拓扑文件 (json) 和一个二进制权重文件 (bin)。

// Browser
model.save()
// HTTP/Download
model_meta.json (needed by ml5.js)
model.json (needed by tfjs)
model.weights.bin (needed by tfjs)
# python backend
import json

with open('model.weights.bin', 'rb') as weights_file:
with open('model.json', 'rb') as model_file:
weights = weights_file.read()
model = json.loads(model_file.read())
####
pytorch_tensor = convert2tensor(weights, model) # whats in this function?
####
# Do some processing in pytorch

####
new_weights_bin = convert2bin(pytorch_tensor, model) # and in this?
####

Here is sample javascript code在浏览器中生成并加载 3 个文件。要加载,请在对话框中一次选择所有 3 个文件。如果它们是正确的,弹出窗口将显示示例预测。

最佳答案

我找到了一种从 tfjs model.weights.bin 转换的方法到 numpy 的 ndarrays .从 numpy 数组转换为 pytorch 很简单 state_dict这是张量及其名称的字典。

理论

首先,应该了解模型的 tfjs 表示。 model.json描述模型。在python中,它可以作为字典来阅读。它具有以下键:

  1. 模型架构被描述为关键字 modelTopology 下的另一个 json/字典.

  2. 在键weightsManifest 下还有一个json/字典它描述了包裹在相应 model.weights.bin 中的每个重量的类型/形状/位置文件。顺便说一句,权重 list 允许多个 .bin存储权重的文件。

Tensorflow.js 有一个配套的 python 包 tensorflowjs ,它带有 read 的实用函数和 write tf.js 二进制和 numpy 数组格式之间的权重。

每个权重文件都被读取为一个“组”。组是带有键的字典列表 namedata它指的是权重名称和包含权重的 numpy 数组。也可以选择其他键。

group = [{'name': weight_name, 'data': np.ndarray}, ...]   # 1 *.bin file

申请

安装tensorflowjs。不幸的是,它还会安装 tensorflow。

pip install tensorflowjs

使用这些功能。请注意,为方便起见,我更改了签名。

from typing import Dict, ByteString
import torch
from tensorflowjs.read_weights import decode_weights
from tensorflowjs.write_weights import write_weights

def convert2tensor(weights: ByteString, model: Dict) -> Dict[str, torch.Tensor]:
manifest = model['weightsManifest']
# If flatten=False, returns a list of groups equal to the number of .bin files.
# Use flatten=True to convert to a single group
group = decode_weights(manifest, weights, flatten=True)
# Convert dicts in tfjs group format into pytorch's state_dict format:
# {name: str, data: ndarray} -> {name: tensor}
state_dict = {d['name']: torch.from_numpy(d['data']) for d in group}
return state_dict

def convert2bin(state_dict: Dict[str: np.ndarray], model: Dict, directory='./'):
# convert state_dict to groups (list of 1 group)
groups = [[{'name': key, 'data': value} for key, value in state_dict.items()]]
# this library function will write to .bin file[s], but you can read it back
# or change the function internals my copying them from source
write_weights(groups, directory, write_manifest=False)

关于javascript - 如何将 tensorflow.js 模型权重转换为 pytorch 张量,然后返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65350949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com