我正在尝试使用成对样本实现一个神经网络模型。详细信息如下所示:
原始数据:
- 例如,X_org的形状为(100, 50),即100个样本,每个样本有50个特征。
- Y_org的形状为(100, 1)。
处理这些原始数据以进行实际训练:
从X_org
中随机选择两个样本(因此我们有100*99/2种组合)形成一个新的’pairwise’样本,预测目标,即新的y标签,是两个相应y_org
标签的差值(Y_org_sample1 – Y_org_sample2)。现在我们有了新的X_train
和Y_train
。
我需要一个神经网络模型(DNN、CNN、LSTM,无论什么都可以),我可以将X_train
中一个成对样本的第一个子样本输入模型并得到一个结果,对第二个子样本进行相同的步骤。通过计算两个结果的差值,我可以得到这个成对样本的预测。这个预测将与Y_train
中对应的Y标签进行比较。
总的来说,我需要在输入一个’pairwise’样本(两个连续的子样本)后训练模型(更新权重)。我之所以不选择’双臂’模型(例如通过xxx.sub()
合并两个分支),是因为在测试过程中我只会输入一个子样本。最终我只会使用模型来预测一个子样本。
因此,我将在训练步骤中使用X_train
中的数据,而在测试步骤中使用类似X_org的数据格式。这看起来有点复杂。
看起来Tensorflow对于这项任务更为可行,如果keras也适用,请分享你的想法。
回答:
你可以首先创建一个模型,该模型只接受一个类似X_org的元素:
#创建一个你喜欢的模型,可以是Functional API或Sequential,没有问题
xOrgModel = createAModelForXOrgData(...)
现在,让我们创建第二个模型,这次必须使用功能API,该模型可以处理两个输入:
from keras.models import Model
from keras.layers import Input, Subtract
input1 = Input(shapeOfInput)
input2 = Input(shapeOfInput)
output1 = xOrgModel(input1)
output2 = xOrgModel(input2)
output = Subtract()([output1,output2])
pairWiseModel = Model([input1,input2],output)
现在你有两个模型:xOrgModel
和pairWiseModel
。你可以根据当前任务使用其中任何一个。
这两个模型共享它们的权重。这意味着你可以训练其中任何一个,另一个也会被更新。
使用成对模型
首先,将你的数据组织成两个独立的数组。(因为我们的模型使用两个输入)
L = len(X_org)
x1 = []
x2 = []
y = []
for i in range(L):
for j in range(i+1,L):
x1.append(X_org[i])
x2.append(X_org[j])
y.append(Y_org[i] - Y_org[j])
x1 = np.array(x1)
x2 = np.array(x2)
y = np.array(y)
使用输入列表进行训练和预测:
pairWiseModel.fit([x1,x2],y,...)