生成solver文件:
from caffe.proto import caffe_pb2
s = caffe_pb2.SolverParameter()
s.train_net = "train.prototxt" # 定义网络名为trai.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.snapshop = 10.
# 定义模型存放路径
s.snapshop_prefix_prefix = "model"
s.type="SGD"
s.solver_mode=caffe_pb2.SolverParameter.GPU #定义网络优化使用gpu
#生成solver文件s.prototxt
with open('net/s.prototxt','w') as f:
f.write(str(s))
创建create_net.py 生成网络:
# 生成caffe网络
import caffe
def create_net():
net=caffe.NetSpec() #生成网络net,用于放layer层
# 定义数据层, 定义成lmdb数据格式
# 参数ntop=2,表示数据种类的格式有2个分别为data和label
net.data,net.label = caffe.layers.Data(source="data.lmdb",
backend=caffe.params.Data.LMDB,
batch_size=32,
ntop=2,
transform_param=dict(crop_size=40,mirror=True)
)
# 定义卷积层 输入为data层,核数20,weight_filter卷积核初始化参数
net.conv1=caffe.layers.Convolution(net.data,
num_output=20,
kernel_size=5,
weight_filter={'type':'xavier'},
bias_filter={'type':'xavier'}
)
# 定义激活层
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)
# 上述是定义了一层 如果有多层 将卷积层+relu+池化 重复几遍即可, 要修改核数 or 核大小 or padding
# 定义全连接层 fc输出为1024
net.fc3=caffe.layers.InnerProduct(net.pool1,num_output=1024,weight_filter=dict(type='xavier'))
#定义激活函数
net.relu2=caffe.layers.ReLU(net.fc3,in_place=True)
#定义dropout层
net.drop = caffe.layers.Dropout(net.relu2,dropout_param=dict(dropout_ratio=0.5))
# 定义输出层
net.loss=caffe.layers.SoftmaxWithLoss(net.fc3,net.label)
#将网络写入文件中,即生成prototxt文件
with open('net/tt.prototxt','w') as f:
f.write(str(net.to_proto)) # to_proto方法生成prototxt文件
if __name__ == '__main__':
create_net()