如何为在 Mnist 上训练的网络调整 Caffe Matlab 包装器?
How to adapt Caffe Matlab wrapper for a network trained on Mnist?
我在 http://caffe.berkeleyvision.org/gathered/examples/mnist.html
之后在 mnist 数据库上成功地训练了我的 Caffe 网络
现在我想使用 Matlab 包装器用我自己的图像测试网络。
因此,在 "matcaffe.m" 中,我正在加载文件 "lenet.prototxt",该文件未用于训练,但似乎适合测试。它引用了 28 x 28 像素的输入尺寸:
name: "LeNet"
input: "data"
input_dim: 64
input_dim: 1
input_dim: 28
input_dim: 28
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
因此我相应地调整了 "matcaffe.m" 中的 "prepare_image" 函数。现在看起来像这样:
% ------------------------------------------------------------------------
function images = prepare_image(im)
IMAGE_DIM = 28;
% resize to fixed input size
im = rgb2gray(im);
im = imresize(im, [IMAGE_DIM IMAGE_DIM], 'bilinear');
im = single(im);
images = zeros(1,1,IMAGE_DIM,IMAGE_DIM);
images(1,1,:,:) = im;
images = single(images);
%-------------------------------------------------------------
这会将输入图像转换为 [1 x 1 x 28 x 28]、4dim、灰度图像。但是 Matlab 仍然在抱怨:
Error using caffe
MatCaffe input size does not match the input size of the
network
Error in matcaffe_myModel_mnist (line 76)
scores = caffe('forward', input_data);
有人有在自己的数据上测试经过训练的 mnist 网络的经验吗?
出现该错误(输入大小不匹配)的原因是网络 prototxt 需要一批 64 张图像。行数
input_dim: 64
input_dim: 1
input_dim: 28
input_dim: 28
意味着网络需要一批 64 灰度,28 x 28 图像。如果您保持所有 MATLAB 代码相同并将第一行更改为
input_dim: 1
您的问题应该会消失。
最后我找到了完整的解决方案:
这是如何使用 matcaffe.m(Matlab 包装器)为 Caffe
预测您自己的输入图像的数字
- In "matcaffe.m": 必须引用文件 "caffe-master/examples/mnist/lenet.prototxt"
- 根据 mprat 的指示调整文件 "lenet.prototxt":将条目 input_dim 更改为
input_dim: 1
- 对matcaffe.m中的子函数"prepare_image"进行如下适配:
(输入可以是任意大小的RGB图像)
function image = prepare_image(im)
IMAGE_DIM = 28;
% If input image is too big , is rgb and of type uint8:
% -> resize to fixed input size, single channel, type float
im = rgb2gray(im);
im = imresize(im, [IMAGE_DIM IMAGE_DIM], 'bilinear');
im = single(im);
% Caffe needs a 4D input matrix which has single precision
% Data has to be scaled by 1/256 = 0.00390625 (like during training)
% In the second last line the image is beeing transposed!
images = zeros(1,1,IMAGE_DIM,IMAGE_DIM);
images(1,1,:,:) = 0.00390625*im';
images = single(images);
我在 http://caffe.berkeleyvision.org/gathered/examples/mnist.html
之后在 mnist 数据库上成功地训练了我的 Caffe 网络现在我想使用 Matlab 包装器用我自己的图像测试网络。
因此,在 "matcaffe.m" 中,我正在加载文件 "lenet.prototxt",该文件未用于训练,但似乎适合测试。它引用了 28 x 28 像素的输入尺寸:
name: "LeNet"
input: "data"
input_dim: 64
input_dim: 1
input_dim: 28
input_dim: 28
layer {
name: "conv1"
type: "Convolution"
bottom: "data"
top: "conv1"
因此我相应地调整了 "matcaffe.m" 中的 "prepare_image" 函数。现在看起来像这样:
% ------------------------------------------------------------------------
function images = prepare_image(im)
IMAGE_DIM = 28;
% resize to fixed input size
im = rgb2gray(im);
im = imresize(im, [IMAGE_DIM IMAGE_DIM], 'bilinear');
im = single(im);
images = zeros(1,1,IMAGE_DIM,IMAGE_DIM);
images(1,1,:,:) = im;
images = single(images);
%-------------------------------------------------------------
这会将输入图像转换为 [1 x 1 x 28 x 28]、4dim、灰度图像。但是 Matlab 仍然在抱怨:
Error using caffe
MatCaffe input size does not match the input size of the
network
Error in matcaffe_myModel_mnist (line 76)
scores = caffe('forward', input_data);
有人有在自己的数据上测试经过训练的 mnist 网络的经验吗?
出现该错误(输入大小不匹配)的原因是网络 prototxt 需要一批 64 张图像。行数
input_dim: 64
input_dim: 1
input_dim: 28
input_dim: 28
意味着网络需要一批 64 灰度,28 x 28 图像。如果您保持所有 MATLAB 代码相同并将第一行更改为
input_dim: 1
您的问题应该会消失。
最后我找到了完整的解决方案: 这是如何使用 matcaffe.m(Matlab 包装器)为 Caffe
预测您自己的输入图像的数字- In "matcaffe.m": 必须引用文件 "caffe-master/examples/mnist/lenet.prototxt"
- 根据 mprat 的指示调整文件 "lenet.prototxt":将条目 input_dim 更改为
input_dim: 1
- 对matcaffe.m中的子函数"prepare_image"进行如下适配:
(输入可以是任意大小的RGB图像)
function image = prepare_image(im)
IMAGE_DIM = 28;
% If input image is too big , is rgb and of type uint8:
% -> resize to fixed input size, single channel, type float
im = rgb2gray(im);
im = imresize(im, [IMAGE_DIM IMAGE_DIM], 'bilinear');
im = single(im);
% Caffe needs a 4D input matrix which has single precision
% Data has to be scaled by 1/256 = 0.00390625 (like during training)
% In the second last line the image is beeing transposed!
images = zeros(1,1,IMAGE_DIM,IMAGE_DIM);
images(1,1,:,:) = 0.00390625*im';
images = single(images);