| from __future__ import print_function |
| from caffe import layers as L, params as P, to_proto |
| from caffe.proto import caffe_pb2 |
|
|
| |
|
|
| def conv_relu(bottom, ks, nout, stride=1, pad=0, group=1): |
| conv = L.Convolution(bottom, kernel_size=ks, stride=stride, |
| num_output=nout, pad=pad, group=group) |
| return conv, L.ReLU(conv, in_place=True) |
|
|
| def fc_relu(bottom, nout): |
| fc = L.InnerProduct(bottom, num_output=nout) |
| return fc, L.ReLU(fc, in_place=True) |
|
|
| def max_pool(bottom, ks, stride=1): |
| return L.Pooling(bottom, pool=P.Pooling.MAX, kernel_size=ks, stride=stride) |
|
|
| def caffenet(lmdb, batch_size=256, include_acc=False): |
| data, label = L.Data(source=lmdb, backend=P.Data.LMDB, batch_size=batch_size, ntop=2, |
| transform_param=dict(crop_size=227, mean_value=[104, 117, 123], mirror=True)) |
|
|
| |
| conv1, relu1 = conv_relu(data, 11, 96, stride=4) |
| pool1 = max_pool(relu1, 3, stride=2) |
| norm1 = L.LRN(pool1, local_size=5, alpha=1e-4, beta=0.75) |
| conv2, relu2 = conv_relu(norm1, 5, 256, pad=2, group=2) |
| pool2 = max_pool(relu2, 3, stride=2) |
| norm2 = L.LRN(pool2, local_size=5, alpha=1e-4, beta=0.75) |
| conv3, relu3 = conv_relu(norm2, 3, 384, pad=1) |
| conv4, relu4 = conv_relu(relu3, 3, 384, pad=1, group=2) |
| conv5, relu5 = conv_relu(relu4, 3, 256, pad=1, group=2) |
| pool5 = max_pool(relu5, 3, stride=2) |
| fc6, relu6 = fc_relu(pool5, 4096) |
| drop6 = L.Dropout(relu6, in_place=True) |
| fc7, relu7 = fc_relu(drop6, 4096) |
| drop7 = L.Dropout(relu7, in_place=True) |
| fc8 = L.InnerProduct(drop7, num_output=1000) |
| loss = L.SoftmaxWithLoss(fc8, label) |
|
|
| if include_acc: |
| acc = L.Accuracy(fc8, label) |
| return to_proto(loss, acc) |
| else: |
| return to_proto(loss) |
|
|
| def make_net(): |
| with open('train.prototxt', 'w') as f: |
| print(caffenet('/path/to/caffe-train-lmdb'), file=f) |
|
|
| with open('test.prototxt', 'w') as f: |
| print(caffenet('/path/to/caffe-val-lmdb', batch_size=50, include_acc=True), file=f) |
|
|
| if __name__ == '__main__': |
| make_net() |
|
|