필터 지우기
필터 지우기

Custom deep learning layers in MATLAB

조회 수: 7 (최근 30일)
Kaja Mohideen
Kaja Mohideen 2023년 8월 29일
답변: Venu 2024년 1월 10일
I am working on a image classification problem with CNN. I was trying to build my own customized convolution layer for a deep learning architecture in matlab. The following class was written for the same.
classdef CustomConvolutionLayer < nnet.layer.Layer ... % & nnet.layer.Acceleratable properties FilterSize NumFilters
end properties (Learnable) % Layer learnable parameters Weights
end
methods
function layer = CustomConvolutionLayer(filterSize)
% Set layer name.
layer.Name = "SC";
% Set layer description.
layer.Description = "Sparse Convolution";
% Initialize layer weights.
layer.FilterSize = filterSize;
layer.NumFilters = 1;
layer.Weights = randn(filterSize);
end
function Z = predict(layer, X)
Z = conv2(X,layer.Weights,'same');
end
function [dLdX,dLdW] = backward(layer,X,~,dLdZ,~)
dLdW = zeros(size(layer.Weights),'like',layer.Weights);
tW=conv2(X,dLdZ,'same');
fvalue = mean2(tW(:));
dLdW(:,:)=fvalue;
dLdX = conv2(dLdZ, rot90(layer.Weights, 2), 'same');
end
end
end
when I am trying to make use of the custom layer with the following deep learning architecture
inputSize = [256 256 1]; numClasses = 25;
layers = [ imageInputLayer(inputSize)
sparseConvolutionLayer03([5 5]) batchNormalizationLayer reluLayer fullyConnectedLayer(numClasses) softmaxLayer classificationLayer];
options = trainingOptions('sgdm', ... 'MaxEpochs',1, ... 'ValidationData',imdsValidation, ... 'ValidationFrequency',7, ... 'Verbose',true, ... 'Plots','training-progress');
net = trainNetwork(imdsTrain,layers,options); disp('Training Over...')
I’m getting the following error
Error in funCNNclassifier01 (line 34) net = trainNetwork(imdsTrain,layers,options); Caused by: Error using conv2 N-D arrays are not supported.
My input size is 256×256 only, but if I check its size, it was shown that 256×256×1×128, which is why this error is thrown. I am very unsure why / how the dimension is changing from 2D to 4D. Your assistance would be more appreciated.

답변 (1개)

Venu
Venu 2024년 1월 10일
When you use the default settings for the imageInputLayer, it automatically assumes that the input data represents images with multiple channels, hence interpreting it as a 4D array (height x width x channels x batch size). Even if your input data is grayscale (single-channel), it will still interpret it as a 4D array by default.
To avoid this, you need to explicitly specify 'Normalization' as 'none' in the imageInputLayer to inform the network that the input data is a 2D array.
imageInputLayer(inputSize, 'Normalization', 'none');
When you define your training data, ensure that the images are loaded as grayscale and reshaped to the desired input size
imdsTrain = imageDatastore('path_to_training_images', 'IncludeSubfolders', true, 'LabelSource', 'foldernames', 'ReadFcn', @(x)reshape(imread(x),[256,256,1]));
Hope this helps

카테고리

Help CenterFile Exchange에서 Image Data Workflows에 대해 자세히 알아보기

제품


릴리스

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by