第一部分:用matlab接口操作网络,包括网络生成,数据读取及修改,存储caffeemodel,返回layer的类型
1.设置网络:
model = './models/bvlc_reference_caffenet/deploy.prototxt';
weights ='./models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel';
2.启动网络前,设置运行模式cpu/gpu,模式和设备的设置必须在创建一个net或solver之前。
caffe.set_mode_cpu();
caffe.set_mode_gpu();
caffe.set_device(gpu_id); //使用 GPU,指定 GPU 的 ID 号
3.创建网络:
net = caffe.Net(model, weights, 'test'); % 创建网络并加载权值
或者
net = caffe.Net(model, 'test'); % 创建网络,但不加载权值
net.copy_from(weights); % 加载权值
4.你可以存取网络中任意的 blob。若希望用 1 来填充’data’这个 blob:
net.blobs('data').set_data(ones(net.blobs('data').shape));
5.若希望将 ‘data’这个blob中的所有值都乘以 10,Caffe使用单精度float型数据。如果你的数据不是单精度的,set_data会自动将数据转换为单精度。
net.blobs('data').set_data(net.blobs('data').get_data() * 10);
6.你可以访问每一层,对网络进行调整(surgery)。例如,将 conv1 的参数乘以 10:
net.params('conv1', 1).set_data(net.params('conv1', 1).get_data() * 10); % 设置权值
net.params('conv1', 2).set_data(net.params('conv1', 2).get_data() * 10); % 设置偏置
或者,你也可以使用以下命令:
net.layers('conv1').params(1).set_data(net.layers('conv1').params(1).get_data() * 10);
net.layers('conv1').params(2).set_data(net.layers('conv1').params(2).get_data() * 10);
7.保存刚刚修改的网络:
net.save('my_net.caffemodel');
8.得到 layer 的类型(返回一个 string):
layer_type = net.layers('conv1').type;
第二部分:网络的前向传导(forward)与后向传播(backward)
1.Forward 可使用 net.forward 或者 net.forward_prefilled 函数。
net.forward()传入包含了输入数据的 N-D arrays 形式的单元阵列(cell array),返回包含输出数据的单元阵列。
net.forward_prefilled()使用了 forward 过程中,input blobs(s)中已经存在的数据。
如果没有输入就不会产生输出。
在创建了类似 datmean_data = caffe.io.read_mean('./data/ilsvrc12/imagenet_mean.binaryproto');a = rand(net.blobs('data').
1.设置网络:
model = './models/bvlc_reference_caffenet/deploy.prototxt';
weights ='./models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel';
2.启动网络前,设置运行模式cpu/gpu,模式和设备的设置必须在创建一个net或solver之前。
caffe.set_mode_cpu();
caffe.set_mode_gpu();
caffe.set_device(gpu_id); //使用 GPU,指定 GPU 的 ID 号
3.创建网络:
net = caffe.Net(model, weights, 'test'); % 创建网络并加载权值
或者
net = caffe.Net(model, 'test'); % 创建网络,但不加载权值
net.copy_from(weights); % 加载权值
4.你可以存取网络中任意的 blob。若希望用 1 来填充’data’这个 blob:
net.blobs('data').set_data(ones(net.blobs('data').shape));
5.若希望将 ‘data’这个blob中的所有值都乘以 10,Caffe使用单精度float型数据。如果你的数据不是单精度的,set_data会自动将数据转换为单精度。
net.blobs('data').set_data(net.blobs('data').get_data() * 10);
6.你可以访问每一层,对网络进行调整(surgery)。例如,将 conv1 的参数乘以 10:
net.params('conv1', 1).set_data(net.params('conv1', 1).get_data() * 10); % 设置权值
net.params('conv1', 2).set_data(net.params('conv1', 2).get_data() * 10); % 设置偏置
或者,你也可以使用以下命令:
net.layers('conv1').params(1).set_data(net.layers('conv1').params(1).get_data() * 10);
net.layers('conv1').params(2).set_data(net.layers('conv1').params(2).get_data() * 10);
7.保存刚刚修改的网络:
net.save('my_net.caffemodel');
8.得到 layer 的类型(返回一个 string):
layer_type = net.layers('conv1').type;
第二部分:网络的前向传导(forward)与后向传播(backward)
1.Forward 可使用 net.forward 或者 net.forward_prefilled 函数。
net.forward()传入包含了输入数据的 N-D arrays 形式的单元阵列(cell array),返回包含输出数据的单元阵列。
net.forward_prefilled()使用了 forward 过程中,input blobs(s)中已经存在的数据。
如果没有输入就不会产生输出。
在创建了类似 datmean_data = caffe.io.read_mean('./data/ilsvrc12/imagenet_mean.binaryproto');a = rand(net.blobs('data').