我想使用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个)并得出类别。因此,现在的形状是(500,100),而不是形状为(100)的输入。我不确定如何最好地创建网络体系结构,即:
1)我应该展平输入还是尝试减小尺寸?我可以为该工作使用哪些层?
2)我应该只用所有文本创建一个大序列吗?
3)拥有4维的LSTM甚至有意义吗?
4)是否存在使用令牌数组进行分类的示例?
文本是从不同来源收集的文本,因此,每批中不同的顺序不一定与日期有关。
答案 0 :(得分:0)
我不认为将所有文本合并在一起是解决方案。然后的问题是,如果将其馈送到LSTM,则每个文本的隐藏状态最初都不会启动。因此,您输入第一个文本,然后第二个和所有其他文本将具有当前隐藏状态。
您可以使用功能性API并创建不同的输入,并为每个输入提供自己的LSTM。然后,您可以合并它们,并在最后保留密集层。 您可以尝试的另一件事是使用CNN。同样,您将不得不创建多个输入或将所有输入连接起来,然后使用CNN层。这里的优势可能是速度。因为取决于您拥有的LSTM以及训练的输入量可能需要一段时间。特别是因为反向传播还必须经过每个时间步。因此,就性能而言,使用CNN可能会更好。
所以我要做的是将数组分别保留为最大长度。然后,将每个数组填充到该长度(如果它们太短)。然后,使用Functional API创建多个输入,并在其后面使用Conv1D图层。您进行了一些转换操作(可能会堆叠一些转换层,最大缓冲等)。然后,将它们与concatenate layer合并。然后您会有一些更密集的CNN。