[英]How to build a model having multiple inputs and a single output using Keras
我正在嘗試使用 Keras 的功能 api 來構建具有多個輸入和單個 Z78E6221F6393D14CEDZD8CZ 的 model。 目標是結合每個輸入的每一行來預測對應的 output(1 或 0)。
例如concatenate(inputs_1[0], and inputs_2[0])
並預測output outputs[0]
我的數據結構如下所示:
inputs_1 = [[[-18.73, 8.98, 0.29, 0.23],[58.50, 28.31, 45.89, -1.62], [48.70, 21.31, 25.89, 1.62]],
[[-18.73, 8.98, 0.29, 0.65],[58.50, 28.31, 45.89, -1.62], [48.70, 21.31, 25.89, 1.62]],
[[-18.73, 8.98, 0.29, 9,3],[58.50, 28.31, 45.89, -1.62], [48.70, 21.31, 25.89, 1.62]],
...
[[-18.73, 8.98, 0.29, 8.93],[58.50, 28.31, 45.89, -1.62], [48.70, 21.31, 25.89, 1.62]]]
inputs_2 = [[[0.29, 0.23], [28.31, -1.62]],
[[8.98, 0.65], [21.31, 1.62]],
[[18.50, -1.62], [25.89, 1.62]],
...
[[-48.73, 8.98], [48.70, 1.62]]]
outputs = [1,
1,
0,
...
0]
我在構建 model 時遇到了一些困難,當我想重塑數據時會出現第一個困難。
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
# scale our data set so that every observation is between 0 and 1
training_data = scaler.fit_transform(inputs_1.reshape(-1, 1))
但是list
object 沒有屬性reshape
我已閱讀此功能性 api 文檔,但對我沒有多大幫助。 但是,我現在知道我將通過串聯將所有可用特征合並到一個大向量中。 如何使用這些嵌套的 arrays 執行此操作?
另一個困難是將數據拆分為訓練、驗證和測試。 我發現的文章是基於單個輸入數據進行的。 有沒有辦法吐出多個數據輸入?
我如何定義層,在這種情況下構建 model?
我如何使用 api 來構建我的 model?
歡迎任何提示或模型的骨架。
先感謝您。
您會問很多問題,這些問題通常不符合SO 准則。 最好分別處理(先搜索,如果沒有找到后問)每個問題。
不過,為了幫助您入門,我會嘗試按照您的要求回答它們。 首先,您的代碼幾乎沒有問題 -
在使用reshape
之前,您必須首先將inputs_1
和inputs_2
轉換為 numpy 數組。 使用inputs_1 = np.array(inputs_1)
和 input_2 相同。
接下來,您想應用 min max 縮放器,但您使用reshape(-1,1)
。 這是沒有意義的,因為最小-最大縮放對於每個特征都是相互獨立的。 我已經展示了如何重塑適當的最小-最大縮放。
您還詢問有關訓練測試拆分的問題。 您可以簡單地使用 sklearn 的train_test_split
,就像您通常使用更多輸入的方式一樣。
最后,您詢問多輸入 Keras 功能 API。 文檔確實做得很好(實際上這也是 keras 的作者的理念,讓深度學習易於學習和實施)。 我在下面添加了一個示例 -
#Dummy data (USE YOUR OWN DATA HERE AS NUMPY ARRAYS
import numpy as np
X1 = np.random.random((1000, 3, 4))
X2 = np.random.random((1000, 2, 2))
y = np.random.randint(0, 2, (1000,))
#Scaling individual features by respective min max for 3D tensors
from sklearn.preprocessing import MinMaxScaler
#Have separate scaler objects for each input data
scaler1 = MinMaxScaler()
scaler2 = MinMaxScaler()
#Ensure that in reshape to 2D matrix, you keep the number of features separate
#as min-max scaler works on each feature's respective min-max values
#Then, reshape it back to the 3D dataset
X1_scaled = scaler1.fit_transform(X1.reshape(-1,X1.shape[-1])).reshape(X1.shape)
X2_scaled = scaler1.fit_transform(X2.reshape(-1,X2.shape[-1])).reshape(X2.shape)
print(X1_scaled.shape, X2_scaled.shape)
(1000, 3, 4) (1000, 2, 2)
from sklearn.model_selection import train_test_split
X1_train, X1_test, X2_train, X2_test, y_train, y_test = train_test_split(X1_scaled, X2_scaled, y, test_size=0.2)
[i.shape for i in (X1_train, X1_test, X2_train, X2_test, y_train, y_test)]
[(800, 3, 4), (200, 3, 4), (800, 2, 2), (200, 2, 2), (800,), (200,)]
from tensorflow.keras import layers, Model, utils
inp1 = layers.Input((3,4))
inp2 = layers.Input((2,2))
x1 = layers.Flatten()(inp1)
x2 = layers.Flatten()(inp2)
x = layers.concatenate([x1, x2])
x = layers.Dense(32)(x)
out = layers.Dense(1, activation='sigmoid')(x)
model = Model([inp1, inp2], out)
utils.plot_model(model, show_layer_names=False, show_shapes=True)
model.compile(loss='binary_crossentropy', optimizer='adam')
model.fit([X1_train, X2_train], y_train, epochs=4)
Epoch 1/4
25/25 [==============================] - 0s 674us/step - loss: 0.7310
Epoch 2/4
25/25 [==============================] - 0s 753us/step - loss: 0.7198
Epoch 3/4
25/25 [==============================] - 0s 842us/step - loss: 0.7147
Epoch 4/4
25/25 [==============================] - 0s 2ms/step - loss: 0.7079
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.