Info

이 질문은 마감되었습니다. 편집하거나 답변을 올리려면 질문을 다시 여십시오.

Invalid input data error in custom layer...

조회 수: 5 (최근 30일)
Mimsik Seo
Mimsik Seo 2020년 2월 2일
마감: Mimsik Seo 2020년 2월 7일
Hi, I have a custom layer defined as follows:
classdef reshapeLayer < nnet.layer.Layer
properties
NumFilters;
Height;
Width;
end
methods
function self = reshapeLayer(name, height, width, numFilters)
self.Name = name;
self.Height = height;
self.Width = width;
self.NumFilters = numFilters;
self.Description = "reshape from 1x1x" + height*width*numFilters + ...
" to " + height + "x" + width + "x" + numFilters;
end
function Z = predict(self, X)
numFilters = self.NumFilters;
height = self.Height;
width = self.Width;
Z = reshape(X, height, width, numFilters, []);
end
end
end
This layer has passed validity tests by "checkLayer ", however, it doesn't work in the middle of the layers...
The set of layers, and the corresponding layer graph and dlnetwork respectively are;
layers = [
imageInputLayer([1,1,latentDim], 'Normalization', 'none', 'Name', 'input')
fullyConnectedLayer(2*2*numFilters, 'Name', 'dense')
eluLayer('Name', 'dense_elu')
reshapeLayer('reshape', 2, 2, numFilters)
convolution2dLayer(3, numFilters, 'Padding', 'same', 'Name', 'conv2d')
];
lgraph = layerGraph(layers);
net = dlnetwork(lgraph);
and I tested it as
z = ones([1, 1, latentDim, batchSize], 'single');
dlz = dlarray(z, 'SSCB');
x = predict(net, dlz);
Unfortunately, I ran into the following error:
Error using nnet.internal.cnn.dlnetwork/predict (line 198)
Layer 'reshape': Invalid input data. Number of dimension labels must be greater
than or equal to the number of dimensions in the input array.
Error in dlnetwork/predict (line 205)
[varargout{1:nargout}] = predict(net.PrivateNetwork, x,
layerIndices, layerOutputIndices);
I found that the reason of this error was because the input and the output of this custom layer are not matched each other.
In the CustomLayerFunctionalStrategy class, there is a reapplying dimensions for the output, namely, (line 35)
Z = cellfun(@(zi) dlarray(zi, Xdims), Z, 'UniformOutput', false);
But, some how the dimension of the input(Xdims) became 'CB' not 'SSCB.'
The output of reshapeLayer, Z has dimension of 4 (e.g. 'SSCB') but Xdims is 'CB,' so they have different dimensions.
Why does this happen, and how can I avoid this problem??
Please help me........
P.S. this custom layer works well by its own, that is...
layer = reshapeLayer('reshape', height, width, numFilters);
checkLayer(layer, [1, 1, height*width*numFilters], 'ObservationDimension', 4); % All passed
z = rand(1,1,height*width*numFilters);
dlz = dlarray(z, 'SSCB');
dlx = predict(layer, dlz); % works
z2 = rand(height*width*numFilters, 1);
dlz2 = dlarray(z2, 'CB'); % works

답변 (0개)

이 질문은 마감되었습니다.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by