为文本分类添加一个额外的维度
Adding an extra dimension to text classification
我想在 Keras 中使用神经网络进行文本分类。我已经使用以下网络设置了一个简单的测试示例:
model = Sequential()
model.add(Embedding(NUMVOCABOLARYWORDS, 5, input_length = sequenceDataPadded.shape[1]))
model.add(LSTM(256, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(128))
model.add(Dense(1))
此网络接受标记化的填充文本序列。例如。我标记文本 "hello world" = [0,1,0,0,0..]。它训练和评估都很好。
现在我的问题是我不想将单个序列输入网络,而是将一个集合(比如说 500 个)序列输入网络并得到一个类别。因此,现在输入的形状不再是 (100),而是 (500, 100)。我不确定如何最好地创建网络架构,即:
1) 我应该压平输入还是尝试减小尺寸?我可以为这项工作使用哪些图层?
2) 我应该只创建一个包含所有文本的大序列吗?
3) 拥有 4 个维度的 LSTM 是否有意义?
4) 是否存在使用标记数组进行分类的示例?
文本是从不同来源收集的文本,因此每批中的不同序列不一定与日期相关。
我不认为将所有文本合并在一起是解决方案。那么问题是,如果你将它提供给 LSTM,那么每个文本的隐藏状态最初都不会开始。所以你输入第一个文本,然后第二个和所有其他文本将具有当前隐藏状态。
您可以使用功能 API 并创建不同的输入并为每个输入提供自己的 LSTM。然后你可以合并它们并在最后有密集层。
您可以尝试的另一件事是使用 CNN。同样,您要么必须创建多个输入,要么连接所有输入,然后使用 CNN 层。这里的优势可能是速度。因为取决于您拥有多少 LSTM 以及您的输入有多大,训练可能需要相当长的时间。特别是因为反向传播还必须经过每个时间步。因此,在性能方面,使用 CNN 可能会更好。
所以我要做的是将数组分开,并设置最大长度。然后将每个数组填充到这个长度(如果它们太短)。然后使用 Functional API and use Conv1D Layers behind it. You do some conv operations (maybe stack a few conv layers, maxpooling, etc.). Then you merge them with the concatenate layer 创建多个输入。然后你有一些更密集的或CNN。
我想在 Keras 中使用神经网络进行文本分类。我已经使用以下网络设置了一个简单的测试示例:
model = Sequential()
model.add(Embedding(NUMVOCABOLARYWORDS, 5, input_length = sequenceDataPadded.shape[1]))
model.add(LSTM(256, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(128))
model.add(Dense(1))
此网络接受标记化的填充文本序列。例如。我标记文本 "hello world" = [0,1,0,0,0..]。它训练和评估都很好。
现在我的问题是我不想将单个序列输入网络,而是将一个集合(比如说 500 个)序列输入网络并得到一个类别。因此,现在输入的形状不再是 (100),而是 (500, 100)。我不确定如何最好地创建网络架构,即:
1) 我应该压平输入还是尝试减小尺寸?我可以为这项工作使用哪些图层?
2) 我应该只创建一个包含所有文本的大序列吗?
3) 拥有 4 个维度的 LSTM 是否有意义?
4) 是否存在使用标记数组进行分类的示例?
文本是从不同来源收集的文本,因此每批中的不同序列不一定与日期相关。
我不认为将所有文本合并在一起是解决方案。那么问题是,如果你将它提供给 LSTM,那么每个文本的隐藏状态最初都不会开始。所以你输入第一个文本,然后第二个和所有其他文本将具有当前隐藏状态。
您可以使用功能 API 并创建不同的输入并为每个输入提供自己的 LSTM。然后你可以合并它们并在最后有密集层。 您可以尝试的另一件事是使用 CNN。同样,您要么必须创建多个输入,要么连接所有输入,然后使用 CNN 层。这里的优势可能是速度。因为取决于您拥有多少 LSTM 以及您的输入有多大,训练可能需要相当长的时间。特别是因为反向传播还必须经过每个时间步。因此,在性能方面,使用 CNN 可能会更好。
所以我要做的是将数组分开,并设置最大长度。然后将每个数组填充到这个长度(如果它们太短)。然后使用 Functional API and use Conv1D Layers behind it. You do some conv operations (maybe stack a few conv layers, maxpooling, etc.). Then you merge them with the concatenate layer 创建多个输入。然后你有一些更密集的或CNN。