精华内容
下载资源
问答
  • pytorch 加载(.pth)格式的模型

    万次阅读 多人点赞 2018-12-28 22:42:02
    有一些非常流行的网络如 resnet、squeezenet、densenet等在pytorch里面都有,包括网络结构和训练好的模型。 pytorch自带模型网址:...按官网加载预训练好的模型: import torchvision.models...

    有一些非常流行的网络如 resnet、squeezenet、densenet等在pytorch里面都有,包括网络结构和训练好的模型。

    pytorch自带模型网址:https://pytorch-cn.readthedocs.io/zh/latest/torchvision/torchvision-models/

    按官网加载预训练好的模型:

    import torchvision.models as models
    
    # pretrained=True就可以使用预训练的模型
    resnet18 = models.resnet18(pretrained=True)
    print(resnet18)

    报错如下:

    requests.exceptions.ConnectionError: ('Connection aborted.', TimeoutError(10060, '由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。', None, 10060, None))

    主要是因为代码会去远端下载模型的参数,而国内的网一般连接不上,这是我们需要手动去下载你要的预训练网络。

    通过地址下载,地址有两种获取方式:

    1.从报错里面获取,上述代码运行时会出现这样一行信息:

    Downloading: "https://download.pytorch.org/models/resnet18-5c106cde.pth" to C:\Users\Luo/.torch\models\resnet18-5c106cde.pth

    复制这个网址到浏览器,有可能打不开,去掉https://,直接输入download.pytorch.org/models/resnet18-5c106cde.pth就可以下载了。

    2.从pytorch的github下找模型的地址:https://github.com/pytorch/vision/tree/master/torchvision/models

    找到对应模型名称点进去找地址

    下载好后自行保存,我是直接存在pytorch models里面

    接下来就是运行这个.pth文件。首先要判断是保存的整个网络结构加参数呢,还是只保存了参数,可以测试一下。这是我的模型是squeezenet1_1,你可以测试自己下载的模型

    import torch
    pthfile = r'E:\anaconda\app\envs\luo\Lib\site-packages\torchvision\models\squeezenet1_1.pth'
    net = torch.load(pthfile)
    print(net)

    结果为

    很明显就是只保存了参数,这是我们要换个方法加载模型

    import torch
    import torchvision.models as models
    
    # pretrained=True就可以使用预训练的模型
    net = models.squeezenet1_1(pretrained=False)
    pthfile = r'E:\anaconda\app\envs\luo\Lib\site-packages\torchvision\models\squeezenet1_1.pth'
    net.load_state_dict(torch.load(pthfile))
    print(net)
    

    结果;

    这下就加载好预训练模型了

    另外,还有一种情况,pretrained = False加载模型也要出错

    比如

    model = torchvision.models.segmentation.fcn_resnet50(pretrained=False)

    运行会显示如下结果:意思是它会把模型下载到缓存里,但是由于网络问题有时他下载不下来,或者每次运行代码都要重新下载,浪费时间。

    这时,我们就手动复制链接下载下来,存放在你的项目里面,然后再把它复制到缓存里面

    这时,需要用终端命令,在notebook上可以这样操作:

    大意就是,先创建缓存地址,同之前报错的地址一样,之后把下载的文件复制到这个路径下,这样他就不会重新去下载了。

    坚持已实践为主,手把手带你做项目,打比赛,写论文。凡原创文章皆提供理论讲解,实验代码,实验数据。只有实践才能成长的更快,关注我们,一起成长进步~

    展开全文
  • pytorch怎么读取.pth文件,以及怎么将torch的.pth文件转化为bin文件进行保存。 import torch import numpy as np path_in="in.pth" path_out="out.pth" #读取文件 #若安装的pytorch是带Cuda的版本,cuda不能用,则...

    pytorch怎么读取.pth文件,以及怎么将torch的.pth文件转化为bin文件进行保存。

    import torch
    import numpy as np
    
    path_in="in.pth"
    path_out="out.pth"
    
    #读取文件
    #若安装的pytorch是带Cuda的版本,cuda不能用,则需要指定为cpu运行
    data_in = torch.load(path_in, 'cpu')
    data_out = torch.load(path_out, 'cpu')
    #将torch的数据格式转化为numpy的数据格式
    in_data = data_in.numpy().astype(np.uint8)
    data_out = data_out.numpy().astype(np.uint8)
    #保存文件
    in_data.tofile("in.bin")
    data_out.tofile("out.bin")
    
    展开全文
  • 今天小编就为大家分享一篇pytorch 加载(.pth)格式的模型实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • pytorch最后的权重文件是.pth格式的。 经常遇到的问题: 进行finutune时,改配置文件中的学习率,发现程序跑起来后竟然保持了以前的学习率, 并没有使用新的学习率。 原因: 首先查看.pth文件中的内容,我们发现它...
  • pytorch .pth模型转tensorflow .pb模型

    千次阅读 热门讨论 2020-01-19 17:21:00
    训练好的pytorch模型如何转化为tensorflow的pb模型? 本人初步使用的是onnx框架: ...使用onnx转pb后,加载pb模型时出现in __call__ raise ValueError("callback %s is not found" % token) ValueError: callbac...

    训练好的pytorch模型如何转化为tensorflow的pb模型?

    本人初步使用的是onnx框架: pytorch --->  onnx ----> tensorflow

    使用onnx转pb后,加载pb模型时出现 in __call__ raise ValueError("callback %s is not found" % token) ValueError: callback pyfunc_0 is not found,本人不才查了很多资料也未解决,https://github.com/onnx/onnx-tensorflow/issues/167, 针对这个问题大家说法不一,有人说resnet18转换过程没有出现这个问题,反正挺玄学的,于是弃用onnx转pb。

    下面分享一下本人使用方法:

    实现的大体过程是 pytorch--->onnx--->keras---->pb

    1.  下载工程https://github.com/nerox8664/pytorch2keras,安装pytorch

    pip install pytorch2keras 
    git clone https://github.com/nerox8664/pytorch2keras.git

    2. 安装依赖库,onnx,  keras, tensorflow, numpy, torch, torchvision, onnx2keras

       本人使用版本为:

    1. tensorflow-gpu==1.12.0
    2. onnx2keras==1.1.17
    3.  pytorch2keras==0.2.3
    4. torch==1.1.0
    5. keras==2.2.4
    6. torchvision==0.4.2

    3. 在pytorch2keras创建torch2tf.py

    # -*- coding: utf-8 -*-
    import sys
    sys.path.append('/workspace/pytorch2keras')  ##engineering path
    import numpy as np
    import torch
    from torch.autograd import Variable
    from pytorch2keras.converter import pytorch_to_keras
    import torchvision
    import os.path as osp
    import os
    os.environ['KERAS_BACKEND'] = 'tensorflow'
    from keras import backend as K
    K.clear_session()
    K.set_image_dim_ordering('tf')
    
    
    import test
    import tensorflow as tf
    
    import torch
    from torch import nn
    from torchsummary import  summary
    from torch.autograd import Variable
    
    from tensorflow.python.keras.backend import get_session
    from tensorflow.python.keras.models import load_model
    from tensorflow.python.framework import graph_util,graph_io
    
    
    from keras.utils import plot_model
    # K.set_image_data_format('channels_first')
    import cv2
    os.environ["CUDA_VISIBLE_DEVICES"] = "1"
    
    
    def softmax(x):
    
        exp_x = np.exp(x)
        softmax_x = exp_x / np.sum(exp_x)
        return softmax_x
    
    def check_error(output, k_model, input_np, epsilon=1e-3):
        pytorch_output = output[0].data.cpu().numpy()
        # pytorch_output = np.max(pytorch_output)
        #print('torch:',pytorch_output)
        # print('=====================')
        # print('torch:',pytorch_output)
        keras_output = k_model.predict(input_np)
        keras_output = keras_output[0]
        # keras_output = np.max(keras_output)
        # print('=====================')
        # print('keras pre:',keras_output)
    
        error = np.max(pytorch_output - keras_output)
        print('Error:', error)
    
        assert error < epsilon
        return error
    
    import numpy as np
    
    def normalization0_1(data):
        _range = np.max(data) - np.min(data)
        data = (data - np.min(data)) / _range
        mean = [0.485, 0.456, 0.406]
        std_ad = [0.229, 0.224, 0.225]
        return np.divide(np.subtract(data, mean), std_ad)
    
    
    def h5_to_pb(h5_model,output_dir,model_name,out_prefix = "output_",):
        if osp.exists(output_dir) == False:
            os.mkdir(output_dir)
        out_nodes = ["output_0_1"]  ##get from init_graph
        # out_nodes.append(out_prefix + str(0))
        tf.identity(h5_model.output[0], out_prefix+str(0))
        sess = get_session()
        init_graph = sess.graph.as_graph_def() ##get out_nodes
        main_graph = graph_util.convert_variables_to_constants(sess,init_graph,out_nodes)
        graph_io.write_graph(main_graph,output_dir,name = model_name,as_text = False)
    
    
    if __name__ == '__main__':
        ##step1: load pytorch model
        model = test.main()
        model = model.cuda()  ##cuda
        summary(model, (3, 448, 448))  ##summary(model, (channels, pic_h, pic_w))
        model.eval()
    
        ##step2: pytorch .pth to keras .h5  and test .h5
        input_np = np.random.uniform(0, 1, (1,3, 448, 448))
        input_var = Variable(torch.FloatTensor(input_np)).cuda()  ##cuda
        # input_var = Variable(torch.FloatTensor(input_np))
        k_model = pytorch_to_keras(model, input_var, (3, 448, 448,), verbose=True, name_policy='short')
        k_model.summary()
        k_model.save('my_model.h5')
    
        output = model(input_var)
        check_error(output, k_model, input_np)  ## check the error between .pth and .h5
    
    
        ##step3: load .h5 and .h5 to .pb
        tf.keras.backend.clear_session()
        tf.keras.backend.set_learning_phase(0)  ##不可少,
        my_model = load_model('my_model.h5')
        h5_to_pb(my_model, output_dir='./model/', model_name='model.pb')
    
    
        ##step4:  load .pb and test .pb
        pb_path = './model/model.pb'
        with tf.Session() as sess:
            tf.global_variables_initializer().run()
            graph_def = tf.GraphDef()
    
            with tf.gfile.GFile(pb_path, 'rb') as f:
                graph_def.ParseFromString(f.read())
                _ = tf.import_graph_def(graph_def, name="")
    
            pic_file = './datasets/data'
            pic_list = os.listdir(pic_file)
            for name in pic_list:
                img_path = '{}/{}'.format(pic_file, name)
                im = cv2.imread(img_path)
                im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
                img = cv2.resize(im, (448, 448))
                img = np.asarray(img, dtype=np.float32)
                img = normalization0_1(img)
                img_data = np.transpose(img, (2, 0, 1))
                img_input = np.asarray(img_data, dtype=np.float32)[np.newaxis, :, :, :]
    
                input = sess.graph.get_tensor_by_name("input_0:0")
                output = sess.graph.get_tensor_by_name("output_0_1:0")
                pre_label = sess.run([output],feed_dict={input:img_input})
                pre_label = pre_label[0][0]
                # print(pre_label)
                pre_label = np.argmax(softmax(pre_label))
                print('------------------------')
                print('{} prelabel is {}'.format(pic_name, pre_label))
    
    
    
    

    对代码步骤解释:

    1. 加载自己的pytorch模型,参数与网络结构,利用summary()可将模型结构打印出来,注意BN层参数为2*channels,这是因为pytorch中只有可学习的参数才称为params,故.pth中的BN层参数为2*channels,默认参数eps=1e-0.5  momentum=0.1

    torch.nn.BatchNorm1d(num_features,eps=1e-05,momentum=0.1,affine=True,track_running_stats=True)

     

    ##step1: load pytorch model
    model = test.main()  ##load network and params
    model = model.cuda()  ##cuda
    summary(model, (3, 448, 448))  ##summary(model, (channels, pic_h, pic_w))
    model.eval()

         

     

    •    2. 将pytorch的.pth模型转化为keras的.h5模型

    ##step2: pytorch .pth to keras .h5  and test .h5
    input_np = np.random.uniform(0, 1, (1,3, 448, 448))
    input_var = Variable(torch.FloatTensor(input_np)).cuda()  ##cuda
    # input_var = Variable(torch.FloatTensor(input_np))
    k_model = pytorch_to_keras(model, input_var, (3, 448, 448,), verbose=True, name_policy='short')
    k_model.summary()
    k_model.save('my_model.h5')

    训练参数是一样的,这里需要解释一下.h5模型中的None-trainable params, 这是因为.h5的BN层默认参数为4*channels, 2*channels个参数是非训练参数;默认参数 momentum=0.99, epsilon=0.001,可以看到keras与pytorch中BN操作的默认参数是不同的。

    keras.layers.normalization.BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001, center=True, scale=True, beta_initializer='zeros', gamma_initializer='ones', moving_mean_initializer='zeros', moving_variance_initializer='ones', beta_regularizer=None, gamma_regularizer=None, beta_constraint=None, gamma_constraint=None)
    

     

     

    3. 测试.pth与.h5模型输出结果是否有出入,测试结果Error: -6.1035156e-05。将各层参数打印出来进行比对后,猜测应该是两个模型的BN默认参数不一致导致的。

    ##step3: check the error between .pth and .h5
    output = model(input_var)
    check_error(output, k_model, input_np) 

    4. 将.h5模型转化为.pb模型,可在init_graph = sess.graph.as_graph_def()处加断点,查看输出节点名称,然后对out_nodes名称进行修改。 重点: 不要直接使用keras中backend,请使用tf中的keras进行相关操作,不然后期会遇到很多坑。

    ##step4: load .h5 and .h5 to .pb
    tf.keras.backend.clear_session()
    tf.keras.backend.set_learning_phase(0)  ##不可少,
    my_model = load_model('my_model.h5')
    my_model.summary()
    h5_to_pb(my_model, output_dir='./model/', model_name='model.pb')

    5. 调用加载.pb模型, pic_file存放测试图片,结果就不再显示了,和.pth原模型结果会有一些差距,因为.h5与.pth的BN初始化不同导致的,基本不影响分类结果。

    注意请查看自己的数据是否进行了预处理过程,我这里的pytorch的数据先进行了归一化处理Normalize = transforms.Normalize(std=[0.485, 0.456, 0.406], mean=[0.229, 0.224, 0.225])再进入模型训练的,故固化后的模型不包括预处理过程。后期使用pb模型时需要先对数据进行预处理,确保二者的预处理过程一致。pytorch中的 transforms.Normalize操作本质是分为两步进行的, step1: 归一化,将数值缩小到0-1区间内。step2: 标准化,将数值聚集在mean附近,方差为std

    ##step4:  load .pb and test .pb
    pb_path = './model/model.pb'
    with tf.Session() as sess:
        tf.global_variables_initializer().run()
        graph_def = tf.GraphDef()
    
        with tf.gfile.GFile(pb_path, 'rb') as f:
            graph_def.ParseFromString(f.read())
            _ = tf.import_graph_def(graph_def, name="")
    
        pic_file = './datasets/data'
        pic_list = os.listdir(pic_file)
        for name in pic_list:
            img_path = '{}/{}'.format(pic_file, name)
            im = cv2.imread(img_path)
            im = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
            img = cv2.resize(im, (448, 448))
            img = np.asarray(img, dtype=np.float32)
            img = normalization0_1(img)
            img_data = np.transpose(img, (2, 0, 1))
            img_input = np.asarray(img_data, dtype=np.float32)[np.newaxis, :, :, :]
    
            input = sess.graph.get_tensor_by_name("input_0:0")
            output = sess.graph.get_tensor_by_name("output_0_1:0")
            pre_label = sess.run([output], feed_dict={input: img_input})
            pre_label = pre_label[0][0]
            # print(pre_label)
            pre_label = np.argmax(softmax(pre_label))
            print('------------------------')
            print('{} prelabel is {}'.format(pic_name, pre_label))
    ## 支持层名称
    * Activations:
        + ReLU
        + LeakyReLU
        + SELU
        + Sigmoid
        + Softmax
        + Tanh
    * Constants
    * Convolutions:
        + Conv2d
        + ConvTrsnpose2d
    * Element-wise:
        + Add
        + Mul
        + Sub
        + Div
    * Linear
    * Normalizations:
        + BatchNorm2d
        + InstanceNorm2d
    * Poolings:
        + MaxPool2d
        + AvgPool2d
        + Global MaxPool2d (adaptive pooling to shape [1, 1])
    
    ## Models converted with pytorch2keras
    * ResNet*
    * VGG*
    * PreResNet*
    * DenseNet*
    * AlexNet
    * Mobilenet v2
    展开全文
  • 目的:把训练好的pth模型参数提取出来,然后用其他方式部署到边缘设备。pytorch给了很方便的读取参数接口:nn.module.parameters()直接看demo:from torchvision.models.alexnet import alexnetmodel = alexnet...

    目的:

    把训练好的pth模型参数提取出来,然后用其他方式部署到边缘设备。

    pytorch给了很方便的读取参数接口:

    nn.module.parameters()

    直接看demo:

    from torchvision.models.alexnet import alexnet

    model = alexnet(pretrained=true).eval().cuda()

    parameters = model.parameters()

    for p in parameters:

    numpy_para = p.detach().cpu().numpy()

    print(type(numpy_para))

    print(numpy_para.shape)

    上面得到的numpy_para就是numpy参数了~

    note:

    model.parameters()是以一个生成器的形式迭代返回每一层的参数。所以用for循环读取到各层的参数,循环次数就表示层数。

    而每一层的参数都是torch.nn.parameter.parameter类型,是tensor的子类,所以直接用tensor转numpy(即p.detach().cpu().numpy())的方法就可以直接转成numpy矩阵。

    方便又好用,爆赞~

    补充:pytorch训练好的.pth模型转换为.pt

    将python训练好的.pth文件转为.pt

    import torch

    import torchvision

    from unet import unet

    model = unet(3, 2)#自己定义的网络模型

    model.load_state_dict(torch.load("best_weights.pth"))#保存的训练模型

    model.eval()#切换到eval()

    example = torch.rand(1, 3, 320, 480)#生成一个随机输入维度的输入

    traced_script_module = torch.jit.trace(model, example)

    traced_script_module.save("model.pt")

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持萬仟网。如有错误或未考虑完全的地方,望不吝赐教。

    如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

    展开全文
  • pytorch模型加载.pth文件与使用心得

    万次阅读 多人点赞 2019-09-04 20:59:13
    pyroch使用心得1.pytorch模型加载的方法1.1 保存整个神经网络的结构信息和模型的参数信息,save的对象是网络...不加载预训练的参数1.5加载部分预训练模型1.6微该基础模型2.pytorch使用总结(持续更新....)2.1Tensors...
  • pytorch加载预训练模型(.pth格式)

    千次阅读 2020-08-21 18:15:28
    pytorch自带模型网址: https://pytorch-cn.readthedocs.io/zh/latest/torchvision/torchvision-models/ 官方预训练模型调用代码: ... 官方文档地址 : ...1. 按官网加载预训练好的模型:
  • pytorch加载训练模型

    2020-04-10 15:34:42
    pytorch加载.pth格式的训练模型 在pytorch/vision/models网页上有很多现成的经典网络模型可以调用,其中包括alexnet、vgg、googlenet、resnet、inception、densenet、mobilenet等。把模型下载下来之后,打开模型...
  • pytorch 加载已训练好的(.pth)格式模型

    千次阅读 2020-05-23 13:33:29
    1 简介 pytorch里有一些非常流行的网络如 resnet、wide_resnet101_2、squeezenet、densenet等,包括...按照官网加载预训练的模型: import torchvision.models as models # pretrained=True就可以使用预训练的模型
  • Pytorch加载的预训练模型参数为.pth文件,这里使用提前下载好的’ resnet18-5c106cde.pth’ 下载地址:https://download.pytorch.org/models/resnet18-5c106cde.pth 本文是为作者解决如下error: 在加载...
  • PyTorch加载预训练模型

    万次阅读 2018-11-15 20:27:54
    Pytorch保存和加载整个模型: torch.save(model, 'model.pth') model = torch.load('model.pth') Pytorch保存和加载预训练模型参数: torch.save(model.state_dict(), 'params.pth') model.load_state_dict...
  • Pytorch加载模型

    2020-01-09 18:51:57
    一、假设我们只保存了模型的参数(model.state_dict())到文件名为modelparameters.pth, model = Net() ...checkpoint = torch.load('modelparameters.pth') model.load_state_dict(checkpoint) 2. cpu...
  • 文章目录1 简介2 下载相应模型3 加载已保存的模型参考链接:网盘下载链接: 1 简介 pytorch里有一些非常流行的网络如 resnet、wide_resnet101_2、squeezenet、densenet等,包括网络结构和训练好的模型。...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 247
精华内容 98
关键字:

pytorch加载pth