tensorflow和pytorch模型之间转换

参考链接:
https://github.com/bermanmaxim/jaccardSegment/blob/master/ckpt_to_dd.py

一. tensorflow模型转pytorch模型

import tensorflow as tf
import deepdish as dd
import argparse
import os
import numpy as np

def tr(v):
    # tensorflow weights to pytorch weights
    if v.ndim == 4:
        return np.ascontiguousarray(v.transpose(3,2,0,1))
    elif v.ndim == 2:
        return np.ascontiguousarray(v.transpose())
    return v

def read_ckpt(ckpt):
    # https://github.com/tensorflow/tensorflow/issues/1823
    reader = tf.train.NewCheckpointReader(ckpt)
    weights = {n: reader.get_tensor(n) for (n, _) in reader.get_variable_to_shape_map().items()}
    pyweights = {k: tr(v) for (k, v) in weights.items()}
    return pyweights
if __name__ == ‘__main__‘:
    parser = argparse.ArgumentParser(description="Converts ckpt weights to deepdish hdf5")
    parser.add_argument("infile", type=str,
                        help="Path to the ckpt.")  # ***model.ckpt-22177***
    parser.add_argument("outfile", type=str, nargs=‘?‘, default=‘‘,
                        help="Output file (inferred if missing).")
    args = parser.parse_args()
    if args.outfile == ‘‘:
        args.outfile = os.path.splitext(args.infile)[0] + ‘.h5‘
    outdir = os.path.dirname(args.outfile)
    if not os.path.exists(outdir):
        os.makedirs(outdir)
    weights = read_ckpt(args.infile)
    dd.io.save(args.outfile, weights)

  

1.运行上述代码后会得到model.h5模型,如下:
备注:保持tensorflow和pytorch使用的python版本一致

2.使用:在pytorch内加载改模型:
这里假设网络保存时参数命名一致

net = ...
import torch
import deepdish as dd
net = resnet50(..)
model_dict = net.state_dict()
#先将参数值numpy转换为tensor形式
pretrained_dict =  = dd.io.load(‘./model.h5‘)
new_pre_dict = {}
for k,v in pretrained_dict.items():
    new_pre_dict[k] = torch.Tensor(v)
#更新
model_dict.update(new_pre_dict)
#加载
net.load_state_dict(model_dict)

  

二. pytorch转tensorflow(待续。。)

原文:https://blog.csdn.net/weixin_42699651/article/details/88932670

原文地址:https://www.cnblogs.com/qbdj/p/11024565.html

时间: 2024-10-31 22:04:05

tensorflow和pytorch模型之间转换的相关文章

生产与学术之Pytorch模型导出为安卓Apk尝试记录

生产与学术 写于 2019-01-08 的旧文, 当时是针对一个比赛的探索. 觉得可能对其他人有用, 就放出来分享一下 生产与学术, 真实的对立... 这是我这两天对pytorch深度学习->android实际使用的这个流程的一个切身感受. 说句实在的, 对于模型转换的探索, 算是我这两天最大的收获了... 全部浓缩在了这里: https://github.com/lartpang/DHSNet-PyTorch/blob/master/converter.ipynb 鉴于github加载ipyn

pytorch模型转caffe模型

Pytorch模型转换Caffe模型踩坑指南,代码使用的是Github上的工程,地址:https://github.com/longcw/pytorch2caffe 操作环境:ubuntu = 14.04 miniconda 3 caffe pytorch = 0.2.0 torchvision = 0.1.8 python = 2.7 环境配置: 第一步 : 在miniconda创建一个虚拟环境pytorch2caffe : conda create -n pytorch2caffe pyth

TensorFlow or PyTorch

既然你已经读到了这篇文章,我就断定你已经开始了你的深度学习之旅了,并且对人造神经网络的研究已经有一段时间了:或者也许你正打算开始你的学习之旅.无论是哪一种情况,你都是因为发现你陷入了困惑中,才找到了这篇文章.你可能查询浏览了各种各样的深度学习的框架和库,但是其中有两个比较突出,他们是两个最流行的深度学习库:TensorFlow 和 PyTorch.你没有办法指出这两个库有什么本质的不同,不用担心!我将在这网络上无休止的存储空间中添加一篇新的文章,也许可以帮你弄清楚一些问题.我将简要的快速的给出你

PowerDesigner之CDM、PDM、SQL之间转换

前段时间用了下PowerDesigner做了一些辅助工作.在此特地小结一下: 有关CDM.PDM.SQL之间转换以及不同数据库之间库表Sql的移植,首先要了解的是它们各自的用途.这里就简单的描述一下,不做详细的解释了. CDM:概念数据模型.CDM就是以其自身方式来描述E-R图.它不考虑物理实现的细节,只表示数据库的整体逻辑结构,独立于任何软件和数据存储结构. PDM:物理数据模型.考虑了数据库的物理实现,包括软件和数据存储结构,即:PDM与具体的数据库有关. 下面做了个简单的例子,简述了CDM

Mono Fragment之间转换

var newFragment = new mybacklogF (); var ft = FragmentManager.BeginTransaction (); ft.Replace (Resource.Id.main_FragmentContainer, newFragment,"Homepage"); ft.AddToBackStack ("Homepage"); ft.Commit (); 后退 Button btnBack = view.FindView

两个盒模型之间的空隙

html文档中的每个元素都被描绘成矩形盒子,这些矩形盒子通过一个模型来描述其占用空间,这个模型称为盒模型.盒模型通过四个边界来描述:margin(外边距),border(边框),padding(内边距),content(内容区域),这个大家都知道,那什么是两个盒模型之间的空隙呢?该怎么清除它呢? 假设有一个class为content的父div,里面包含两个子div,这两个子div要同一行显示,我们想要两个子div紧紧连接在一起,所以把它们的margin和padding值全部设为0. 1 <sty

程序猿之---C语言细节20(符号和有符号之间转换、两数相加溢出后数值计算)

主要内容:无符号和有符号之间转换.两数相加溢出后数值计算 #include <stdio.h> /* 这个函数存在潜在漏洞 */ float sum_elements(float a[], unsigned length) { int i; float result = 0; for(i = 0; i <= length - 1; i++) { result += a[i]; printf("a[%d] = %f \n",i,a[i]); } return resul

Java中int类型和tyte[]之间转换及byte[]合并

JAVA基于位移的 int类型和tyte[]之间转换 [java] view plaincopy /** * 基于位移的int转化成byte[] * @param int number * @return byte[] */ public static byte[] intToByte(int number) { byte[] abyte = new byte[4]; // "&" 与(AND),对两个整型操作数中对应位执行布尔代数,两个位都为1时输出1,否则0. abyte[

不能在utf8和UCS2之间转换:failUTF8Conv

问题描述:项目已经上线了好几个月了,一直运行良好,某一天系统不能正常运行了,hibernate连接数据库出现问题:从日志中看到 "不能在utf8和UCS2之间转换:failUTF8Conv"错误:一时疑惑,经过确认,是与此系统对接的oracle数据库系统进行了升级,导致从他们数据库同步基础数据出现问题: 解决办法:重新下载对应的oracle jdbc驱动,应用于项目中,系统运行正常. 下载地址:http://www.oracle.com/technetwork/database/ent