How to match output size in cnn
조회 수: 6 (최근 30일)
이전 댓글 표시
I am trying to train a cnn to take as input a grayscale image (25x25) and output also an image (25x25). I have created the training as follows: (I1 is the input and I2 is the response)
[I1, I2] = generateImage();
X(:,:,:,i) = I1;
Y(i,:,:,:) = I2;
The I set the network and try to train it:
%create network layers
layers = [...
imageInputLayer([25 25 1])
convolution2dLayer([4 3],12)
reluLayer
crossChannelNormalizationLayer(4)
maxPooling2dLayer(2,'Stride',2)
convolution2dLayer(5,16)
reluLayer
crossChannelNormalizationLayer(4)
maxPooling2dLayer(2,'Stride',2)
fullyConnectedLayer(256)
reluLayer
fullyConnectedLayer(10)
regressionLayer];
%create training option
options = trainingOptions('sgdm','InitialLearnRate',0.001, ...
'MaxEpochs',15);
%create network
net = trainNetwork(X,Y,layers,options)
The message I get is:
Error using trainNetwork (line 92)
The output size [1 1 10] of the last layer doesn't match the response size [1 25 25].
Any ideias on to fix this?
댓글 수: 1
Kanushka Gajjar
2019년 6월 24일
Hi,
Did you find a solution to this problem?
I am having the same problem.
Thanks,
Kanushka
답변 (1개)
Abel Babu
2017년 3월 28일
This error is due to the ' fullyConnectedLayer'. If you see the following documentation it is clear that the output of this layer is a single dimension vector
The workaround is to unroll your input image matrix to make it single dimension vector and then training it. I have modified your code by taking random matrices as inputs and response.
layers = [...
imageInputLayer([25 25 1])
convolution2dLayer([4 3],12)
reluLayer
crossChannelNormalizationLayer(4)
maxPooling2dLayer(2,'Stride',2)
convolution2dLayer(5,16)
reluLayer
crossChannelNormalizationLayer(4)
maxPooling2dLayer(2,'Stride',2)
fullyConnectedLayer(256)
reluLayer
fullyConnectedLayer(25*25)%Change the dimensions to match the outputs.
regressionLayer;
];
%create training option
options = trainingOptions('sgdm','InitialLearnRate',0.001, ...
'MaxEpochs',15);
%create network
X(:,:,:,1) = rand(25);
Y=randn(1,1,25*25,1);
net = trainNetwork(X,Y,layers,options)
I hope the above code will help you.
Regards,
Darshan Bhat
댓글 수: 1
Osama Tabbakh
2019년 4월 11일
편집: Osama Tabbakh
2019년 5월 14일
I wounder why u put two fullyConnectedLayers. And can I somehow filter the output also?
참고 항목
카테고리
Help Center 및 File Exchange에서 Image Data Workflows에 대해 자세히 알아보기
제품
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!