나는 그 예제 라이브러리와 함께 제공 cnn_train 기능을 사용하여 매우 간단한 1D 예를 들어 작은 네트워크를 구축 MatConvNet을 사용했다MatConvNet에서 데이터와 파생물의 형식이 일치하지 않는다고 말하는 이유는 무엇입니까?
문제 설명.
이Error using vl_nnconv
DATA and DEROUTPUT do not have compatible formats.
Error in vl_simplenn (line 397)
[res(i).dzdx, dzdw{1}, dzdw{2}] = vl_nnconv(res(i).x, l.weights{1},
l.weights{2}, res(i+1).dzdx)
Error in cnn_train>process_epoch (line 323)
res = vl_simplenn(net, im, dzdy, res, ...
Error in cnn_train (line 139)
[net,stats.train,prof] = process_epoch(opts, getBatch, epoch, train, learningRate,
imdb, net) ;
Error in main_1D_1layer_hard_coded_example (line 64)
net = cnn_train(net, imdb, @getBatch, trainOpts) ;
누군가에 무슨 일이 일어나고 있는지 알고 않습니다
clc;clear;clc;clear;
%% prepare Data
M = 32; %batch size
X_train = zeros(1,1,1,M); % (1 1 1 2) = (1 1 1 M)
for m=1:M,
X_train(:,:,:,m) = m; %training example value
end
Y_test = 10*X_train;
split = ones(1,M);
split(floor(M*0.75):end) = 2;
% load image dadabase (imgdb)
imdb.images.data = X_train;
imdb.images.label = Y_test;
imdb.images.set = split;
%% prepare parameters
L1=3;
w1 = randn(1,1,1,L1); %1st layer weights
w2 = randn(1,1,1,L1); %2nd layer weights
b1 = randn(1,1,1,L1); %1st layer biases
b2 = randn(1,1,1,L1); %2nd layer biases
G1 = ones(1,1,1,L1); % (1 1 1 3) = (1 1 1 L1) BN scale, one per dimension
B1 = zeros(1,1,1,L1); % (1 1 1 3) = (1 1 1 L1) BN shift, one per dimension
EPS = 1e-4;
%% make CNN layers: conv, BN, relu, conv, pdist, l2-loss
net.layers = {} ;
net.layers{end+1} = struct('type', 'conv', ...
'name', 'conv1', ...
'weights', {{w1, b1}}, ...
'pad', 0) ;
net.layers{end+1} = struct('type', 'bnorm', ...
'weights', {{G1, B1}}, ...
'EPSILON', EPS, ...
'learningRate', [1 1 0.05], ...
'weightDecay', [0 0]) ;
net.layers{end+1} = struct('type', 'relu', ...
'name', 'relu1') ;
net.layers{end+1} = struct('type', 'conv', ...
'name', 'conv2', ...
'weights', {{w2, b2}}, ...
'pad', 0) ;
net.layers{end+1} = struct('type', 'pdist', ...
'name', 'averageing1', ...
'class', 0, ...
'p', 1) ;
%% add L2-loss
fwfun = @l2LossForward;
bwfun = @l2LossBackward;
net = addCustomLossLayer(net, fwfun, bwfun) ;
net.layers{end}.class = Y_test; % its the test set
net = vl_simplenn_tidy(net) ;
res = vl_simplenn(net, X_train);
%% prepare train options
trainOpts.expDir = 'results/' ; %save results/trained cnn
trainOpts.gpus = [] ;
trainOpts.batchSize = 2 ;
trainOpts.learningRate = 0.02 ;
trainOpts.plotDiagnostics = false ;
%trainOpts.plotDiagnostics = true ; % Uncomment to plot diagnostics
trainOpts.numEpochs = 20 ; % number of training epochs
trainOpts.errorFunction = 'none' ;
%% CNN TRAIN
vl_simplenn_display(net) ;
net = cnn_train(net, imdb, @getBatch, trainOpts) ;
내가 예제를 실행 할 때마다 나는이 the example they provided에 따라 나는 오류가 만든 다음과 같이 자신의 예를 따라 난 작은 CNN 예를 구축 ? 이 예제는 실제로 단순한 것으로 가정되어서 나에게 혼동을 줄 수 있습니다. 사물의
보충 제는 내가 본를 해결하기 위해 시도했습니다.
자세한 내용은이 문제를 해결하기 위해 시도해 보았습니다.
case 'conv'
size(res(i).x)
size(res(i+1).dzdx)
size(l.weights{1})
size(l.weights{2})
[res(i).dzdx, dzdw{1}, dzdw{2}] = vl_nnconv(res(i).x, l.weights{1}, l.weights{2}, res(i+1).dzdx)
[res(i).dzdx, dzdw{1}, dzdw{2}] = ...
vl_nnconv(res(i).x, l.weights{1}, l.weights{2}, res(i+1).dzdx, ...
'pad', l.pad, ...
'stride', l.stride, ...
l.opts{:}, ...
cudnn{:}) ;
:
는 내가 감각을 만들어 그 모두가 그 점에 괜찮 보인다 인수를 포기했다 있는지 확인하는 함수에 입력 오류의 원인이 파일의 해당 행에 가서 인쇄 인쇄물 :ans =
1 1 3 16
ans =
1 1 3 16
ans =
1 1 1 3
ans =
1 1 1 3
예상했던 것.
심지어 앞서 수동으로 하드 네트워크가 계산해야 파생 상품의 사슬 해당 파일이 잘 작동하는 것 같다 무엇으로 구분했다 : 나는에 모든 것이 가정 줄 수 있도록
clc;clear;clc;clear;
%% prepare Data
M = 3;
x = zeros(1,1,1,M); % (1 1 1 2) = (1 1 1 M)
for m=1:M,
x(:,:,:,m) = m;
end
Y = 5;
r=Y;
%% parameters
L1 = 3;
w1 = randn(1,1,1,L1); % (1 1 1 L1) = (1 1 1 3)
b1 = ones(1,L1);
w2 = randn(1,1,1,L1); % (1 1 1 L1) = (1 1 1 3)
b2 = ones(1,L1);
G1 = ones(1,1,1,L1); % (1 1 1 3) = (1 1 1 L1) BN scale, one per dimension
B1 = zeros(1,1,1,L1); % (1 1 1 3) = (1 1 1 L1) BN shift, one per dimension
EPS = 1e-4;
%% Forward Pass
z1 = vl_nnconv(x,w1,b1); % (1 1 3 2) = (1 1 L1 M)
%bn1 = z1;
bn1 = vl_nnbnorm(z1,G1,B1,'EPSILON',EPS); % (1 1 3 2) = (1 1 L1 M)
a1 = vl_nnrelu(bn1); % (1 1 3 2) = (1 1 L1 M)
z2 = vl_nnconv(a1,w2,b2);
y1 = vl_nnpdist(z2, 0, 1);
loss_forward = l2LossForward(y1,Y);
%%
net.layers = {} ;
net.layers{end+1} = struct('type', 'conv', ...
'name', 'conv1', ...
'weights', {{w1, b1}}, ...
'pad', 0) ;
net.layers{end+1} = struct('type', 'bnorm', ...
'weights', {{G1, B1}}, ...
'EPSILON', EPS, ...
'learningRate', [1 1 0.05], ...
'weightDecay', [0 0]) ;
net.layers{end+1} = struct('type', 'relu', ...
'name', 'relu1') ;
net.layers{end+1} = struct('type', 'conv', ...
'name', 'conv2', ...
'weights', {{w2, b2}}, ...
'pad', 0) ;
net.layers{end+1} = struct('type', 'pdist', ...
'name', 'averageing1', ...
'class', 0, ...
'p', 1) ;
fwfun = @l2LossForward;
bwfun = @l2LossBackward;
net = addCustomLossLayer(net, fwfun, bwfun) ;
net.layers{end}.class = Y;
net = vl_simplenn_tidy(net) ;
res = vl_simplenn(net, x);
%%
loss_forward = squeeze(loss_forward) % (1 1)
loss_res = squeeze(res(end).x) % (1 1)
%% Backward Pass
p = 1;
dldx = l2LossBackward(y1,r,p);
dy1dx = vl_nnpdist(z2, 0, 1, dldx);
[dz2dx, dz2dw2] = vl_nnconv(a1, w2, b2, dy1dx);
da1dx = vl_nnrelu(bn1, dz2dx);
[dbn1dx,dbn1dG1,dbn1dB1] = vl_nnbnorm(z1,G1,B1,da1dx);
[dz1dx, dz1dw1] = vl_nnconv(x, w1, b1, dbn1dx);
%%
dzdy = 1;
res = vl_simplenn(net, x, dzdy, res);
%%
% func = @(x) proj(p, forward(x, x0)) ;
% err = checkDerivativeNumerically(f, x, dx)
% %%
dz1dx = squeeze(dz1dx)
dz1dx_vl_simplenn = squeeze(res(1).dzdx)
파생 상품
수학에 보인다 그 파일이 작동합니다. 오류가 발생하지 않기 때문에 실행되지 않는다는 사실은 나 혼란 스럽다. 누구나 무슨 일이 벌어지고 있는지 알아?내 CNN을로드하는 방법은 the example file을 기반으로하며이 튜토리얼에서 제공합니다. 그 파일의 중요한 측면에 대한 요약을 붙여 넣을 것입니다 (광산이 아닌 동안에는 cnn_train 함수로 잘 돌아갑니다).
setup() ;
% setup('useGpu', true); % Uncomment to initialise with a GPU support
%% Part 3.1: Prepare the data
% Load a database of blurred images to train from
imdb = load('data/text_imdb.mat') ;
%% Part 3.2: Create a network architecture
net = initializeSmallCNN() ;
%net = initializeLargeCNN() ;
% Display network
vl_simplenn_display(net) ;
%% Part 3.3: learn the model
% Add a loss (using a custom layer)
net = addCustomLossLayer(net, @l2LossForward, @l2LossBackward) ;
% Train
trainOpts.expDir = 'data/text-small' ;
trainOpts.gpus = [] ;
% Uncomment for GPU training:
%trainOpts.expDir = 'data/text-small-gpu' ;
%trainOpts.gpus = [1] ;
trainOpts.batchSize = 16 ;
trainOpts.learningRate = 0.02 ;
trainOpts.plotDiagnostics = false ;
%trainOpts.plotDiagnostics = true ; % Uncomment to plot diagnostics
trainOpts.numEpochs = 20 ;
trainOpts.errorFunction = 'none' ;
net = cnn_train(net, imdb, @getBatch, trainOpts) ;
덜 비범 한 예를 생각해 낼 수 있습니까? * non * -minimal? –
@AndrasDeak 확실히, 당신은 복잡한 것을 의미합니까? 그것은 단순한 네트워크라고 가정하고 나는 그것을 고치려고 노력한 것들 중 일부를 제공했습니다. – Pinocchio
나는 그 간단한 것을 납득시키기 위해 더 많은 예제를 주석으로 써 보았습니다. 희망이 도움이됩니다. – Pinocchio