我在MATLAB中实现了卷积神经网络,但我的实现耗时过长。我已经确定了耗时较多的部分。以下是与最大池化相关的代码:
%分块操作fun = @(block_struct) max_matrix(block_struct.data);%下采样maxpool = cell(number_feature_map,1);for i=1:number_feature_map maxpool{i}=blockproc(y{i},[2 2],fun);endfunction [maximum]=max_matrix(A)maximum=max(A(:));
如果没有这个下采样步骤,收敛只需要2分钟。
如何使其更高效?
回答:
你可以使用kron
来创建块的索引,并使用accumarray
对每个块应用max
函数,而不是使用blockproc
。假设行数和列数都是偶数,并且假设data
是大小为[6,8]
的随机矩阵
r = 6 ,c=8idx = kron(reshape(1:(r*c/4),c/2,[]).',ones(2))for ii=1:number_feature_map data = rand(r,c); maxpool{ii} = reshape(accumarray(idx(:),data(:),[],@max),c/2,[]).';end