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

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

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

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Keras-RL

Keras-RLは、Kerasを用いてDQNなどの深層強化学習アルゴリズムを実装したライブラリです。学習する強化学習の環境をOpenAI Gymのインターフェースに準じて作成することが必要です。

Python 3.x

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

Q&A

解決済

1回答

925閲覧

オートエンコーダ における任意の入力に対するデコーダの出力を知りたい

cdg_26

総合スコア27

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Keras-RL

Keras-RLは、Kerasを用いてDQNなどの深層強化学習アルゴリズムを実装したライブラリです。学習する強化学習の環境をOpenAI Gymのインターフェースに準じて作成することが必要です。

Python 3.x

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

0グッド

0クリップ

投稿2019/03/26 11:35

Kerasを用いて以下のようにAutoEncoder(AE)を作成しています.

python

1input = Input(shape=(np.shape(random_list)[1],)) 2 3def encoder(input): 4 encoded_1 = Dense(np.shape(random_list)[1], activation='relu')(obs_input) 5 encoded_2 = Dense(12, activation='relu')(encoded_1) 6 encoded_3 = Dense(15, name='encoder')(encoded_2) 7 return encoded_3 8 9def decoder(chokepoint_data): 10 decoded_1 = Dense(15, activation='relu',name='decoder_input')(chokepoint_data) 11 decoded_2 = Dense(12, activation='relu')(decoded_1) 12 decoded_3 = Dense(np.shape(random_list)[1], name='decoder')(decoded_2) 13 return decoded_3 14 15model = Model(input=input, output=decoder(encoder(input=input)))

質問

ここで,encoderを介さず任意の入力をdecoder与え,decoded_3を得るにはどのようなコードを書けば良いでしょうか.教えてください.

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

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

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

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

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

tiitoi

2019/03/26 12:06

デコーダーの入力とと同じ形状の配列をデコーダーに与えればいいだけでは?
cdg_26

2019/03/26 13:01

いつも迅速な回答ありがとうございます.とても助かっています. tiitoi様のご指摘で自分がつまずいている部分を勘違いしていることに気がつきました. 私が実現しようとしているのは,上記のようなAEをもう一つ用意しまして,各AEのencoderの出力(encoded_3)を足し合わせ,一つのdecoderに通したいということです. これを実現しようとした時, ```python encoder(input=input) + encoder_2(input=input_2) #もしくは K.get_value(encoder(input=input) + encoder_2(input=input_2)) ``` とした時にdecoderに通すことができません. 同じ配列の形のencoded_3を足し合わせているつもりなのですが... 何かお気付きの点はありますでしょうか.
guest

回答1

0

ベストアンサー

2つのエンコーダーの出力を足し合わせてデコーダーに与えたいのであれば、以下のようにモデルを作ってみてはどうでしょうか。
入力の次元数や中間層の値は適当なので、適宜変えてください。

python

1from keras.layers import Input, Dense, Add 2from keras.models import Model 3 4 5def encoder(input_): 6 d1 = Dense(10, activation="relu")(input_) 7 d2 = Dense(10, activation="relu")(d1) 8 d3 = Dense(10)(d2) 9 return d3 10 11 12def decoder(input_): 13 d1 = Dense(10, activation="relu")(input_) 14 d2 = Dense(10, activation="relu")(d1) 15 d3 = Dense(10)(d2) 16 return d3 17 18 19input1 = Input(shape=(100,)) 20input2 = Input(shape=(100,)) 21 22e1 = encoder(input1) 23e2 = encoder(input2) 24encoded = Add()([e1, e2]) 25decoded = decoder(encoded) 26 27model = Model(inputs=[input1, input2], outputs=decoded) 28 29#from keras.utils import plot_model 30#plot_model(model, to_file='model.png', show_shapes=True)

イメージ説明

追記

2つの出力を持つモデルでそれぞれ異なる損失関数を使用する方法

python

1from keras.layers import Input, Dense 2from keras.models import Model 3from keras import backend as K 4 5def encoder(input_): 6 d1 = Dense(10, activation="relu")(input_) 7 d2 = Dense(10, activation="relu")(d1) 8 d3 = Dense(10)(d2) 9 return d3 10 11 12def decoder(input_): 13 d1 = Dense(10, activation="relu")(input_) 14 d2 = Dense(10, activation="relu")(d1) 15 d3 = Dense(10)(d2) 16 return d3 17 18 19input1 = Input(shape=(100,)) 20input2 = Input(shape=(100,)) 21 22output1 = encoder(input1) 23output2 = encoder(input2) 24 25# モデルは適当なので、適宜変更してください。 26model = Model(inputs=[input1, input2], outputs=[output1, output2]) 27 28def my_loss_function(y_pred, y_true): 29 # (Batchsize,) のテンソルを返す自作の損失関数 30 # 以下は適当なので、適宜変更してください。 31 return K.mean(K.square(y_pred - y_true), axis=-1) 32 33model.compile(loss=['mean_squared_error', my_loss_function], # output1, output2 の出力に対応する損失関数 34 loss_weights=[1.0, 1.0], # 損失関数を足し合わせる際の重み 35 optimizer='adam')

投稿2019/03/26 13:23

編集2019/03/27 14:03
tiitoi

総合スコア21956

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

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

cdg_26

