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

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

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

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

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python 3.x

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Q&A

1回答

2759閲覧

kerasにおけるGANにてGeneratorの複数の出力をDiscriminatorの入力とする方法

aaa_ytooooo

総合スコア16

Keras

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

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

Python 3.x

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

0グッド

0クリップ

投稿2020/06/03 14:05

前提・実現したいこと

時系列データの生成を行うため、kerasにてGANを構成しようと思っております。Generatorの入力次元、出力次元はそれぞれ、
input_shape = (n_data, max_len, dim_in)
output_shape = (n_data, dim_out)
とし、Discriminatorの入力次元、出力次元をそれぞれ、
input_shape = (1, n_data, dim_out)
output_shape = (1, 1)
にしたいと考えております。GeneratorとDiscriminatorのうまく接続する方法はございますでしょうか?

該当のソースコード

Python

1import numpy as np 2from tensorflow.keras.models import Model 3from tensorflow.keras.layers import Input, LSTM, Dense 4 5# 任意の数 6n_data = 2 7dim_in = 3 8dim_out = 5 9max_length = 7 10dim_hidden = 11 11 12d_in = Input(shape=(n_data, dim_out, )) 13d = LSTM(dim_hidden)(d_in) 14d_out = Dense(1, activation='sigmoid')(d) 15discriminator = Model(d_in, d_out) 16 17g_in = Input(shape=(max_len, dim_in, )) 18g = LSTM(dim_hidden)(g_in) 19g_out = Dense(dim_out)(g) 20generator = Model(g_in, g_out) 21 22#combined modelの構築が分かりません。 23 24x = np.random.normal(0, 1, (n_data, max_len, dim_in)) 25gen_x = generator.predict(x) #gen_x.shape = (n_data, dim_out) 26gen_x = gen_x.reshape(1, n_data, dim_out) 27y = discriminator.predict(gen_x) # y.shape = (1, 1)

試したこと

kerasでは、入力と出力でのバッチサイズを同じにする必要があるというのを見つけました。GeneratorとDiscriminatorのバッチサイズを同じにするために、Generatorの入力を4階テンソルにすればよいのではないかと思いました。つまり、Generatorの入力次元、出力次元をそれぞれ、
input_shape = (batch_size, n_data, max_length, dim_in)
out_shape = (batch_size, n_data, dim_out)
にし、Discriminatorの入力次元、出力次元をそれぞれ、
input_shape = (batch_size, n_data, dim_out)
output_shape = (batch_size, 1)
にしようと思いました。しかし、公式ドキュメントによると、LSTMの入力は3階テンソルのみで、4階テンソルを入力にしようとすると、エラーが発生しました。

Python

1batch_size = 13 2 3d_in = Input(shape=(n_data, dim_out, )) 4d = LSTM(dim_hidden)(d_in) 5d_out = Dense(1, activation='sigmoid')(d) 6discriminator = Model(d_in, d_out) 7 8g_in = Input(shape=(n_data, max_len, dim_in, )) 9g = LSTM(dim_hidden)(g_in) #ここでエラーが発生 10g_out = Dense(dim_out)(g) 11generator = Model(g_in, g_out) 12 13#combined modelの構築が分かりません。 14 15x = np.random.normal(0, 1, (batch_size, n_data, max_len, dim_in)) 16gen_x = generator.predict(x) #理想は、gen_x.shape = (batch_size, n_data, dim_out) 17y = discriminator.predict(gen_x) # y.shape = (batch_size, 1)

補足情報(FW/ツールのバージョンなど)

Python 3.6.5
tensorflow-gpu 2.1.0

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

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

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

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

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

tacanoviano

2020/06/10 14:22

”うまく接続する”が実現できていないのかもしれませんが、該当のソースコードでエラーは出ませんでした。どうなればゴールなのでしょうか?
aaa_ytooooo

2020/06/10 17:08

該当のソースコードでは,エラーはでません。現在の状況では,Discriminatorの学習を行うことができるのですが,Generatorの学習ができません。Generatorの学習のために,DiscriminatorとGeneratorを接続したCombinedモデルを定義したいです。該当のソースコードのコメント「#combined modelの構築が分かりません。」の部分が記述されていないためエラーは出ません。想定するゴールとしましては,kerasのModelもしくはSequencialを用いて,g_inを入力とし,d_outを出力するようなモデルを定義したいと思っております。
guest

回答1

0

↓リンクの入力次元をアレンジするのはダメですか?

LSTMにこだわりがあるのでしょうか。

真贋を判定する目的のdiscriminatorに

LSTM(時系列データを予測するためのもの?)を使っているのが違和感を感じるのですが、

私の知識不足ですか?

リンク内容

【追記0617】
LSTMを使うとdiscriminator は(2,5,1)の入力を求めてくるのですが
generatorが(2,5)の出力しか出せないので
(私の今の知識では)combinedモデルが出来なかったです。
discriminatorは時系列データを扱っていても、次のデータを予測するわけではなく本物か偽物かを判定するのが仕事なので、別のモデルを組み込んではどうか↓と思いました。

