如何在caffe中的矩阵之间做点积?

时间:2017-01-16 07:59:06

标签: caffe matrix-multiplication cblas inner-product

在内部产品层中,我需要乘以(top_diff * bottom_data) .* (2*weight)。首先,我们在result = top_diff * bottom_data中计算(caffe_cpu_gemm)矩阵乘法,然后在dot productweight之间进行result

更多解释定义如下:

const Dtype* weight = this->blobs_[0]->cpu_data();
     if (this->param_propagate_down_[0]) {
            const Dtype* top_diff = top[0]->cpu_diff();
            const Dtype* bottom_data = bottom[0]->cpu_data();
caffe_cpu_gemm<Dtype>(CblasTrans, CblasNoTrans, N_, K_, M_, (Dtype)1.,
        top_diff, bottom_data, (Dtype)1., this->blobs_[0]->mutable_cpu_diff());
}

为了更加了解,我查看了math_function.c。它实现如下:

template<>
void caffe_cpu_gemm<float>(const CBLAS_TRANSPOSE TransA,
    const CBLAS_TRANSPOSE TransB, const int M, const int N, const int K,
    const float alpha, const float* A, const float* B, const float beta,
    float* C) {
  int lda = (TransA == CblasNoTrans) ? K : M;
  int ldb = (TransB == CblasNoTrans) ? N : K;
  cblas_sgemm(CblasRowMajor, TransA, TransB, M, N, K, alpha, A, lda, B,
      ldb, beta, C, N);
}

我想我应该在result = top_diff * bottom_data中执行乘法(caffe_cpu_gemm()),然后在dot product weight执行<?php $args = array( 'order' => 'DESC', 'showposts' => 1, 'post_type' => 'video', 'paged' => $paged ); $the_query = new WP_Query($args); // The Query if($the_query->have_posts()) : while($the_query->have_posts()): $the_query->the_post(); ?> <?php the_title(); ?> <?php wp_reset_query(); endwhile; else : echo "no posts!"; endif; ?> <?php $big = 999999999; // need an unlikely integer echo paginate_links(array( // 'base' => str_replace( $big, '', esc_url( get_pagenum_link( $big ) ) ), 'base' => str_replace($big, '%#%', esc_url(get_pagenum_link($big))), 'format' => '?paged=%#%', 'current' => max(1, get_query_var('paged') ), 'total' => $the_query->max_num_pages )); ?> 。我该怎么办?!

非常感谢!!!!任何建议将不胜感激!

1 个答案:

答案 0 :(得分:1)

如果您只想在两个矩阵之间执行点积,可以使用以下函数在CPU上乘以矩阵,

void caffe_mul<float>(const int n, const float* a, const float* b, float* y)

如果您想在GPU上执行相同的操作,请使用此模板

void caffe_gpu_mul<float>(const int N, const float* a, const float* b, float* y)

a和b是你的矩阵,c将包含最终结果。 N是矩阵中元素的总数。

你也可以使用&#39; Eltwise&#39;层,已经这样做了。