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

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

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

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

深層学習

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

機械学習

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1217閲覧

tf.KerasでRankNetを実装するにあたって、同一のブロックを複数回モデルで使用したい。

Luna_rab

総合スコア17

Keras

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

深層学習

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

機械学習

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/08/27 11:06

やりたいこと

TensorflowでRankNetを実装しようと考えています。
想定しているモデルは図のような構造です。本来RankNetでは図中の緑枠内と赤枠内は同一のレイヤーを用いて計算を行うため、「やりたかった実装」のように中間モデルmodel_mid1を複数回モデルに与えたいのですが、下記のようなエラーが返ってきてしまいます。
現在は「現在の実装」のように中間モデルをそれぞれ別のものとして実装をしたのですが、これではmodel_mid1model_mid2で異なる計算をしてしまうため想定している構造ではありません。

最終的な用途として、複数の入力に対してmodel_midで推論を行い、その値を元に入力同士の順序関係を推測したいと考えています。そのため学習時はmodel.fit()で学習し、推論時はmodel_mid.predict()で推論を行いたいです。

どのようにすればモデル中に同一のレイヤーを複数回使用できるのでしょうか?

(機械学習に関して初学者なので用語の用法等に誤りがありましたらご指摘お願いします。)

実行環境

Python 3.8.3
tensorFlow 2.6.0

やりたかった実装

Python

1#実装したいコード 2dense_input = Input(shape=(LSTM_VAR_NUM,)) 3lstm_input = Input(shape=(None, DENSE_VAR_NUM,)) 4x = LSTM(64)(lstm_input) 5x = concatenate([dense_input,x]) 6x = Dense(64,activation='relu')(x) 7x = Dense(32,activation='relu')(x) 8output_mid1 = Dense(1,activation='linear')(x) 9 10model_mid = Model(inputs=[dense_input1,lstm_input1],outputs=output_mid1) 11 12z = Subtract()([model_mid.output, model_mid.output]) 13output = sigmoid(z) 14 15model = Model(inputs=[model_mid.input,model_mid.input],outputs=output)

エラー

error

1ValueError: The list of inputs passed to the model is redundant. All inputs should only appear once.

現在の実装

Python

1#実際に実装したコード 2dense_input1=Input(shape=(LSTM_VAR_NUM,)) 3lstm_input1 = Input(shape=(None, DENSE_VAR_NUM,)) 4x = LSTM(64)(lstm_input1) 5x = concatenate([dense_input1,x]) 6x = Dense(64,activation='relu')(x) 7x = Dense(32,activation='relu')(x) 8output_mid1 = Dense(1,activation='linear')(x) 9 10model_mid1 = Model(inputs=[dense_input1,lstm_input1],outputs=output_mid1) 11 12dense_input2=Input(shape=(LSTM_VAR_NUM,)) 13lstm_input2 = Input(shape=(None, DENSE_VAR_NUM,)) 14y = LSTM(64)(lstm_input2) 15y = concatenate([dense_input2,y]) 16y = Dense(64,activation='relu')(y) 17y = Dense(32,activation='relu')(y) 18output_mid2 = Dense(1,activation='linear')(y) 19 20model_mid2 = Model(inputs=[dense_input2,lstm_input2],outputs=output_mid1) 21 22z = Subtract()([model_mid1.output, model_mid2.output]) 23output = sigmoid(z) 24 25model = Model(inputs=[model_mid1.input,model_mid1.input],outputs=output)

モデル図

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

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

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

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

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

guest

回答1

0

自己解決

共有レイヤーなるものを使うと良いらしいです。
レイヤーを変数にしてmodel_mid1model_mid2で使用します。具体的には以下のコード。

Python

1lstm1 = LSTM(64) 2dense1 = Dense(256,activation='relu') 3dense2 = Dense(128,activation='relu') 4dense_output = Dense(1,activation='linear') 5 6dense_input1=Input(shape=(DENSE_VAR_NUM,)) 7lstm_input1 = Input(shape=(None, LSTM_VAR_NUM,)) 8x = lstm1(lstm_input1) 9x = concatenate([dense_input1,x]) 10x = dense1(x) 11x = dense2(x) 12output_mid1 = dense_output(x) 13 14model_mid1 = Model(inputs=[dense_input1,lstm_input1],outputs=output_mid1) 15 16dense_input2=Input(shape=(DENSE_VAR_NUM,)) 17lstm_input2 = Input(shape=(None, LSTM_VAR_NUM,)) 18y = lstm1(lstm_input2) 19y = concatenate([dense_input2,y]) 20y = dense1(y) 21y = dense2(y) 22output_mid2 = dense_output(y) 23 24model_mid2! = Model(inputs=[dense_input2,lstm_input2],outputs=output_mid2) 25 26z = Subtract()([model_mid1.output, model_mid2.output]) 27output = sigmoid(z) 28 29model = Model(inputs=[model_mid1.input,model_mid2.input],outputs=output)

イメージ説明
(図は全結合層が一つ増えてますが、、、)

参考
https://keras.io/ja/getting-started/functional-api-guide/

投稿2021/08/27 21:27

編集2021/08/27 21:29
Luna_rab

総合スコア17

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問