如何在 MATLAB 中高效实现 Maxpooling?
How to efficiently implement Maxpooling in MATLAB?
我已经在 Matlab 中实现了 CNN,但是我的实现花费了太多时间。我已经确定哪个部分更耗时。下面是max-pooling相关的代码:
%blockwise operation
fun = @(block_struct) max_matrix(block_struct.data);
%downsampling
maxpool = cell(number_feature_map,1);
for i=1:number_feature_map
maxpool{i}=blockproc(y{i},[2 2],fun);
end
function [maximum]=max_matrix(A)
maximum=max(A(:));
如果没有这个(下采样),收敛只需 2 分钟。
我怎样才能让它更有效率?
您可以使用 kron
代替 blockproc
创建块的索引,并使用 accumarray
将 max
应用到每个块。假设行数和列数是偶数,并且假设 data
是大小为 [6,8]
的随机矩阵
r = 6 ,c=8
idx = 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
我已经在 Matlab 中实现了 CNN,但是我的实现花费了太多时间。我已经确定哪个部分更耗时。下面是max-pooling相关的代码:
%blockwise operation
fun = @(block_struct) max_matrix(block_struct.data);
%downsampling
maxpool = cell(number_feature_map,1);
for i=1:number_feature_map
maxpool{i}=blockproc(y{i},[2 2],fun);
end
function [maximum]=max_matrix(A)
maximum=max(A(:));
如果没有这个(下采样),收敛只需 2 分钟。
我怎样才能让它更有效率?
您可以使用 kron
代替 blockproc
创建块的索引,并使用 accumarray
将 max
应用到每个块。假设行数和列数是偶数,并且假设 data
是大小为 [6,8]
r = 6 ,c=8
idx = 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