当前位置: 首页 > 面试题库 >

如何在python中以编程方式为caffe生成deploy.txt

裴承安
2023-03-14
问题内容

我编写了python代码,以编程方式生成卷积神经网络(CNN),用于训练和验证caffe中的.prototxt文件。下面是我的功能:

def custom_net(lmdb, batch_size):

    # define your own net!
    n = caffe.NetSpec()

    # keep this data layer for all networks
    n.data, n.label = L.Data(batch_size=batch_size, backend=P.Data.LMDB, source=lmdb,
                             ntop=2, transform_param=dict(scale=1. / 255))

    n.conv1 = L.Convolution(n.data, kernel_size=6,
                            num_output=48, weight_filler=dict(type='xavier'))
    n.pool1 = L.Pooling(n.conv1, kernel_size=2, stride=2, pool=P.Pooling.MAX)

    n.conv2 = L.Convolution(n.pool1, kernel_size=5,
                            num_output=48, weight_filler=dict(type='xavier'))
    n.pool2 = L.Pooling(n.conv2, kernel_size=2, stride=2, pool=P.Pooling.MAX)

    n.conv3 = L.Convolution(n.pool2, kernel_size=4,
                            num_output=48, weight_filler=dict(type='xavier'))
    n.pool3 = L.Pooling(n.conv3, kernel_size=2, stride=2, pool=P.Pooling.MAX)

    n.conv4 = L.Convolution(n.pool3, kernel_size=2,
                            num_output=48, weight_filler=dict(type='xavier'))
    n.pool4 = L.Pooling(n.conv4, kernel_size=2, stride=2, pool=P.Pooling.MAX)

    n.fc1 = L.InnerProduct(n.pool4, num_output=50,
                           weight_filler=dict(type='xavier'))

    n.drop1 = L.Dropout(n.fc1, dropout_param=dict(dropout_ratio=0.5))

    n.score = L.InnerProduct(n.drop1, num_output=2,
                             weight_filler=dict(type='xavier'))

    # keep this loss layer for all networks
    n.loss = L.SoftmaxWithLoss(n.score, n.label)

    return n.to_proto()

with open('net_train.prototxt', 'w') as f:
    f.write(str(custom_net(train_lmdb_path, train_batch_size)))

with open('net_test.prototxt', 'w') as f:
    f.write(str(custom_net(test_lmdb_path, test_batch_size)))

有没有办法类似地生成deploy.prototxt以测试不在lmdb文件中的看不见的数据?如果是这样的话,如果有人可以给我提供参考,我将不胜感激。


问题答案:

很简单:

from caffe import layers as L, params as P
def custom_net(lmdb, batch_size):
    # define your own net!
    n = caffe.NetSpec()

    if lmdb is None: # "deploy" flavor
        # assuming your data is of shape 3x224x224
        n.data = L.Input(input_param={'shape':{'dim':[1,3,224,224]}})
    else:
        # keep this data layer for all networks
        n.data, n.label = L.Data(batch_size=batch_size, backend=P.Data.LMDB, source=lmdb,
                         ntop=2, transform_param=dict(scale=1. / 255))
    # the other layers common to all flavors: train/val/deploy...
    n.conv1 = L.Convolution(n.data, kernel_size=6,
                        num_output=48, weight_filler=dict(type='xavier'))
    n.pool1 = L.Pooling(n.conv1, kernel_size=2, stride=2, pool=P.Pooling.MAX)

    n.conv2 = L.Convolution(n.pool1, kernel_size=5,
                        num_output=48, weight_filler=dict(type='xavier'))
    n.pool2 = L.Pooling(n.conv2, kernel_size=2, stride=2, pool=P.Pooling.MAX)

    n.conv3 = L.Convolution(n.pool2, kernel_size=4,
                        num_output=48, weight_filler=dict(type='xavier'))
    n.pool3 = L.Pooling(n.conv3, kernel_size=2, stride=2, pool=P.Pooling.MAX)

    n.conv4 = L.Convolution(n.pool3, kernel_size=2,
                        num_output=48, weight_filler=dict(type='xavier'))
    n.pool4 = L.Pooling(n.conv4, kernel_size=2, stride=2, pool=P.Pooling.MAX)

    n.fc1 = L.InnerProduct(n.pool4, num_output=50,
                       weight_filler=dict(type='xavier'))
    # do you "drop" i deploy as well? up to you to decide...
    n.drop1 = L.Dropout(n.fc1, dropout_param=dict(dropout_ratio=0.5))
    n.score = L.InnerProduct(n.drop1, num_output=2,
                         weight_filler=dict(type='xavier'))

    if lmdb is None:
        n.prob = L.Softmax(n.score)
    else:
        # keep this loss layer for all networks apart from "Deploy"
        n.loss = L.SoftmaxWithLoss(n.score, n.label)

    return n.to_proto()

