Как сделать тренировочные данные в виде 4-мерного массива в нейронной сети Matlab - правильный способ ввода данных - PullRequest
0 голосов
/ 27 сентября 2018

Я новичок в наборе инструментов глубокого обучения и сам изучаю сверточную нейронную сеть (CNN).Мой набор данных состоит из 1000 изображений RGB размером 100x40.Поэтому Xdata = 1x1x1000 типа данных double.

Из них я использовал первые 700 для обучения, Xtrain = 1x1x700 типа данных Image.

Я получаю эту ошибку

Ошибка при использовании trainNetwork (строка 150) Неверные данные обучения.X должен быть 4-D массивом изображений, ImageDatastore или таблицей.

Я не могу понять, как использовать структуру данных таблицы и Как правильно вводить данные в CNN?Невозможно ввести изображение RGB напрямую как тип данных изображения или мне нужно преобразовать каждый канал и подать 3 матрицы по 2 D?

Пожалуйста, помогите.

imageSize = [100 40];


dropoutProb = 0.1;
numF = 8;
layers = [
    imageInputLayer(imageSize)

    convolution2dLayer(3,numF,'Padding','same')
    batchNormalizationLayer
    reluLayer

    maxPooling2dLayer(3,'Stride',2,'Padding','same')

    convolution2dLayer(3,2*numF,'Padding','same')
    batchNormalizationLayer
    reluLayer

    maxPooling2dLayer(3,'Stride',2,'Padding','same')

    convolution2dLayer(3,4*numF,'Padding','same')
    batchNormalizationLayer
    reluLayer

    maxPooling2dLayer(3,'Stride',2,'Padding','same')

    convolution2dLayer(3,4*numF,'Padding','same')
    batchNormalizationLayer
    reluLayer
    convolution2dLayer(3,4*numF,'Padding','same')
    batchNormalizationLayer
    reluLayer

    maxPooling2dLayer([1 13])

    dropoutLayer(dropoutProb)
    fullyConnectedLayer(numClasses)
    softmaxLayer
    classificationLayer];

miniBatchSize = 50;
validationFrequency = floor(numel(Ytrain)/miniBatchSize);
options = trainingOptions('adam', ...
    'InitialLearnRate',3e-4, ...
    'MaxEpochs',25, ...
    'MiniBatchSize',miniBatchSize, ...
    'Shuffle','every-epoch', ...
    'Plots','training-progress', ...
    'Verbose',false, ...
    'ValidationData',{XValidation,YValidation}, ...
    'ValidationFrequency',validationFrequency, ...
    'LearnRateSchedule','piecewise', ...
    'LearnRateDropFactor',0.1, ...
    'LearnRateDropPeriod',20);

  trainedNet = trainNetwork(Xtrain,layers,options);

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Форма вашего 4D массива должна быть:

[высота, ширина, number_of_channels, количество изображений]

0 голосов
/ 27 сентября 2018

Введены неверные размеры.Массив 4D должен иметь форму:

[height, width, number_of_channels, number of images]

Так что в вашем случае вам нужно, чтобы размеры изображения поезда были:

[100, 40, 3, 700]

И размеры тестового изображения были:

[100, 40, 3, 300]

У вас также есть выпадающий слой перед последним только полностью подключенным слоем, должен ли быть дополнительный полностью подключенный слой перед ним?Теперь вы отбрасываете максимальные результаты объединения, что может быть сделано, но довольно агрессивно.

trainNetwork () также может принимать другие входные данные, если вы не хотите специально использовать 4-D хранилище данных.Я предпочитаю хранилище дополненных изображений , созданное из хранилища данных изображений , это очень простой способ дополнить ваши изображения, что вам определенно следует делать, если вы этого не сделали.Если нет, рассмотрите возможность изменения типов данных изображения с двойного на uint8, 3 канала uint8 достаточно, чтобы полностью представить типичное входное изображение, и это должно ускорить ваше обучение.

...