深度学习框架之caffe(三) —通过NetSpec自定义网络

目录
深度学习框架之caffe(一) —编译安装
深度学习框架之caffe(二) —模型训练和使用
深度学习框架之caffe(三) —通过NetSpec自定义网络
深度学习框架之caffe(四) —可视化与参数提取
深度学习框架之caffe(五) —模型转换至其他框架

python接口模块

安装caffe时,执行make pycaffe -j8 时编译python接口模块,生成_caffe.so, $CAFFE_ROOT/python 目录下包含了caffe的python接口模块,以及简要的demo脚本, 如图所示

image.png

net_spec.py

改文件使得用户可以通过编写python脚本的方式来定义网络结构,并生成文件.prototxt。

使用NetSpec()定义网络结构

import sys
sys.path.insert(0, "/home/ubuntu/caffe/python") # 替换成自己的路径
from caffe import layers as L, params as P
import caffe

def net_body():
    """
    自定义网络结构
    :return: net, 定义好的网络结构,类似dict
    """
    ## 实例化,非常重要,必须 
    net = caffe.NetSpec()  # net 类似dict

    # 2种为n添加层的方式,n[layer_name] = , 或者 n.layer_name= 
    # 具体每一层的参数可参见caffe.proto文件中的定义
    # 添加输入层 方式1
    net["data"] = L.Input(shape=[dict(dim=[1, 3, 256, 256])], ntop=1)

    # 添加输入层 方式2, 其他层相同,下面只提供方式1 添加层的代码
    net.data = L.Input(shape=[dict(dim=[1, 3, 256, 256])], ntop=1)

    # 添加卷积池化relu层
    net["conv"] = L.Convolution(net["data"],  # bottom, 即改层的输入
                                num_output=64,
                                pad=1,
                                kernel_size=3)
    net["pool"] = L.Pooling(net["conv"], pool=P.Pooling.MAX,
                            kernel_size=3, stride=2, pad=0)
    net["relu"] = L.ReLU(net["pool"], in_place=True)

    return net



def make_net(prototxt_file):
    """
    将生成的网络写入文件prototxt_file中
    :param prototxt: .prototxt 格式的文件
    :return: 
    """
    net = net_body()
    with open(prototxt_file, 'w') as f:
        f.write(str(net.to_proto()))

model_libs.py

改文件提供了通过NetSpec()的方式定义实现的几个经典网络结构:VGG, ZF, Inceptionv2, Inceptionv3, ResNet101, ResNet152等。同时定义了一些方法,可用于多次使用的单元,如resnet中的conv-batchnorm块

参考链接
https://blog.csdn.net/happyflyy/article/details/78669143
https://github.com/D-X-Y/caffe-reid/blob/master/models/market1501/generate_caffenet.py
https://www.cnblogs.com/Charles-Wan/p/6442294.html
https://github.com/shelhamer/fcn.berkeleyvision.org/blob/master/pascalcontext-fcn32s/net.py

推荐阅读更多精彩内容