gpt4 book ai didi

matlab - 在 CNN 实现中计算卷积层

转载 作者:太空宇宙 更新时间:2023-11-03 19:11:25 25 4
gpt4 key购买 nike

我正在尝试使用稀疏自动编码器训练卷积神经网络,以便计算卷积层的过滤器。我正在使用 UFLDL 代码来构建补丁和训练 CNN 网络。我的代码如下:

===========================================================================
imageDim = 30; % image dimension
imageChannels = 3; % number of channels (rgb, so 3)

patchDim = 10; % patch dimension
numPatches = 100000; % number of patches

visibleSize = patchDim * patchDim * imageChannels; % number of input units
outputSize = visibleSize; % number of output units
hiddenSize = 400; % number of hidden units

epsilon = 0.1; % epsilon for ZCA whitening

poolDim = 10; % dimension of pooling region

optTheta = zeros(2*hiddenSize*visibleSize+hiddenSize+visibleSize, 1);
ZCAWhite = zeros(visibleSize, visibleSize);
meanPatch = zeros(visibleSize, 1);

load patches_16_1
===========================================================================

% Display and check to see that the features look good
W = reshape(optTheta(1:visibleSize * hiddenSize), hiddenSize, visibleSize);
b = optTheta(2*hiddenSize*visibleSize+1:2*hiddenSize*visibleSize+hiddenSize);

displayColorNetwork( (W*ZCAWhite));

stepSize = 100;
assert(mod(hiddenSize, stepSize) == 0, stepSize should divide hiddenSize);

load train.mat % loads numTrainImages, trainImages, trainLabels
load train.mat % loads numTestImages, testImages, testLabels
% size 30x30x3x8862

numTestImages = 8862;
numTrainImages = 8862;

pooledFeaturesTrain = zeros(hiddenSize, numTrainImages, floor((imageDim - patchDim + 1) / poolDim), floor((imageDim - patchDim + 1) / poolDim) );
pooledFeaturesTest = zeros(hiddenSize, numTestImages, ...
floor((imageDim - patchDim + 1) / poolDim), ...
floor((imageDim - patchDim + 1) / poolDim) );

tic();

testImages = trainImages;

for convPart = 1:(hiddenSize / stepSize)

featureStart = (convPart - 1) * stepSize + 1;
featureEnd = convPart * stepSize;

fprintf('Step %d: features %d to %d\n', convPart, featureStart, featureEnd);
Wt = W(featureStart:featureEnd, :);
bt = b(featureStart:featureEnd);

fprintf('Convolving and pooling train images\n');
convolvedFeaturesThis = cnnConvolve(patchDim, stepSize, ...
trainImages, Wt, bt, ZCAWhite, meanPatch);
pooledFeaturesThis = cnnPool(poolDim, convolvedFeaturesThis);
pooledFeaturesTrain(featureStart:featureEnd, :, :, :) = pooledFeaturesThis;
toc();
clear convolvedFeaturesThis pooledFeaturesThis;

fprintf('Convolving and pooling test images\n');
convolvedFeaturesThis = cnnConvolve(patchDim, stepSize, ...
testImages, Wt, bt, ZCAWhite, meanPatch);
pooledFeaturesThis = cnnPool(poolDim, convolvedFeaturesThis);
pooledFeaturesTest(featureStart:featureEnd, :, :, :) = pooledFeaturesThis;
toc();

clear convolvedFeaturesThis pooledFeaturesThis;

end

我在计算卷积层和池化层时遇到问题。我得到 pooledFeaturesTrain(featureStart:featureEnd, :, :, :) = pooledFeaturesThis;下标分配尺寸不匹配。路径已正常计算,它们是:

enter image description here

我试图了解 convPart 变量到底在做什么以及 pooledFeaturesThis 是什么。其次,我注意到我的问题是这一行中的不匹配 pooledFeaturesTrain(featureStart:featureEnd, :, :, :) = pooledFeaturesThis;我在哪里收到变量不匹配的消息。 pooledFeaturesThis 的大小为 100x3x2x2,其中 pooledFeaturesTrain 的大小为 400x8862x2x2。 pooledFeaturesTrain 究竟代表什么?是每个过滤器的 2x2 结果吗?可以找到 CnnConvolve here :

编辑:我稍微更改了我的代码并且它可以工作。但是我有点担心代码的理解。

最佳答案

好的,在这一行中,您将设置池化区域。

poolDim = 10;          % dimension of pooling region

这部分意味着对于每一层中的每个内核,您将获取图像和池化以及 10x10 像素的区域。从您的代码看来,您正在应用一个均值函数,这意味着它是一个补丁并计算均值并在下一层输出它……也就是将图像从 100x100 变为 10x10。在您的网络中,您将根据此输出重复卷积+池化,直到您得到 2x2 图像(顺便说一句,根据我的经验,这通常不是好的做法)。

400x8862x2x2

无论如何回到你的代码。请注意,在训练开始时,您进行了以下初始化:

 pooledFeaturesTrain = zeros(hiddenSize, numTrainImages, floor((imageDim -     patchDim + 1) / poolDim), floor((imageDim - patchDim + 1) / poolDim) );

所以你的错误非常简单和正确 - 保存卷积+池化输出的矩阵的大小不是你初始化的矩阵的大小。

现在的问题是如何修复它。我想一个懒人修复它的方法是去掉初始化。它会大大降低你的代码速度,如果你有超过 1 层,则不能保证工作。

我建议您改为将 pooledFeaturesTrain 设为 3 维数组的结构。所以不是这个

pooledFeaturesTrain(featureStart:featureEnd, :, :, :) = pooledFeaturesThis; 

你会做更多的事情:

pooledFeaturesTrain{n}(:, :, :) = pooledFeaturesThis; 

其中 n 是当前层。

CNN 网络并不像人们吹捧的那样简单 - 即使它们没有崩溃,让它们训练好也是一项壮举。我强烈建议阅读 CNN 的理论——这将使编码和调试更加容易。

祝你好运! :)

关于matlab - 在 CNN 实现中计算卷积层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30194055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com