web-dev-qa-db-ja.com

複数の入力を持つKeras逐次モデル

2つの入力を取り、1つの出力を生成するMLPモデルを作成しています。

2つの入力配列(各入力に1つ)と1つの出力配列があります。ニューラルネットワークには、2つのニューロンを持つ1つの非表示層があります。各配列には336個の要素があります。

model0 = keras.Sequential([
keras.layers.Dense(2, input_dim=2, activation=keras.activations.sigmoid, use_bias=True),
keras.layers.Dense(1, activation=keras.activations.relu, use_bias=True),
])

# Compile the neural network #
model0.compile(
    optimizer = keras.optimizers.RMSprop(lr=0.02,rho=0.9,epsilon=None,decay=0),
    loss = 'mean_squared_error',
    metrics=['accuracy']
)

私は2つの方法を試しましたが、どちらもエラーを出します。

model0.fit(numpy.array([array_1, array_2]),output, batch_size=16, epochs=100)

ValueError:入力チェック時のエラー:密集した入力は形状(2、)であることが期待されましたが、形状(336、)の配列を取得しました

2番目の方法:

model0.fit([array_1, array_2],output, batch_size=16, epochs=100)

ValueError:モデル入力のチェック時のエラー:モデルに渡すNumpy配列のリストが、モデルが予期したサイズではありません。 1つの配列が表示されることが期待されていましたが、代わりに次の2つの配列のリストが取得されました。

同様の質問 。ただし、順次モデルは使用しません。

3
ghostwar 88

この問題を解決するには、2つのオプションがあります。

1。順次モデルの使用

ネットワークに接続する前に、両方のアレイを1つに連結できます。 2つの配列の形状が(Number_data_points、)であると仮定します。これで、配列はnumpy.stackメソッドを使用してマージできます。

merged_array = np.stack([array_1, array_2], axis=1)

model0 = keras.Sequential([
keras.layers.Dense(2, input_dim=2, activation=keras.activations.sigmoid, use_bias=True),
keras.layers.Dense(1, activation=keras.activations.relu, use_bias=True),
])

model0.fit(merged_array,output, batch_size=16, epochs=100)

2。機能APIの使用

これは、モデルに複数の入力がある場合に使用する最も推奨される方法です。

input1 = keras.layers.Input(shape=(1, ))
input2 = keras.layers.Input(shape=(1,))
merged = keras.layers.Concatenate(axis=1)([input1, input2])
dense1 = keras.layers.Dense(2, input_dim=2, activation=keras.activations.sigmoid, use_bias=True)(merged)
output = keras.layers.Dense(1, activation=keras.activations.relu, use_bias=True)(dense1)
model10 = keras.models.Model(inputs=[input1, input2], output=output)

これで、モデルに適合させようとしている2番目の方法を使用できます。

model0.fit([array_1, array_2],output, batch_size=16, epochs=100)

7
Mitiku

あなたがリンクした答えのように、あなたは記載された理由のためにSequential AP​​Iを使用することはできません。機能APIとも呼ばれるModel AP​​Iを使用する必要があります。アーキテクチャ的には、入力を高密度レイヤーとどのように組み合わせるか、つまり中間レイヤーをどのように作成するかをモデルに定義する必要があります。マージ/追加または減算など/埋め込みレイヤーなどを構築する)、または2つのニューラルネットワークが必要です(各入力に1つ、最後のレイヤーの出力のみを結合したい)。上記のそれぞれのコードは異なります。

以下は、入力を形状のベクトル672にマージし、その入力でニューラルネットワークを構築することを想定した実用的なソリューションです。

import tensorflow as tf
from tensorflow.keras.layers import *
from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.optimizers import Adam, RMSprop
import numpy as np

input1 = Input(shape=(336,))
input2 = Input(shape=(336,))
input = Concatenate()([input1, input2])
x = Dense(2)(input)
x = Dense(1)(x)
model = Model(inputs=[input1, input2], outputs=x)
model.summary()

このモデルが2つの入力をマージまたは連結し、その上にニューラルネットワークを構築していることに気づくでしょう:

Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_1 (InputLayer)            (None, 336)          0                                            
__________________________________________________________________________________________________
input_2 (InputLayer)            (None, 336)          0                                            
__________________________________________________________________________________________________
concatenate (Concatenate)       (None, 672)          0           input_1[0][0]                    
                                                                 input_2[0][0]                    
__________________________________________________________________________________________________
dense (Dense)                   (None, 2)            1346        concatenate[0][0]                
__________________________________________________________________________________________________
dense_1 (Dense)                 (None, 1)            3           dense[0][0]                      
==================================================================================================
Total params: 1,349
Trainable params: 1,349
Non-trainable params: 0

中間層を作成する方法が他にもある場合は、Concatenate行をコード内の行で置き換える必要があります。

次に、モデルをコンパイルして適合させることができます。

model.compile(
    optimizer = RMSprop(lr=0.02,rho=0.9,epsilon=None,decay=0),
    loss = 'mean_squared_error',
    metrics=['accuracy']
)


x1, x2 = np.random.randn(100, 336),np.random.randn(100, 336,)
y = np.random.randn(100, 1)
model.fit([x1, x2], y)
2
Piyush Singh

上記のソリューションには推奨されるアプローチが含まれていますが、それでもエラーが発生します。だから私は以下を試しました。

for count in range (len(array_1)):
    input_array[count][0] = array_1[count]
    input_array[count][1] = array_2[count]

Array_1とArray_2は同じ長さでした。

そして、以前のようにモデルを作成してコンパイルしました。

最後にトレーニングのために、私は使用しました:

model0.fit(input_array, output_array, batch_size=16, epochs=100, verbose=0)

このアプローチは私にとってうまくいきました。

0
ghostwar 88