对于您的培训,您似乎想要组合不一定引用相同上下文的特征。本质上,您有一个问题功能和一个响应功能。这两个恰好是文本数据,但它可以是数字的年龄或分类的性别。出于这个原因,您可能需要一个能够组合不同输入的模型,例如多层网络。
方法
您将拥有一个 LSTM 来处理您的问题功能和一个 LSTM 来处理您的回复功能。您将在第二阶段将两个 LSTM 的输出组合成一个完全连接的层,然后再将其传递给您的最终激活。
具体来说,步骤包括:
- 拆分批处理:准备您的数据集以允许
questions
单独responses
分发。这是确保批次大小相同所必需的。
- LSTM 模型:实例化两个 LSTM 模型,它们将分别接收问题和响应批次。
- FC 层:连接两个 LSTM 中每一个的最终 LSTM 单元的输出或隐藏状态,并馈入全连接层。在这里,您可以添加更多 FC 层,本质上使其成为要优化的超参数。
- 激活:激活函数适用于您的问题类型,例如二进制、多类等。
Questions_INPUTS ------> LSTM-1 -------->
|---> MERGE ---> SIGMOID
Responses_INPUTS ------> LSTM-2 -------->
我在 pytorch 中开发了类似的组合模型系统。在这方面,以下附录可能会有所帮助。
拆分批处理示例
实用程序:sklearn.model_selection.train_test_split(*arrays, **options)
和torch.utils.data
# train/test data split
questions_train, questions_test, responses_train, responses_test, train_y, test_y = train_test_split(
questions, responses, y, train_size=0.666, random_state=666)
# create tensor dataset
train_data = TensorDataset(
torch.from_numpy(questions_train), torch.from_numpy(responses_train),
torch.from_numpy(np.array(train_y))
)
# create dataloaders
train_loader = DataLoader(
train_data, shuffle=True,
batch_size=666, drop_last=True)
Forward() 方法示例
def forward(questions_batch, responses_batch):
# Handle questions features
X1 = self.embedding(questions_batch) # I assume you deal with text
# X1.shape = (batch_size, questions_len, embed_dim)
output, (h, c) = self.lstm(X1, self.hidden)
X1 = h[-1] # I assume unidirectional LSTM to keep example simple
# X1. shape = (batch_size, embed_dim1)
# Handle responses features
X2 = self.embedding(responses_batch) # I assume you deal with text
# X2.shape = (batch_size, responses_len, embed_dim)
output, (h, c) = self.lstm(X2, self.hidden)
X2 = h[-1] # I assume unidirectional LSTM to keep example simple
# X2. shape = (batch_size, embed_dim2)
# Merge features
X = torch.concat([X1, X2], dim=1)
# X.shape = (batch_size, (embed_dim1+embed_dim2) )
X = self.fc(X) # 1 or more fully connected linear layers
# X.shape = (batch_size, output_dim_fc1)
# Last layers to get the right output for your loss
...
在此处查看相关答案和讨论: