Caffe实现概述
Caffe實(shí)現(xiàn)概述
目錄
一、caffe配置文件介紹
二、標(biāo)準(zhǔn)層的定義
三、網(wǎng)絡(luò)微調(diào)技巧
四、Linux腳本使用及LMDB文件生成
五、帶你設(shè)計(jì)一個(gè)Caffe網(wǎng)絡(luò),用于分類任務(wù)
一、caffe配置文件介紹
二、標(biāo)準(zhǔn)層的定義
三、網(wǎng)絡(luò)微調(diào)技巧
其中,multistep最為常用
四、Linux腳本使用及LMDB文件生成
五、帶你設(shè)計(jì)一個(gè)Caffe網(wǎng)絡(luò),用于分類任務(wù)
下面:
使用pycaffe生成solver配置
使用pycaffe生成caffe測(cè)試網(wǎng)絡(luò)和訓(xùn)練網(wǎng)絡(luò)
數(shù)據(jù)集下載:
demoCaffe
數(shù)據(jù)集下載,cifar mnist:
百度云盤:
鏈接: https://pan.baidu.com/s/1bHFQUz7Q6BMBZv25AhsXKQ 密碼: dva9
鏈接: https://pan.baidu.com/s/1rPRjf2hanlYYjBQQDmIjNQ 密碼: 5nhv
-
lmdb數(shù)據(jù)制作:
手動(dòng)實(shí)現(xiàn): https://blog.csdn.net/yx2017/article/details/72953537
https://www.jianshu.com/p/9d7ed35960cb
代碼實(shí)現(xiàn):https://www.cnblogs.com/leemo-o/p/4990021.html
https://www.jianshu.com/p/ef84715e0fdc
以下僅供對(duì)比閱讀:
demo_lmdb.py: 生成lmdb格式數(shù)據(jù) -
import lmdb
-
import numpy as np
-
import cv2
-
import caffe
-
from caffe.proto import caffe_pb2
-
def write():
-
# basic setting -
lmdb_file = 'lmdb_data' -
batch_size = 256 -
lmdb_env = lmdb.open(lmdb_file, map_size = int(1e12)) -
lmdb_txn = lmdb_env.begin(write = True) -
for x in range(batch_size): -
data = np.ones((3, 64, 64), np.uint8) -
label = x -
datum = caffe.io.array_to_datum(data,label) -
keystr = "{:0>8d}".format(x) -
lmdb_txn.put(keystr, datum.SerializeToString()) -
lmdb_txn.commit() -
def read():
-
lmdb_env = lmdb.open('lmdb_data') -
lmdb_txt = lmdb_env.begin() -
datum = caffe_pb2.Datum() -
for key, value in lmdb_txt.cursor(): -
datum.ParseFromString(value) -
label = datum.label -
data = caffe.io.datum_to_array(datum) -
print(label) -
print(data) -
if name == ‘main’:
-
write() -
read()
demo_create_solver.py: 生成solver配置文件
- from caffe.proto import caffe_pb2
- s = caffe_pb2.SolverParameter()
- s.train_net = “train.prototxt”
- s.test_net.append(“test.prototxt”)
- s.test_interval = 100
- s.test_iter.append(10)
- s.max_iter = 1000
- s.base_lr = 0.1
- s.weight_decay = 5e-4
- s.lr_policy = “step”
- s.display = 10
- s.snapshot = 10
- s.snapshot_prefix = “model”
- s.type = “SGD”
- s.solver_mode = caffe_pb2.SolverParameter.GPU
- with open(“net/s.prototxt”, “w”) as f:
-
f.write(str(s))
結(jié)果如下:
- train_net: “/home/kuan/PycharmProjects/demo_cnn_net/net/train.prototxt”
- test_net: “/home/kuan/PycharmProjects/demo_cnn_net/net/test.prototxt”
- test_iter: 1000
- test_interval: 100
- base_lr: 0.10000000149
- display: 100
- max_iter: 100000
- lr_policy: “step”
- weight_decay: 0.000500000023749
- snapshot: 100
- snapshot_prefix: “/home/kuan/PycharmProjects/demo_cnn_net/cnn_model/mnist/lenet/”
- solver_mode: GPU
- type: “SGD”
demo_creat_net.py: 創(chuàng)建網(wǎng)絡(luò) - import caffe
- def create_net():
-
net = caffe.NetSpec() -
net.data, net.label = caffe.layers.Data(source="data.lmdb", -
backend=caffe.params.Data.LMDB, -
batch_size=32, -
ntop=2, #數(shù)據(jù)層數(shù)據(jù)個(gè)數(shù),分別為data,label -
transform_param=dict(crop_size=40, mirror=True) -
) -
net.conv1 = caffe.layers.Convolution(net.data, num_output=20, kernel_size=5, -
weight_filler={"type": "xavier"}, -
bias_filler={"type":"xavier"}) #卷積核參數(shù) -
net.relu1 = caffe.layers.ReLU(net.conv1, in_place=True) -
net.pool1 = caffe.layers.Pooling(net.relu1, pool=caffe.params.Pooling.MAX, -
kernel_size=3, stride=2) -
net.conv2 = caffe.layers.Convolution(net.pool1, num_output=32, kernel_size=3, -
pad=1, -
weight_filler={"type": "xavier"}, -
bias_filler={"type": "xavier"}) -
net.relu2 = caffe.layers.ReLU(net.conv2, in_place=True) -
net.pool2 = caffe.layers.Pooling(net.relu2, pool=caffe.params.Pooling.MAX, -
kernel_size=3, stride=2) -
#下面為全連接層 -
net.fc3 = caffe.layers.InnerProduct(net.pool2, num_output=1024, weight_filler=dict(type='xavier')) -
net.relu3 = caffe.layers.ReLU(net.fc3, in_place=True) -
##drop -
net.drop = caffe.layers.Dropout(net.relu3, dropout_param=dict(dropout_ratio=0.5)) -
net.fc4 = caffe.layers.InnerProduct(net.drop, num_output=10, weight_filler=dict(type='xavier')) -
net.loss = caffe.layers.SoftmaxWithLoss(net.fc4, net.label) -
with open("net/tt.prototxt", 'w') as f: -
f.write(str(net.to_proto())) - if name == ‘main’:
-
create_net()
生成結(jié)果如下:
- layer {
- name: “data”
- type: “Data”
- top: “data”
- top: “l(fā)abel”
- transform_param {
-
mirror: true -
crop_size: 40 - }
- data_param {
-
source: "/home/kuan/PycharmProjects/demo_cnn_net/lmdb_data" -
batch_size: 32 -
backend: LMDB - }
- }
- layer {
- name: “conv1”
- type: “Convolution”
- bottom: “data”
- top: “conv1”
- convolution_param {
-
num_output: 20 -
kernel_size: 5 -
weight_filler { -
type: "xavier" -
} -
bias_filler { -
type: "xavier" -
} - }
- }
- layer {
- name: “relu1”
- type: “ReLU”
- bottom: “conv1”
- top: “conv1”
- }
- layer {
- name: “pool1”
- type: “Pooling”
- bottom: “conv1”
- top: “pool1”
- pooling_param {
-
pool: MAX -
kernel_size: 3 -
stride: 2 - }
- }
- layer {
- name: “conv2”
- type: “Convolution”
- bottom: “pool1”
- top: “conv2”
- convolution_param {
-
num_output: 32 -
pad: 1 -
kernel_size: 3 -
weight_filler { -
type: "xavier" -
} -
bias_filler { -
type: "xavier" -
} - }
- }
- layer {
- name: “relu2”
- type: “ReLU”
- bottom: “conv2”
- top: “conv2”
- }
- layer {
- name: “pool2”
- type: “Pooling”
- bottom: “conv2”
- top: “pool2”
- pooling_param {
-
pool: MAX -
kernel_size: 3 -
stride: 2 - }
- }
- layer {
- name: “fc3”
- type: “InnerProduct”
- bottom: “pool2”
- top: “fc3”
- inner_product_param {
-
num_output: 1024 -
weight_filler { -
type: "xavier" -
} - }
- }
- layer {
- name: “relu3”
- type: “ReLU”
- bottom: “fc3”
- top: “fc3”
- }
- layer {
-
name: "drop" -
type: "Dropout" -
bottom: "fc3" -
top: "drop" -
dropout_param { -
dropout_ratio: 0.5 -
} - }
- layer {
-
name: "fc4" -
type: "InnerProduct" -
bottom: "drop" -
top: "fc4" -
inner_product_param { -
num_output: 10 -
weight_filler { -
type: "xavier" -
} -
} - }
- layer {
-
name: "loss" -
type: "SoftmaxWithLoss" -
bottom: "fc4" -
bottom: "label" -
top: "loss" - }
demo_train.py訓(xùn)練網(wǎng)絡(luò): - import sys
- sys.path.append(’/home/kuan/AM-softmax_caffe/python’)
- import caffe
- solver = caffe.SGDSolver("/home/kuan/PycharmProjects/demo_cnn_net/cnn_net/alexnet/solver.prototxt")
- solver.solve()
demo_test.py:測(cè)試網(wǎng)絡(luò) - import sys
- sys.path.append(’/home/kuan/AM-softmax_caffe/python’)
- import caffe
- import numpy as np
- ##caffemodel deploy.prototxt
- deploy = “/home/kuan/PycharmProjects/demo_cnn_net/cnn_net/alexnet/deploy.prototxt”
- model = “/home/kuan/PycharmProjects/demo_cnn_net/cnn_model/cifar/alexnet/alexnet_iter_110.caffemodel”
- net = caffe.Net(deploy, model, caffe.TEST)
- net.blobs[“data”].data[…] = np.ones((3,32,32),np.uint8)
- net.forward()
- prob = net.blobs[“prob”].data[0]
- print(prob)
總結(jié)
- 上一篇: Halide视觉神经网络优化
- 下一篇: 元算子卷积层实现