我的数据集包含1000张尺寸为100×40的RGB图像。因此,Xdata = 1x1x1000
,数据类型为double。
其中我使用了前700张进行训练,Xtrain = 1x1x700
,数据类型为Image。
我遇到了以下错误
Error using trainNetwork (line 150) Invalid training data. X must be a 4-D array of images, an ImageDatastore, or a table.
我不明白如何使用表格数据结构,以及如何正确地将数据输入到CNN中?是否不能直接将RGB图像作为图像数据类型输入,或者我需要转换每个通道并输入3个2D矩阵?
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);
回答:
输入的维度有误。4D数组的形状应该为:
[height, width, number_of_channels, number of images]
所以在你的情况下,训练图像的维度应该为:
[100, 40, 3, 700]
测试图像的维度应该为:
[100, 40, 3, 300]
你还在最后的完全连接层之前添加了一个dropout层,是否应该在它之前再添加一个完全连接层?现在你丢弃了最大池化的结果,这虽然可以做但相当激进。
trainNetwork() 也可以接受其他类型的输入,如果你不特别想使用4-D数据存储。我更喜欢使用从图像数据存储创建的增强图像数据存储,这是增强图像的一种非常简单的方法,如果你还没有这样做,强烈建议你这样做。如果没有,考虑将你的图像数据类型从double更改为uint8,3个uint8通道足以完全表示一个典型的输入图像,并且应该能加速你的训练过程。