【问题标题】:Issues in save - load apollocaffe models保存问题 - 加载 apollocaffe 模型
【发布时间】:2016-09-18 22:01:48
【问题描述】:

我正在使用以下命令保存经过训练的模型:

net.save(model_name)

然后使用以下命令加载它:

net.load(model_name)

但是在加载模型后,当我尝试使用 net.blobs() 打印 blob 时,它给了我一个空字典。该模型似乎未正确保存或未正确加载。

请在这方面帮助我。提前致谢。

【问题讨论】:

  • 您有net.load(model_name) 的日志输出吗?你如何为你的模型定义网络结构?构建网络后是否需要调用net.load(通过加载prototxt 或使用net.f)?
  • 感谢您的回复。我正在使用来自apollocaffe.com/#Tutorial 的 simple.py。我最终使用 net.save("model.caffemodel") 来保存模型。并尝试加载 net = apollocaffe.ApolloNet("model.caffemodel") 和 net.load("model.caffemodel")。但在这两种情况下,net.loss 都给了我 0.0。我知道我需要加载一些关于网络架构的东西。但我不确定究竟需要加载什么。我尝试了几件事,但没有任何效果。如果您能就此分享您的想法,那就太好了。
  • 我不熟悉“apollocaffe”工作流程。在常规 caffe 中,您有两个文件描述您的模型:model.caffemodel - 一个存储训练权重数值的二进制文件 deploy.prototxt 一个描述网络架构的文本文件:哪些层被使用以及这些层是如何相互连接的。您似乎缺少第二部分:网络结构信息。看看你是否可以使用 apollocaffe 接口保存/加载这个结构。

标签: python machine-learning deep-learning caffe pycaffe


【解决方案1】:

您的问题有两个要素。

保存:

为了加载模型,您必须以HDF5 格式保存它。这可以使用SnapshotLogger 类来完成,如下所示:

from apollocaffe.loggers import SnapshotLogger

SnapshotLogger(snapshot_interval, snapshot_prefix='PATH_TO_YOUR_MODEL',
        log_file="PATH_TO_log.txt")

加载中:

Loading保存模型可以如图:

net = apollocaffe.ApolloNet()
model_path = "../model_name.h5"
net.load(model_path)

【讨论】:

    【解决方案2】:

    我更详细地研究了这个问题的细节,看起来我正在正确保存加载它。问题是加载模型后 net.blobs 将没有任何价值。但是,如果您将加载的模型与任何测试示例一起使用,它就可以正常工作(如预期的那样)。我附上了一个示例代码,灵感来自https://github.com/Russell91/apollocaffe/blob/master/examples/apollocaffe/simple.py 这里可以正常工作:

    import apollocaffe
    from apollocaffe.layers import NumpyData, Convolution, EuclideanLoss
    import numpy as np
    
    def save():
        net = apollocaffe.ApolloNet()
        for i in range(1000):
            example = np.array(np.random.random()).reshape((1, 1, 1, 1)) 
            net.clear_forward()
            net.f(NumpyData('data', example))
            net.f(NumpyData('label', example*3))
            net.f(Convolution('conv', (1,1), 1, bottoms=['data']))
            net.f(EuclideanLoss('loss', bottoms=['conv', 'label']))
            net.backward()
            net.update(lr=0.1)
            if i % 100 == 0:
                print net.loss
            net.save("model.h5")
    
    
    def load():
        print "LOAD"
        net = apollocaffe.ApolloNet()
        net.load("model.h5")
        #example = np.array(np.random.random()).reshape((1, 1, 1, 1))
        example = np.asarray([[[[ 0.92890837]]]])
        net.clear_forward()
        net.f(NumpyData('data', example))
        net.f(NumpyData('label', example*3))
        net.f(Convolution('conv', (1,1), 1, bottoms=['data']))
        net.f(EuclideanLoss('loss', bottoms=['conv', 'label']))
        net.backward()
        net.update(lr=0.1)
        print net.loss
    
    save()
    load()
    

    【讨论】:

    • 您似乎混淆了网络的学习参数(存储在net.layers)和网络对特定输入的响应(即过滤器的输出)(存储在net.blobs) .详情请见this answer
    • @Shai:如何使用 pycaffe 保存求解器状态?我注意到 net.save 只保存 caffemodel?任何想法?谢谢
    • @Breeze 你需要save solver 对象而不是net 对象。 net 不知道求解器状态。
    • @Shai:非常感谢,所以你的意思是使用 solver.snapshot() ?如果是这样,有没有办法我只能创建求解器状态?因为我正在使用特定名称保存 caffemodel,并且我也想保存相应的求解器状态。
    • @Breeze 我对 pycaffe 求解器界面不是很熟悉。为什么不问一个新问题?这些 cmets 不适合此线程
    猜你喜欢
    • 2021-03-08
    • 1970-01-01
    • 2021-08-21
    • 2023-01-24
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 2021-12-15
    • 2019-09-26
    相关资源
    最近更新 更多