matlab - 如何在神经网络Matlab中将训练数据制作为4D数组 - 输入数据的正确方法

标签 matlab image-processing machine-learning deep-learning conv-neural-network

我的数据集由 1000 个 100x40 大小的 RGB 图像组成。因此,Xdata = 1x1x1000 数据类型为 double。

其中我使用了前 700 个进行训练,数据类型为 Image 的 Xtrain = 1x1x700

我收到此错误

Error using trainNetwork (line 150)
    Invalid training data. X must be a 4-D array of images, an ImageDatastore, or a table.

我不明白如何使用表数据结构以及将数据输入 CNN 的正确方法是什么?无法直接输入 RGB 图像作为图像数据类型,还是需要转换每个 channel 并输入 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);

最佳答案

输入的尺寸错误。 4D 数组的形状应为:

[height, width, number_of_channels, number of images]

因此,在您的情况下,您需要火车图像尺寸为:

[100, 40, 3, 700]

并测试图像尺寸为:

[100, 40, 3, 300]

在最后一个全连接层之前还有一个 dropout 层,在它之前是否应该有一个额外的全连接层?现在您将丢弃最大池化结果,这是可以做到的,但相当激进。

如果您不特别想使用 4 维数据存储,trainNetwork() 还可以接受其他输入。我更喜欢augmented image datastoreimage data store 制成,这是增强图像的一种非常简单的方法,如果您还没有这样做,那么您绝对应该这样做。如果没有,请考虑将图像数据类型从 double 更改为 uint8,3 个 uint8 channel 足以完全表示典型的输入图像,并且它应该会加快您的训练速度。

关于matlab - 如何在神经网络Matlab中将训练数据制作为4D数组 - 输入数据的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52527210/

相关文章:

python - 如何在 PIL 中选择与图像边缘相邻的所有黑色像素?

apache-spark - 将向量转换为数据帧时出错

Python重采样实现如Matlab的Signal Toolbox的重采样函数

matlab - Matlab 中的交叉验证和 perfcurv

linux - Linux 上多节点 hadoop 设置的 MCR 权限问题

image-processing - 图像去噪和图像滤波有什么区别

html - 处理不同高度/宽度的多个图像

c - 如何提高 C 中文件操作的性能

machine-learning - 将 sklearn.svm SVC 分类器转换为 Keras 实现

Matlab 只是说有一个错误,但我没有看到。我如何知道更多关于错误的信息