现在调用函数:

with open('net_deploy.prototxt', 'w') as f:
    f.write(str(custom_net(None, None)))

正如你可以看到有两处修改到prototxt(条件上lmdbNone):
第一个,而不是"Data"一层,你必须声明"Input"层只声明"data",不"label"
第二个变化是输出层:您有一个预测层(而不是损失层)(例如,参见此答案)。



 类似资料:
  • 问题内容: 我想为Java的玩具语言编写一个编译器。我想生成可运行的.class文件。我想知道执行此操作的最佳库或工具是什么?我知道我可以学习所有指令的二进制格式并建立自己的常量池等,但这似乎应该已经完成​​:没必要重新发明轮子,对吗? 在线搜索我发现了两种不同的Java汇编语言Jasmin和Jamaica,但是只有Jasmin看起来有所维护。 是否存在用于将字节码写入流的Java库?这是Apac

  • 问题内容: 我有一系列要用来创建视频的图像。理想情况下,我可以为每个帧指定一个帧持续时间,但是固定帧速率也可以。我正在wxPython中执行此操作,因此可以渲染到wxDC,也可以将图像保存到文件中,例如PNG。是否有Python库可让我根据这些帧创建视频(AVI,MPG等)或动画GIF? 问题答案: 我建议不要使用visvis中的images2gif,因为它在PIL / Pillow方面存在问题,

  • 问题内容: 我有一系列要用来创建视频的图像。理想情况下,我可以为每个帧指定帧持续时间,但是固定帧速率也可以。我正在wxPython中进行此操作,因此可以渲染为wxDC,也可以将图像保存到文件中,例如PNG。是否有Python库可让我根据这些帧创建视频(AVI,MPG等)或动画GIF? 编辑:我已经尝试过PIL,它似乎不起作用。有人可以用这个结论纠正我还是建议其他工具箱?这个链接似乎是在备份关于PI

  • 问题内容: 给定2种rgb颜色和一个矩形区域,我想在这些颜色之间生成基本的线性渐变。我已经进行了快速搜索,唯一能够找到的是此Blog条目,但示例代码似乎丢失了,或者至少是在发布此信息之时。任何帮助,算法,代码示例,等等。这将用Java编写,但是显示层已经处理完毕,我只需要弄清楚如何弄清楚要显示的内容。 问题答案: 您需要在第一和第二种颜色之间进行插值。通过为每个分量(R,G,B)计算相同的插值,可

  • 在控制器中引用FactoryBean,然后。但是,对于这样一个简单的情况,我真的需要创建一个新类吗? 有一个工厂方法来构造托管bean。这个方法仍然存在显式实例化POJO的问题,因此它本身需要对它进行Spring注入。此外,这是完整的样板文件。 bean的构造非常琐碎,所以我认为Spring中有一种更简单的方法来完成它。有吗?

  • 演员系统是惊人的。我想知道我是否能使它更灵活地使用。 我有一系列相关的节点对(可以是文件的形式),比如: A-- 我想在服务器启动时以编程方式生成一个包含6种参与者(即a~F)的系统。而且他们有监督孩子的关系,就像上面提到的两个人。 这对阿克卡有可能吗? 编辑2014-05-28 抱歉搞混了。 我是阿克卡的新手,到目前为止我学到的一些概念可能并不那么准确。 真正的用例是,我想使用包含参与者之间关系