Python3

1import tensorflow as tf 2from keras.backend import tensorflow_backend 3 4from tensorflow import keras 5from tensorflow.keras.models import Sequential,Model 6from tensorflow.keras.layers import Activation, Dense, Dropout, Flatten,Input,LSTM 7from tensorflow.keras import backend as K 8from tensorflow.keras.initializers import he_normal 9from tensorflow.keras.optimizers import Adam 10 11import os 12import numpy as np 13 14 15np.random.seed(0) 16np.random.RandomState(0) 17tf.set_random_seed(0) 18config = tf.ConfigProto(gpu_options=tf.GPUOptions(allow_growth=True)) 19session = tf.Session(config=config) 20tensorflow_backend.set_session(session) 21 22n_data= 2 23max_len = 7 24dim_in = 3 25dim_out = 5 26dim_hidden = 11 27 28 29def build_generator_l(): 30 model = Sequential() 31 model.add(LSTM(dim_hidden,input_shape=(max_len,dim_in))) 32 model.add(Dropout(0.2)) 33 model.add(Dense(dim_out*1)) 34 35 # model.summary() 36 37 return model 38 39def build_discriminator_l(): 40 model = Sequential() 41 #model.add(LSTM(dim_hidden,input_shape=(dim_out,1),return_sequences=False)) 42 model.add(Dense(dim_hidden,input_dim = dim_out , activation = 'relu')) 43 model.add(Dropout(0.2)) 44 model.add(Dense(1)) 45 46 # model.summary() 47 48 return model 49 50 51ge= build_generator_l()#Generator 52 53optimizer = Adam(lr=0.0002, beta_1=0.5)#Discriminator 54dsc = build_discriminator_l() 55dsc.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy']) 56 57z = Input(shape=( max_len, dim_in))#combinedモデル 58img = ge(z) 59dsc.trainable = False 60valid = dsc(img) 61cmb = Model(z,valid) 62cmb.compile(loss='binary_crossentropy', optimizer=optimizer) 63 64noise = np.random.normal(0, 1, (n_data, max_len, dim_in))#Generatorへの入力 65g_loss = cmb.train_on_batch(noise, np.ones((n_data, 1)))#Combinedモデルの学習(1バッチ) 66 67print(g_loss) 68

投稿2020/06/11 14:15

編集2020/06/16 15:43
tacanoviano

総合スコア46

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

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

aaa_ytooooo

2020/06/14 05:25

リンクの入力次元をアレンジの意味が分からないのですがどういうことでしょうか? discriminatorにLSTMを使っている理由としましては,C-RNN-GANのモデルを参考にdiscriminatorを構築しました.C-RNN-GANでは,discriminatorに双方向LSTMを使用しております。また,discriminatorに入力するデータが時系列データを想定しているためです。私自身も知識不足な部分もあるため,間違っているかもしれませんが,discriminatorをどのような構造にしても,generator側で問題が発生しているため,解決にはならないと思います。
aaa_ytooooo

2020/06/17 07:58

追記していただきありがとうございます。generatorの出力の次元が(2,5)なのは理解できますが、LSTMを用いた場合のdiscriminatorの入力次元が(2,5,1)の入力を求めてくるとはどういうことでしょうか? 私の考えとしましては、discriminatorの入力次元は(1, 2, 5)もしくは(batch_size, 2, 5)にしたいと考えております。 discriminatorにLSTMを使う必要がないことは理解しました。私の解釈ですが、RNNやLSTMでは各時刻ごとの入力データのつながりを表現できると思っております。discriminatorでは真偽を判定するだけですが、時刻ごとのデータのつながりも考えた上で真偽の判定ができればと思っておりました。
tacanoviano

2020/06/17 14:23 編集

LSTMのinput_shapeにデータのN数(n_data)やバッチ数(batch_size)を指定してモデル化することは(私には?)できません。一つの入力の形(今回は(5,1))を指定すると、自動でN数を前につけた入力(今回は(N数,5,1))を要求してきました。なので(2,1,5)はできるかもしれませんが、(1,2,5)はできそうにありません。あと、generatorの出力とdiscriminatorの入力は次元がそろっていないと、(LSTMでは)combinedを作れませんでした。何かテクニックがあるのかもしれませんが。LSTMでdiscriminatorを作る方法を探しつつ、別のモデルで学習を始めてはどうかと思います。combined modelを作らなければLSTMのdiscriminatorを学習させたり真贋判定させることはできる(generatorの出力(2,5)をreshape(2,5,1)とすればLSTMのdiscriminatorに入力できました)ので、別モデルで学習させたdiscriminatorとLSTMのdeiscriminatorどちらが優れているかは評価できると思います。
aaa_ytooooo

2020/06/29 15:11

コメントいただきありがとうございます。公式ドキュメントにもあるようにInputを用いればn_dataやbatch_sizeを含めた入力の形を指定することはできます。 generatorの出力次元とdiscriminatorの入力次元をそろえる必要があることは分かりますが、generatorの記述の仕方が分からないため、そろえることができていない状況です。 現在は別のモデルも探しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問