导入需要用到的模块,layer和params
import caffe
from caffe import layers as L
from caffe inport params as P
1. 数据层:
import caffe
from caffe import layers as L
from caffe inport params as P
1. 数据层:
作为每一个模型的最底层,caffe可以读取不同格式的数据,包括lmdb,leveldb,HDF5,原始图片,还可以直接自己定义输入格式
(1). lmdb/leveldb 格式的数据层定义
L.Data(
sourec = path // 数据库的路径(必要参数)
backend = P.Data.LMDB // 指定数据库的格式(必要参数)
batch_size = batch_size // 深度学习都是按照批次来优化求解的,批大小。(必要参数)
ntop = 2 // 输出的blob的个数,两个是指数据和标签(必要参数)
transfrom_param = dict( // 预处理的参数
crop_size = 64 // 对样本裁剪的大小
scale = 1 // 对样本进行缩放,乘上scale
mean_file = meanfile_path // 常用预处理方法,减去均值
mean_value = [104,110,123] // 支持值和均值文件,任选其一
mirror = True // 是否随机对图像进行随机的反转
)
)
(2). HDF5 格式的数据层的定义
L.HDF5Data(
source = path // 数据的路径(必要参数)
batch_size = batch_size // 批处理大小(必要参数)
shuffle = false // 是否将样本随机打乱顺序
)
(3). ImageData 格式的数据层的定义
每张图片的名称作为一行,记录到txt文件中
L.ImageData(
source = list_path // 数据的路径(必要参数)
batch_size = batch_size // 批处理大小(必要参数)
new_width = 64 // 相当于reshape
new_height = 64 // 相当于reshape
ntop = 2 // 输出的blob的个数,两个是指数据和标签(必要参数)
shuffle = false // 是否将样本随机打乱顺序
transform_param = dict(
crop_size = 64 // 对样本裁剪的大小
scale = 1 // 对样本进行缩放,乘上scale
mean_file = meanfile_path // 常用预处理方法,减去均值
mirror = True // 是否随机对图像进行随机的反转
)
)
(4).重写数据读取
L.Python(
module = "read_data" // 重写程序所在文件名称
layer = "input_layer" // 重写的类名
ntop = 2 // 输出的blob的个数
para_str = str(dict( // 重写的程序需要传入的参数
split = "train" // 标注处理训练样本还是测试样本
data_dir = path // 数据的路径
train_data_name = “traindataname” // 训练样本的名字
test_data_name = "testdataname" // 测试样本的名字
........... // 其他程序需要用的参数
)
)
2. 卷积层的定义
L.Convolution(
bottom = bottom // 输入的blob
num_output = // 输出的blob的个数
bias_term = true // 模型是否包含偏置项默认为true
pad = 0 // 是否对样本进行扩展,为了保持维度不变,默认为0
kernel_size = 3 // 卷积核的大小
stride = 1 // 卷积的步长,默认为1
pad_h = 0 // 扩展的高度,默认为0,不可与pad同时存在
pad_w = 0 // 扩展的宽度,默认为0,不可与pad同时存在
kernel_h = 0 // 卷积核的高度,用于非正方形卷积核,与kernel_size不可同时存在
kernel_w = 0 // 卷积核的宽度,用于非正方形卷积核,与kernel_size不可同时存在
stride_h = 0 // 纵向步长,不可与stride同时存在
stride_w = 0 // 横向步长,不可与stride同时存在
weight_filler = dict(type = 'xavier') // 权重的填充
bias_filler = dict(type = 'constant') // 偏置的填充
)
3. 激活层的定义--relu
L.RELU(
bottom = bottom // 输入的blob
negative_slope = 0 // 如果负数则输出negative_slope,默认为0,基本版本
in_palce = true // 用输出blob替换输入blob,可以节省内存,默认为true
)
4. Pooling层的定义
L.Pooling(
bottom = bottom // 输入的blob
pool=P.Pooling.MAX // pooling方式,包括MAX,AVE,STOCHASTIC
pad = 0 // 扩展输入的数据,默认为0
pad_h = 0 // 扩展输入数据的高,不可与pad同时存在
pad_w = 0 // 扩展输入数据的宽,不可与pad同时存在
kernel_size = 2; // pooling核的大小
kernel_h = 0; // pooling核的高,不可和kernel_size同时存在
kernel_w = 0; // pooling核的宽,不可和kernel_size同时存在
stride = 1 // pooling的步长
stride_h = 1; // pooling纵向的步长,不可和stride同时存在
stride_w = 1; // pooling横向的步长,不可和stride同时存在
global_pooling = false // 全局pooling,即整个feature map pooling出一个值
)
5. FullConnect层的定义
L.InnerProduct(
bottom = bottom // 输入的blob
num_output = nout // 输出神经元的个数
bias_term = true // 是否有偏置项
weight_filler = dict(type = 'xavier') // 权重的填充
bias_filler = dict(type = 'constant') // 偏置的填充
)
6. Dropout层的定义
L.Dropout(
bottom = bottom // 输入的blob
dropout_ratio = 0.5 // 按照1-ratio的概率置零
in_place=True // 直接替换blob
)
7. Loss层的定义
L.SoftmaxWithLoss(
bottom = bottom // 输入的blob
label = label // 标签
)
8. Accuracy层的定义
L.Accuracy(
bottom = bottom // 输入的blob
label = label // 标签
)