如何解决如何使用 Keras 构建具有多个输入和单个输出的模型 使用 min-max 缩放器进行缩放针对多个输入/输出训练测试拆分具有 2 个输入和 1 个输出的 Keras 函数式 API训练多输入模型
我正在尝试使用 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,0.65],9,3],...
[[-18.73,8.93],1.62]]]
inputs_2 = [[[0.29,[28.31,-1.62]],[[8.98,[21.31,[[18.50,[25.89,...
[[-48.73,8.98],1.62]]]
outputs = [1,1,...
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
我已阅读此functional api doc,但对我帮助不大。
但是,我现在知道我将通过串联将所有可用特征合并到一个大向量中。如何处理这些嵌套数组?
另一个困难是将数据拆分为训练、验证和测试。 Articles 我发现它是基于单个输入数据的。有没有办法吐出多个输入的数据?
对于这种情况,我如何定义层来构建模型?
我如何使用 api 来构建我的模型?
欢迎提供任何提示或模型骨架。
提前致谢。
解决方法
您要问的问题有很多,但通常与 SO guidelines 无关。最好分别解决(先搜索,如果没有找到,再问)每个问题。
不过,只是为了帮助您入门,我会尝试按照您的要求回答它们。首先,您的代码几乎没有问题 -
-
在使用
inputs_1
之前,您必须先将inputs_2
和reshape
转换为一个 numpy 数组。对 input_2 使用inputs_1 = np.array(inputs_1)
和相同。 -
接下来,您想应用最小最大缩放器,但您使用
reshape(-1,1)
。这是没有意义的,因为最小-最大缩放是针对每个独立于另一个特征的。我已经展示了如何重塑以实现适当的最小-最大缩放。 -
您还询问了训练-测试拆分。您可以简单地使用 sklearn 的
train_test_split
,就像通常使用它的方式处理更多输入一样。 -
最后,您询问多输入 Keras 函数式 API。 documentation 真的做得非常好(实际上这也是 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,(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,4) (1000,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,y_test)]
[(800,4),(200,(800,2),),)]
具有 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],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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。