質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Q&A

0回答

907閲覧

C言語を用いた1次元畳み込みとDepthwise畳み込みの理解

aoitori

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

0グッド

0クリップ

投稿2021/12/19 10:21

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; }

}
}

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問