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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

432閲覧

pythonのclassを使ったコードと等価な展開コードを作る

sigefuji

総合スコア125

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2022/09/19 07:24

前提

参考書籍から抜粋編集したコードです。
これをよく理解するために、汎用性を考えずに、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

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

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

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

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

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

jbpb0

2022/09/19 09:45

https://note.nkmk.me/python-tensorflow-keras-basics/ も参考になると思います 同じモデルを、下記の三通りの方法で書いてます ・Sequential API:シンボリック(宣言型)API ・Functional API:シンボリック(宣言型)API ・Subclassing API (Model Subclassing):命令型(モデル サブクラス化)API
meg_

2022/09/19 10:18

参考書籍が何か分かりませんが、「等価な展開形ができなければ理解したことにならない」がスクラッチから実装することを意味するのであれば、ゼロから作るシリーズの書籍が参考になると思います。
sigefuji

2022/09/19 12:09

別な表現にしてみます。 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が返る
sigefuji

2022/09/19 12:21

jbpb0さん 3通りの方法のうち最初の2通りについては、ある程度その役割効果はおおよそ(中身でなく)知っています。 参考委書籍は件の本で、5章5節です。エッセンスだけ拾っています。 この質問はこれら3通りのうち、シーケンシャルモデルで、表現形式がことなるだけであろうと理解しています。ですので、何らかのシーケンシャルな記述ができるのではないかと考えたのが質問の趣旨です。 >等価な展開形ができなければ理解したことにならない」がスクラッチから実装すること の意味がわかりません。 なお理解と言う言葉にはそれほどの強い意味はありません。語彙力に乏しく適当な日本語が思いつきませんでした。 これらのことまで推し量って質問文に含めるのは難しいです。
sigefuji

2022/09/19 12:26

もしかすると、define and run と define by runとの違いがあると質問が成り立たないだろうとは思いますが。また自動微分の方式違いがあるとこれまただめですね。いずれも、今回のkerasでは同一と思っているのですが・・・。
jbpb0

2022/09/19 22:36

質問者さん >>等価な展開形ができなければ理解したことにならない」がスクラッチから実装すること > の意味がわかりません。 は、誰に向けたものですか?
sigefuji

2022/09/20 01:13

meg_さん 参考書籍は”物体画像認識時系列データ処理入門”の5章5節です。 質問で提示したコードの範囲で良いかと思いましたが、やはり他の部分もないとつじつまが合わないようでした。 >等価な展開形ができなければ理解したことにならない」がスクラッチから実装すること の意味がわかりません。 ゼロからシリーズの1巻と3巻を見ていますが、そのどのような種類の項目が参考になりますか。
sigefuji

2022/09/20 01:33

jbpb0さん >等価な展開形ができなけ の件。宛先を間違えました。失礼しました。 3通りの方法の内、3番目が質問のスタイルなのですね。今朝落ち着いて読んでみました。 NNの構築実装方法の違いはわかりました。その功罪、制限事項も色々記述されていましたが、理解できたのは一部です。しかし、かなり理解が進みました。
guest

回答1

0

ベストアンサー

tf.keras.Model の中身も実装しなければならないので、これは等価ではありません。
中身はkerasのソースを調べればわかるでしょう。

投稿2022/09/19 08:00

TakaiY

総合スコア12765

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

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

sigefuji

2022/09/19 08:26

ご返事ありがとうございます。 kerasの中身までわかる(展開する)必要があるとのことですが、残念ながらわかりません。 展開形のどの部分に問題があることになりますか。(実現できない所があるなど) 展開形の呼び出し1から呼び出し2の部分は少なくと良いとおもうのですが。
TakaiY

2022/09/19 08:37 編集