2019/03/26 14:08

回答ありがとうございます. 私の説明不足でした.申し訳ございません. 今回,2つのエンコーダ出力を足し合わせデコーダに通した値は,loss関数の計算で用いたいと考えています.ですので,2つのAEを別々のネットワークとして学習させようと考えています. 実装したいloss関数は, loss関数 = decoder_1(encoder_1(input_1) + encoder_2(input_2)) です. 現時点で,下記のようなコードを書いています. ```python from keras.layers import Input, Dense, Add from keras.models import Model #AE_1 def encoder_1(input_1): d1 = Dense(10, activation="relu")(input_1) d2 = Dense(10, activation="relu")(d1) d3 = Dense(10)(d2) return d3 def decoder_1(input_1): d1 = Dense(10, activation="relu")(input_) d2 = Dense(10, activation="relu")(d1) d3 = Dense(10)(d2) return d3 #AE_2 def encoder2(input_2): d1 = Dense(10, activation="relu")(input_2) d2 = Dense(10, activation="relu")(d1) d3 = Dense(10)(d2) return d3 def decoder2(input_2): d1 = Dense(10, activation="relu")(input_) d2 = Dense(10, activation="relu")(d1) d3 = Dense(10)(d2) return d3 input_1 = Input(shape=(100,)) input_2 = Input(shape=(100,)) def loss_func(y_true, y_pred): ???? model_1 = Model(inputs=input_1, outputs=decoder_1(encoder_1(input_1))) model_2 = Model(inputs=input_2, outputs=decoder_2(encoder_2(input_2))) model_1.compile(optimizer='adam', loss='loss_func', metrics=['accuracy']) model_2.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy']) ``` 長くなり申し訳ございませんが,ご検討いただければ幸いです.
tiitoi

2019/03/26 14:38 編集

すみませんが、以下の点がよくわからないです。 1. 「2つのエンコーダーを別々に学習する」と「2つのエンコーダーを足し合わせてloss 関数に使う」の意味 (前者と後者では矛盾しない?) 2. loss関数 = decoder_1(encoder_1(input_1) + encoder_2(input_2)) これだとデコーダーの値を最小化することになりますが、どのような意図でしょうか? 3. loss='loss_func' について 4. loss='mean_squared_error' で metrics=['accuracy'] が指定されている意味について (クラス分類ではなく、回帰問題であれば、accuracy という指標は使えないのでは?) もし、なにか論文または記事等を参考にして、具体的に実装したいモデルがあるのでしたら追記してください。
cdg_26

2019/03/27 11:31

回答ありがとうございます. この論文(https://arxiv.org/pdf/1707.03902.pdf)を参考に高次元な制御問題(Cart Pole等)を強化学習で解くため,入力次元数をAEで削減し学習コストを減らそうとしています. (強化学習は学習に時間がかかるため,あらかじめ次元数を削減したいというモチベーションです) 1.「2つのエンコーダーを別々に学習する」と「2つのエンコーダーを足し合わせてloss 関数に使う」の意味 (前者と後者では矛盾しない?) → AEを2つ(状態値履歴を学習するAE, 行動値履歴を学習するAE) 用意しまして,それぞれ別のloss関数を使おうと思っています.   1つは,平均二乗誤差MSE   もう一つは,自作のloss関数(式については下で説明します) 2. loss関数 = decoder_1(encoder_1(input_1) + encoder_2(input_2)) これだとデコーダーの値を最小化することになりますが、どのような意図でしょうか? → 最終的に実装したいloss関数は, loss = MSE + d( S' , decoder_S(encoder_S(input_S) + encoder_A(input_A))) ただし,MSEは平均二乗誤差, dは()内の2つの要素の距離, S'は次状態値,Sは状態値, Aは行動値に対応しています. この式には,強化学習において都合がよくなるように潜在変数へマッピングしたいという意図があります. つまり,行動主体がどの状態で同じ行動を取っても潜在変数空間での一状態遷移の差分が同じになっているようにしたいです. 3. loss='loss_func' について → 失礼いたしました.正しくは loss = loss_funcです 4. loss='mean_squared_error' で metrics=['accuracy'] が指定されている意味について (クラス分類ではなく、回帰問題であれば、accuracy という指標は使えないのでは?) → こちらも間違いです.失礼いたしました. わかりにくい説明で申し訳ございません.ご検討いただければ幸いです.
tiitoi

2019/03/27 14:06 編集

すみませんが、論文に目を通す時間がすぐにはとれないですが、質問内容である2つの出力があるモデルでそれぞれ異なる損失関数を適用して学習したい場合は追記したようにしてください。 1. model = Model(inputs=[input1, input2], outputs=[output1, output2]) 2. compile() する際に loss を出力と同じ数だけリストで指定する。 model.compile(loss=['mean_squared_error', my_loss_function], # output1, output2 の出力に対応する損失関数 loss_weights=[1.0, 1.0], # 損失関数を足し合わせる際の重み optimizer='adam')
cdg_26

2019/03/28 10:24

回答ありがとうございます. 入力,出力を2つずつ与え,それぞれ異なる損失関数を適用した場合, 学習後は,異なるNN重みを持つ別々の2つのAEモデルが得られるという認識でよろしいでしょうか?
tiitoi

2019/03/28 10:44

その認識であってます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問