前提
参考書籍から抜粋編集したコードです。
これをよく理解するために、汎用性を考えずに、classを使わずに展開する等価なコードはどのようになりますか。
この展開形でも同じ動作をすること。
ここではclassを使う方が理解しやすいとの意見は無しとさせていただきます。
等価な展開形ができなければ理解したことにならないので。
該当のソースコード
python
1hidden_dim=100 2output_dim=10 3 4class MLP(tf.keras.Model): 5 def __init__(self, hidden_dim, output_dim): 6 super().__init__() 7 self.fc1 = tf.keras.layers.Dense(hidden_dim, activation='relu') 8 self.dropout = tf.keras.layers.Dropout(0.50) 9 self.fc2 = tf.keras.layers.Dense(output_dim, activation='softmax') 10 11 def call(self, x): # MLPのインスタンスからコールバックされる関数 12 x = self.fc1(x) 13 x = self.dropout(x) 14 x = self.fc2(x) 15 return x 16 17#呼び出し条件1の設定 18model = MLP(arg1,arg2) # 呼び出しno.1 19 20#呼び出し条件2の設定 21model = MLP(arg1,arg2) # 呼び出しno.2
試したこと
考えた展開形ですが、まったく自信がありません。
python
1hidden_dim=100 2output_dim=10 3 4def call(self, x): # MLPのインスタンスからコールバックされる関数 5 x = self.fc1(x) 6 x = self.dropout(x) 7 x = self.fc2(x) 8 return x 9 10# super().__init__(hidden_dim, output_dim) 11fc1 = tf.keras.layers.Dense(hidden_dim, activation='relu') 12dropout = tf.keras.layers.Dropout(0.50) 13fc2 = tf.keras.layers.Dense(output_dim, activation='softmax') 14 15 16# 呼び出しno.1 17x = fc1(x) 18x = dropout(x) 19x = fc2(x) 20 21# 呼び出しno.2 22x = fc1(x) 23x = dropout(x) 24x = fc2(x) 25
> sequentialモデルとの違いが、少々分かりかねている
https://developers-jp.googleblog.com/2019/03/what-are-symbolic-and-imperative-apis-in-tensorflow-2-0.html
の、「シンボリック API のメリットと制限事項」と「命令型 API のメリットと制限事項」
を見てください
> class MLP(tf.keras.Model):
は、上記Webページの「命令型(モデル サブクラス化)API」です
https://note.nkmk.me/python-tensorflow-keras-basics/
も参考になると思います
同じモデルを、下記の三通りの方法で書いてます
・Sequential API:シンボリック(宣言型)API
・Functional API:シンボリック(宣言型)API
・Subclassing API (Model Subclassing):命令型(モデル サブクラス化)API
参考書籍が何か分かりませんが、「等価な展開形ができなければ理解したことにならない」がスクラッチから実装することを意味するのであれば、ゼロから作るシリーズの書籍が参考になると思います。
別な表現にしてみます。
MLPが呼ばれると以下のような処理の流れになる。
このような理解をしましたが、正しいでしょうか、それともどこか間違っていますか。
どれも全く間違っていると残念です。
1.MLPが呼ばれる
2.initが実行される
3.tf.keras.layers.Denseを呼ぶ(modelの定義段階)
4.tf.keras.layers.Dropoutを呼ぶ(modelの定義段階)
5.tf.keras.layers.Denseを呼ぶ(modelの定義段階)
(どこかでMLPのインスタンスができる)
インスタンスからcallがcallbackされ、次が実行される。
6.fc1
7.dropout
8.fc2
9.callの戻り値としてmodelのオブジェクトxが返る
jbpb0さん
3通りの方法のうち最初の2通りについては、ある程度その役割効果はおおよそ(中身でなく)知っています。
参考委書籍は件の本で、5章5節です。エッセンスだけ拾っています。
この質問はこれら3通りのうち、シーケンシャルモデルで、表現形式がことなるだけであろうと理解しています。ですので、何らかのシーケンシャルな記述ができるのではないかと考えたのが質問の趣旨です。
>等価な展開形ができなければ理解したことにならない」がスクラッチから実装すること
の意味がわかりません。
なお理解と言う言葉にはそれほどの強い意味はありません。語彙力に乏しく適当な日本語が思いつきませんでした。
これらのことまで推し量って質問文に含めるのは難しいです。
もしかすると、define and run と define by runとの違いがあると質問が成り立たないだろうとは思いますが。また自動微分の方式違いがあるとこれまただめですね。いずれも、今回のkerasでは同一と思っているのですが・・・。
質問者さん
>>等価な展開形ができなければ理解したことにならない」がスクラッチから実装すること
> の意味がわかりません。
は、誰に向けたものですか?
meg_さん
参考書籍は”物体画像認識時系列データ処理入門”の5章5節です。
質問で提示したコードの範囲で良いかと思いましたが、やはり他の部分もないとつじつまが合わないようでした。
>等価な展開形ができなければ理解したことにならない」がスクラッチから実装すること
の意味がわかりません。
ゼロからシリーズの1巻と3巻を見ていますが、そのどのような種類の項目が参考になりますか。
jbpb0さん
>等価な展開形ができなけ
の件。宛先を間違えました。失礼しました。
3通りの方法の内、3番目が質問のスタイルなのですね。今朝落ち着いて読んでみました。
NNの構築実装方法の違いはわかりました。その功罪、制限事項も色々記述されていましたが、理解できたのは一部です。しかし、かなり理解が進みました。
回答1件
あなたの回答
tips
プレビュー