【问题标题】:How to Speed up code in matlab?如何加快matlab中的代码速度?
【发布时间】:2014-10-07 20:28:52
【问题描述】:

下面是我的神经网络前向传播代码。我想加快速度。至于循环需要时间,任何机构都可以帮助纠正代码以加快速度,比如matlab说vectorzing等。 在这段代码中,我每次从大小为 19x19 的输入中获取 4x4 的感受野,然后将每个像素乘以 4x4 的权重(大小为 19x19 的 net.w{layer_no}(u,v))。也可以说是两者的点积。我没有直接做两个小矩阵的点积,因为有边界检查。它提供了一个 6x6 的输出,最后保存在 output 中。我不是经验丰富的编码员,所以我尽我所能。任何人都可以指导我如何加快速度,因为与 Opencv 相比需要很多时间。会很感激。问候

    receptiveSize = 4;
    overlap= 1;
    inhibatory = 0;
    gap = receptiveSize-overlap;

    UpperLayerSize = size(net.b{layer_no}); % 6x6
    Curr_layerSize = size(net.w{layer_no}); % 19x19

    for u=1:UpperLayerSize(1)-1
        for v=1:UpperLayerSize(2)-1

            summed_value=0;
            min_u = (u - 1) * gap + 1;
            max_u = (u - 1) * gap + receptiveSize;
            min_v = (v - 1) * gap + 1;
            max_v = (v - 1) * gap + receptiveSize;
            for i = min_u : max_u
                for j = min_v : max_v
                    if(i>Curr_layerSize(1) || j>Curr_layerSize(2))
                        continue;
                    end
                    if(i<1 || j<1)
                        continue;
                    end
                    summed_value = summed_value + input{layer_no}.images(i,j,sample_ind) * net.w{layer_no}(i,j);
                 end
            end
            summed_value = summed_value + net.b{layer_no}(u,v);
            input{layer_no+1}.images(u,v,sample_ind) = summed_value;
        end
    end
    temp = activate_Mat(input{layer_no+1}.images(:,:,sample_ind),net.AF{layer_no});
    output{layer_no}.images(:,:,sample_ind) = temp(:,:);

【问题讨论】:

  • 好吧,除了 i 和 j 以外,还有什么意思吗?为什么不是 i 和 j?
  • 哦,好吧,我没注意到....
  • 你能提供一些你正在使用的矩阵吗?
  • @m_power 任意两个大小相等的矩阵,例如 a=randn(19,19); b=randn(19,19);

标签: matlab opencv optimization neural-network vectorization


【解决方案1】:

如何将内部循环(循环 i 和循环 j)替换为:

ii = max( 1, min_u ) : min( max_u, Curr_layerSize(1) );
jj = max( 1, min_v ) : min( max_v, Curr_layerSize(2) );
input{layer_no+1}.images(u,v,sample_ind) = ...
    reshape( input{layer_no}.images(ii,jj,sample_ind), 1, [] ) * ...
    reshape( net.w{layer_no}(ii,jj), [], 1 ) + ...
    net.b{layer_no}(u,v); %// should this term be added rather than multiplied?

【讨论】:

  • 额外的改进是将minmax置于循环之外:min_u = [0:ULS(1)-2]*gap;max_u = min_u + receptiveSize;min_u = min_u + 1; min_v = min_umax_v = max_u (如果可以保证 ULS(1) = ULS(2) 如问题中所述,概括将很简单)。而且max( 1, min_u ) = min_u always 和min( max_u, Curr_layerSize(1) ) 也可以在循环之前确定。 v 也是如此。
  • 是的,应该添加最后一个术语。让我试试看结果是一样还是不一样
  • 而不是那样,我确实喜欢这个,因为那个乘法有一些问题,因为我最终需要所有的总和,对于所有的点乘法,所以我做了一些这样的事情。就像我在这种情况下的代码一样,这也可以工作。并尝试使用您的想法。当我检查时间时,使用它可以减少大约 4 秒。 input.images{layer_no+1}(u,v,sample_ind) = sum(sum(input.images{layer_no}(min_u:max_u,min_v:max_v,sample_ind) .* ... net.w{layer_no}(min_u :max_u,min_v:max_v))) + ... net.b{layer_no}(u,v);
  • 不,你的代码是正确的,结果现在是一样的。让我重新检查一下所花费的时间。等待
  • @khan “我不明白 ULS(1) 是什么意思” ULS 意思是 UpperLayerSize 我想缩短已经很长的评论。
猜你喜欢
  • 2023-03-30
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2015-10-08
  • 2011-08-06
相关资源
最近更新 更多