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

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

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

Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

396閲覧

Chainer 関数について

退会済みユーザー

退会済みユーザー

総合スコア0

Chainer

Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/07/04 01:51

以下のコードの意味を教えて頂けると幸いです。コード内の#(number)と段落部分は対応してると考えて頂けると幸いです。

chainer

1import chainer 2from chainer import cuda, Function, gradient_check, Variable, optimizers, serializers, utils 3import chainer.functions as F 4 5x = Variable(np.array([-1], dtype=np.float32)) #1 6print(F.sin(x).data) 7 8x = Variable(np.array([-0.5], dtype=np.float32)) #2 9z = F.cos(x) 10print(z.data) 11 12print(((-1) * F.sin(x)).data) #3 13 14x = Variable(np.array([-1,0,1], dtype=np.float32)) #4 15z = F.sin(x) 16z.grad = np.ones(3, dtype=np.float32) 17z.backward() 18print(z.grad)

1

自身の解釈では、上記コードはsin関数に-1を代入した値だと思います。sin関数に-1を代入することなど可能なのでしょうか。ここでは、それが可能になっているのが不思議です。arcsinでないのかと思うのですがあまり確信が持てず悩んでいます。

2

同様にcos関数に-0.5というのが意味が分からないです。

3

出力が0.47942555と表示されるのですが、sin関数に-0.5を代入して-1を掛けた値だと思うのですが、

chainer

1x = Variable(np.array([-0.5], dtype=np.float32)) #2 2z = F.cos(x) 3z.backward() 4print(x.grad)

の値、つまりcosをxで偏微分した値と同値ですが、これは何か意味があるのでしょうか。

4

[-1, 0, 1]をcos関数(sin関数を微分した)に代入したという解釈なのですが、途中のz.grad = np.ones(3, dtype=np.float32)の意味が分からないです。加えて、出力がnoneとなり何も出力されないことから、この解釈が間違っていると思うのですが、どこが間違っているのか分かりません。

ご教授頂けると幸いです。
よろしくお願いいたします。

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

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

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

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

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

can110

2020/07/04 02:02

提示コードは書籍などに書かれているものでしょうか。 ある場合は出典を、ない場合はそのコードがどのような場面(chainerの入門的な講義の~の説明で…など)で登場したのか記載すると適切な回答が得られやすくなると思います。
guest

回答1

0

ベストアンサー

自身の解釈では、上記コードはsin関数に-1を代入した値だと思います。sin関数に-1を代入することなど可能なのでしょうか。ここでは、それが可能になっているのが不思議です。arcsinでないのかと思うのですがあまり確信が持てず悩んでいます。

360°を2πとする「ラジアン」はご存じですよね。
Chainerに限らず、多くの言語処理系では三角関数の引数にはラジアンの数値を与えます。-1ラジアンということは、約-57°なのでsinの値は-0.84程度になります。

同様にcos関数に-0.5というのが意味が分からないです。

同様に-0.5ラジアンは約-29°なのでcosの値は0.88程度になります。

出力が0.47942555と表示されるのですが、sin関数に-0.5を代入して-1を掛けた値だと思うのですが、

(中略)の値、つまりcosをxで偏微分した値と同値ですが、これは何か意味があるのでしょうか。

「cosをxで偏微分」を手作業で行なうと「-sin」になりますから、その値を計算・表示することで、別コードの「Chainerで自動微分して求めた勾配」と一致するよね、と示したいのだと思います。

[-1, 0, 1]をcos関数(sin関数を微分した)に代入したという解釈なのですが、途中のz.grad = np.ones(3, dtype=np.float32)の意味が分からないです。加えて、出力がnoneとなり何も出力されないことから、この解釈が間違っていると思うのですが、どこが間違っているのか分かりません。

参照しているコードがどこのものかわからないのですが、おそらく最後のprint(z.grad)print(x.grad)の書き間違いなのでは。zが複数の要素を持つ場合、z.gradnp.onesで同じ要素数ですべて初期値1の配列を設定してz.backwardで自動微分を実行すると、x.gradにそれぞれの勾配[0.5403023 1. 0.5403023]が得られます。

投稿2020/07/04 02:43

編集2020/07/04 03:01
Daregada

総合スコア11990

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

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

退会済みユーザー

退会済みユーザー

2020/07/04 05:02

回答の程、ありがとうございます。 ご指摘の通り、最後の質問における、print(z.grad)はprint(x.grad)でした。 加えて、Daregadaさんの最後のお答えのところで、「z.gradにnp.onesで同じ要素数ですべて初期値1の配列を設定して」の部分がいまいち想像が出来ないのですが、もう少し簡単に説明可能でしょうか。 よろしくお願いいたします。
Daregada

2020/07/04 05:31 編集

xが3個の要素を持つ配列(厳密にはVariableオブジェクト)なので、zも3個の要素を持つ配列になりますね。 np.onesは指定した形状で各要素の値がすべて「1」の配列(厳密にはnumpy配列)を作る関数で、今回の形状は「3」(要素数3の一次元配列 [1., 1., 1.] )です。 これが必要な理由ですが、「複数の値に対して自動微分するときにはinitial errorを手動で設定しなくてははならない」とChainerのガイドに書いてありました。 https://docs.chainer.org/en/stable/guides/variables.html この新たに作られた配列をz.gradに代入してから、z.backwardを実行すると、x.gradにそれぞれの勾配が得られます。
退会済みユーザー

退会済みユーザー

2020/07/04 05:31

ありがとうございます。 理解することが出来ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問