クラスを継承すると、superクラスの機能のすべても継承しているということなので、クラスを使わなのであれば、その機能を全てではなくとも実装する必要があります。 たとえば、MLP(arg1,arg2) の呼び出しではインスタンス化が行なわれ initが呼ばれますが、そこで`super().__init__()`を呼んでますよね。その処理は親クラスのソースを見ないとわかりませんね。 ソースは、 ドキュメント(https://www.tensorflow.org/api_docs/python/tf/keras/Model)からたどれます。 これですねソース(https://github.com/keras-team/keras/blob/v2.10.0/keras/engine/training.py#L69-L3735)
sigefuji

2022/09/19 08:40

展開形の質問でなくなってしまいますが、 sequensialモデルとみなしてadd,fitなどで構築可能でしょうか。(これは可能と思いますが) そもそもsequentialモデルとの違いが、少々分かりかねているのが疑問の発端です。
sigefuji

2022/09/19 08:44

さすがにそのソースを追う元気はないです。 クラスすべて継承なる機能用語も残念ながら理解できない状態ですが、すべてでなくとも、上に掲げた対象コードの範囲でも容易ではないですか。
TakaiY

2022/09/19 12:05

「sequensialモデルとみなしてadd,fitなどで構築可能でしょうか。」というのはどういう意味ですか? ニューラルネットワークをクラスを使わずに構築可能かという意味であれば、当然可能です。 ですが、それは、keras.Modelクラスを実装することとは程遠いでしょう。 「すべてでなくとも、上に掲げた対象コードの範囲でも容易ではないですか。」これの意味も不明です。 継承したクラスの機能の一部を実装/オーバーライドしている部分を外に出して実行しても、本体の処理が抜けているのでは特に意味は無いと思いますが。
sigefuji

2022/09/20 03:45

>「sequensialモデルとみなしてadd,fitなどで構築可能でしょうか。」というのはどういう意味ですか? sequetialモデルでは、kerasにたいするaddとかfitとかを使ってNNを作りますね。それと似たようなと言う意味の積りです。 >ニューラルネットワークをクラスを使わずに構築可能かという意味であれば、当然可能です。 ですが、それは、keras.Modelクラスを実装することとは程遠いでしょう。 そういう意味の積りですが、keras.Modelクラスと同じでなくとも、似たようなこと(等価でない所が質問と異なってしまいますが)ができるように表現すればどのようなかたちになるだろかと言う積りです。 >「すべてでなくとも、上に掲げた対象コードの範囲でも容易ではないですか。」これの意味も不明です。 同様に、似たようなことをする表現と言う積りです。 >継承したクラスの機能の一部を実装/オーバーライドしている部分を外に出して実行しても、本体の処理が抜けているのでは特に意味は無いと思いますが。 そういう部分があることはわかります。 その後他の方のアドバイスなどを参考に考えたところ このクラス処理の流れを考えてみました。 ーーー call MLPが呼ばれると keras.modelの処理が始まる initが呼ばれ、使うモデルの定義を行う。 モデルが実行され、途中でcallにより、必要な情報をモデルに返す。 このとき定義されたオブジェクトfc1,fc2,dropoutを参照する(使う) call終了時fc2の結果をkeras.modelに返す。 kerasu.modelクラスの終了後メイン処理に戻り、fitなどをcallする。 ーーー という処理の流れでよいでしょうか。 ここでまた、疑問があります。 そもそも質問のクラスはkeras.modelという名前であることがわからなかったのですが、 今においても、その名前は質問コード中のどこに現れるのでしょうか。(どこでその名前で呼ぶか)
TakaiY

2022/09/20 04:17

> sequetialモデルでは、kerasにたいするaddとかfitとかを使ってNNを作りますね。それと似たようなと言う意味の積りです。 > 同様に、似たようなことをする表現と言う積りです。 それは、Modelという元にしているクラス(とそれにふくまれるたくさんの機能)があるからできるのであって、使わないのであれば、全部実装することになります。 > という処理の流れでよいでしょうか。 ざっくりいえば合っていると思います。 >そもそも質問のクラスはkeras.modelという名前であることがわからなかった keras.model が tensorflow.keras.Model のことを指すのであれば、 class MLP(tf.keras.Model): このMLPの宣言のところでそれを継承しているからです。この説明が正しくて、読み取れていなかったのであれば、pythonについてもうすこし理解を深めてからとりかかったほうがいいように思います。
sigefuji

2022/09/20 09:01

>class MLP(tf.keras.Model): そうですね。見逃しました。 >ざっくりいえば合っていると思います。 わかりました。等価なことはできそうもないことはわかりました。大体流れがあっているならば、この質問は終わりにします。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問