C言語でニューラルネット構築
C言語でCNNのようなニューラルネットを作っています。画像処理ではなく時系列データ用に下記のサイトを
参考に1次元畳み込み用に直しているのですが、28~39行目の理解が足らず、ちゃんとできているかわからないです。
あとこの畳み込みを基にDepthwise畳み込みをする場合は、29行目のochを消すだけでいいのですか?
参考サイト
https://www.acri.c.titech.ac.jp/wordpress/archives/5992
サイトのソース
10 void conv2d(const float* x, const float* weight, const float* bias, int32_t width, int32_t height,
11 int32_t in_channels, int32_t out_channels, int32_t ksize, float* y) {
12 for (int32_t och = 0; och < out_channels; ++och) {
13 for (int32_t h = 0; h < height; ++h) {
14 for (int32_t w = 0; w < width; ++w) {
15 float sum = 0.f;
16
17 for (int32_t ich = 0; ich < in_channels; ++ich) {
18 for (int32_t kh = 0; kh < ksize; ++kh) {
19 for (int32_t kw = 0; kw < ksize; ++kw) {
20 int32_t ph = h + kh - ksize/2;
21 int32_t pw = w + kw - ksize/2;
22
23 // zero padding
24 if (ph < 0 || ph >= height || pw < 0 || pw >= width) {
25 continue;
26 }
27
28 int64_t pix_idx = (ich * height + ph) * width + pw;
29 int64_t weight_idx = ((och * in_channels + ich) * ksize + kh) * ksize + kw;
30
31 sum += x[pix_idx] * weight[weight_idx];
32 }
33 }
34 }
35
36 // add bias
37 sum += bias[och];
38
39 y[(och * height + h) * width + w] = sum;
40 }
41 }
42 }
43 }
書き換え後のソース(biasは消しています)
void conv1d(const float* x, const float* weight, int TIME, int in_channels, int out_channels, int ksize, float* y) {
for (int och = 0; och < out_channels; ++och) {
for (int T = 0; T < TIME; ++T) {
float sum = 0.f;
for (int ich = 0; ich < in_channels; ++ich) { for (int kT = 0; kT < ksize; ++kT) { int pT = T + kT - ksize/2; if (pT < 0 || pT >= TIME ) { continue; } int pix_idx = ich * TIME + pT; int weight_idx = (och * in_channels + ich) * ksize + kT; sum += x[pix_idx] * weight[weight_idx]; } } y[(och * TIME + T)] = sum; }
}
}
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー