python - 如何使用 Keras 构建具有多个输入和单个输出的模型
问题描述
我正在尝试使用 Keras 的功能 api 来构建具有多个输入和单个输出的模型。目标是组合每个输入的每一行以预测相应的输出(1 或 0)。
例如concatenate(inputs_1[0], and inputs_2[0])
并预测输出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]
我在构建模型时遇到了一些困难,当我想重塑数据时会出现第一个困难。
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
对象没有属性reshape
我已阅读此功能性 api 文档,但对我没有多大帮助。但是,我现在知道我将通过串联将所有可用特征合并到一个大向量中。如何处理这些嵌套数组?
另一个困难是将数据拆分为训练、验证和测试。我发现的文章是基于单个输入数据进行的。有没有办法吐出多个数据输入?
在这种情况下,我如何定义层来构建模型?
我如何使用 api 来构建我的模型?
欢迎任何提示或模型的骨架。
先感谢您。
解决方案
您会问很多问题,这些问题通常不符合SO 准则。最好分别处理(先搜索,如果没有找到后问)每个问题。
不过,为了帮助您入门,我会尝试按照您的要求回答它们。首先,您的代码几乎没有问题 -
在
inputs_1
使用. _ 对 input_2使用和相同。inputs_2
reshape
inputs_1 = np.array(inputs_1)
接下来,您要应用 min max 缩放器,但您使用
reshape(-1,1)
. 这是没有意义的,因为最小-最大缩放对于每个特征都是相互独立的。我已经展示了如何重塑适当的最小-最大缩放。您还询问有关训练测试拆分的问题。
train_test_split
您可以像通常使用更多输入的方式一样简单地使用 sklearn 。最后,您询问了多输入 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,))
使用 min-max 缩放器进行缩放
#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,)]
具有 2 个输入和 1 个输出的 Keras 功能 API
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
推荐阅读
- java - 如何用 Java 加密 用 PHP 解密?
- azure - 有没有办法在部署组中配置多个本地 IIS 服务器的多个 IP 绑定?
- php - 如何将 AzureML(机器学习)与 AzureVM(虚拟机)连接起来?
- ninja - 如何将 Google Crashpad 构建到共享(动态)库中?
- javascript - api请求后,数组在控制台中被拆分为多个数组
- python - 如何在 Bloomberg BQUANT 函数中使用 BQL?
- javascript - 适用于 Android 的 Chrome 上的间歇性视频编解码器错误(Galaxy 平板电脑)
- python - 如何修复“TypeError: 'function' object is not subscriptable”?
- python - 多个脚本/蜘蛛写入不同的 CSV 文件。这段代码会引起任何问题吗?
- django - 我不知道为什么我的页面没有分页我没有收到任何错误请帮助:)