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

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

ただいまの
回答率

90.47%

  • Python 3.x

    10253questions

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

  • TensorFlow

    949questions

  • Keras

    507questions

  • Keras-RL

    10questions

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 168

cdg_26

score 14

 

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

input = Input(shape=(np.shape(random_list)[1],))

def encoder(input):
    encoded_1 = Dense(np.shape(random_list)[1], activation='relu')(obs_input)
    encoded_2 = Dense(12, activation='relu')(encoded_1)
    encoded_3 = Dense(15, name='encoder')(encoded_2)
    return encoded_3

def decoder(chokepoint_data):
    decoded_1 = Dense(15, activation='relu',name='decoder_input')(chokepoint_data)
    decoded_2 = Dense(12, activation='relu')(decoded_1)
    decoded_3 = Dense(np.shape(random_list)[1], name='decoder')(decoded_2)
    return decoded_3

model = Model(input=input, output=decoder(encoder(input=input)))

質問

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • tiitoi

    2019/03/26 21:06

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

    キャンセル

  • cdg_26

    2019/03/26 22: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を足し合わせているつもりなのですが...
    何かお気付きの点はありますでしょうか.

    キャンセル

回答 1

checkベストアンサー

+1

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

from keras.layers import Input, Dense, Add
from keras.models import Model


def encoder(input_):
    d1 = Dense(10, activation="relu")(input_)
    d2 = Dense(10, activation="relu")(d1)
    d3 = Dense(10)(d2)
    return d3


def decoder(input_):
    d1 = Dense(10, activation="relu")(input_)
    d2 = Dense(10, activation="relu")(d1)
    d3 = Dense(10)(d2)
    return d3


input1 = Input(shape=(100,))
input2 = Input(shape=(100,))

e1 = encoder(input1)
e2 = encoder(input2)
encoded = Add()([e1, e2])
decoded = decoder(encoded)

model = Model(inputs=[input1, input2], outputs=decoded)

#from keras.utils import plot_model
#plot_model(model, to_file='model.png', show_shapes=True)

イメージ説明

追記

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

from keras.layers import Input, Dense
from keras.models import Model
from keras import backend as K

def encoder(input_):
    d1 = Dense(10, activation="relu")(input_)
    d2 = Dense(10, activation="relu")(d1)
    d3 = Dense(10)(d2)
    return d3


def decoder(input_):
    d1 = Dense(10, activation="relu")(input_)
    d2 = Dense(10, activation="relu")(d1)
    d3 = Dense(10)(d2)
    return d3


input1 = Input(shape=(100,))
input2 = Input(shape=(100,))

output1 = encoder(input1)
output2 = encoder(input2)

# モデルは適当なので、適宜変更してください。
model = Model(inputs=[input1, input2], outputs=[output1, output2])

def my_loss_function(y_pred, y_true):
    # (Batchsize,) のテンソルを返す自作の損失関数
    # 以下は適当なので、適宜変更してください。
    return K.mean(K.square(y_pred - y_true), axis=-1)

model.compile(loss=['mean_squared_error', my_loss_function],  # output1, output2 の出力に対応する損失関数
              loss_weights=[1.0, 1.0],  # 損失関数を足し合わせる際の重み
              optimizer='adam')

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/26 23: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'])
    ```
    長くなり申し訳ございませんが,ご検討いただければ幸いです.

    キャンセル

  • 2019/03/26 23:36 編集

    すみませんが、以下の点がよくわからないです。
    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 という指標は使えないのでは?)

    もし、なにか論文または記事等を参考にして、具体的に実装したいモデルがあるのでしたら追記してください。

    キャンセル

  • 2019/03/27 20: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 という指標は使えないのでは?)
    → こちらも間違いです.失礼いたしました.

    わかりにくい説明で申し訳ございません.ご検討いただければ幸いです.

    キャンセル

  • 2019/03/27 23:05 編集

    すみませんが、論文に目を通す時間がすぐにはとれないですが、質問内容である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')

    キャンセル

  • 2019/03/28 19:24

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

    キャンセル

  • 2019/03/28 19:44

    その認識であってます

    キャンセル

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python 3.x

    10253questions

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

  • TensorFlow

    949questions

  • Keras

    507questions

  • Keras-RL

    10questions