Neural network 如何设置适当的参数来构建keras卷积2D NN模型[文本分类]?

Neural network 如何设置适当的参数来构建keras卷积2D NN模型[文本分类]?,neural-network,classification,deep-learning,keras,conv-neural-network,Neural Network,Classification,Deep Learning,Keras,Conv Neural Network,我试图使用2D CNN对中文文章进行文本分类,但在设置kerasConvolution2D的参数时遇到困难。我知道处理图像的基本流程卷积2D,但仍然坚持使用keras的数据集 输入数据 建筑模型规范 问题1。我无法设置卷积2D参数。我的研究成果如下: 官方文档不包含用于2D CNN文本分类的exmaple(尽管有1D CNN) 卷积2D定义如下: nb_过滤器:要使用的卷积过滤器的数量。 nb_行:卷积内核中的行数。 nb_col:卷积内核中的列数。 边框模式:“有效”、“相同”或“完整”。(“

我试图使用2D CNN对中文文章进行文本分类,但在设置keras
Convolution2D
的参数时遇到困难。我知道处理图像的基本流程
卷积2D
,但仍然坚持使用keras的数据集

输入数据 建筑模型规范 问题1。我无法设置
卷积2D
参数。我的研究成果如下:

官方文档不包含用于2D CNN文本分类的exmaple(尽管有1D CNN)

卷积2D
定义如下:

nb_过滤器:要使用的卷积过滤器的数量。
nb_行:卷积内核中的行数。 nb_col:卷积内核中的列数。 边框模式:“有效”、“相同”或“完整”。(“完整”需要Theano后端。)

关于这些论点的一些研究:

  • 本期是关于2D CNN的文本分类,我阅读了所有评论并选择:

    (一)

    (二)

    但它似乎与当前的keras版本有些不同,而且不同的人命名的论点也很混乱(我希望keras有一个易于理解的论点解释)

  • 我看到的关于当前api的另一条评论:

    目前的API如下所示:

        keras.layers.convolutional.Convolution2D(nb_filter, nb_row, nb_col, init='glorot_uniform', activation='linear', weights=None, border_mode='valid', subsample=(1, 1), dim_ordering='th', W_regularizer=None, b_regularizer=None, activity_regularizer=None, W_constraint=None, b_constraint=None)
    
    所以(36,1,7,7)似乎是原因,正确的论点应该是(36,7,7,…)

通过以上研究,根据我对卷积的理解,
Convolution2D
创建一个(nb_filter,nb_row,nb_col)过滤器,通过滑动一个跨步得到一个过滤结果,递归滑动,最后将结果与形状(1,一个样本文章长度[6810]/nb_filter)组合成数组,并进入下一层,对吗?下面设置的代码是否正确

问题2。什么是正确的MaxPoolig2D参数?(对于我的日期集或commonm,两者都可以)

我引用此问题来设置参数,有两种:

  • MaxPooling2D(poolsize=((nb_功能-字段大小)/STRIDE)+1,1))
  • MaxPooling2D(poolsize=(maxlen-n_gram+1,1))
我不知道他们为什么这样计算
MaxPooling2D
参数


问题3。有没有关于
batch\u size
nb\u epoch
进行此类文本分类的建议?我一点也不知道。

我想你应该把这一个问题分成几个独立的问题。六个问题合一有点多。@nemo没问题,我现在就把它分开。@nemo有没有建议把最后三个问题分开处理?我知道的不多,但他们似乎相互关联。@Mithril是的,他们当然是相互关联的。通过有效地使用标记,可以使它们在某种程度上保持在一起。您还可以重新提交3(6??)个问题的背景信息。您还可以提供指向其他问题的链接。(例如,如果您创建了3个问题,那么这3个问题中的每一个都可以有2个到其他2个的链接。)HTH@米特里尔,我也想帮你回答,但我不知道你是怎么利用CNN的。你也在做类似的事情吗?你已经有向量这个词了吗?(好像是的。)您能解释一下输入向量中的尺寸吗
(9800,1681000)
?我假设
9800
是样本数,
200
是单词向量中的维数,
6810
似乎是句子长度(!!),什么是
1
?简言之,与Keras无关的问题是什么?你想怎么做这个模型?
MAX_FEATURES = 6810

# I just randomly pick one filter, seems this is the problem?
nb_filter = 128

input_shape = (1, 6810, 200)

# each word is 200 (word2vec size)
embedding_size = 200 

# 3 word length
n_gram = 3 

# so stride here is embedding_size*n_gram

model = Sequential()

model.add(Convolution2D(nb_filter, n_gram, embedding_size, border_mode='valid', input_shape=input_shape))

model.add(MaxPooling2D(pool_size=(100, 1), border_mode='valid'))

model.add(Dropout(0.5))
model.add(Activation('relu'))

model.add(Flatten())

model.add(Dense(hidden_dims))
model.add(Dropout(0.5))
model.add(Activation('relu'))

model.add(Dense(1))
model.add(Activation('sigmoid'))

model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])


# X is (9800, 1, 6810, 200)

model.fit(X, y, batch_size=32,
              nb_epoch=5,
              validation_split=0.1)
keras.layers.convolutional.Convolution2D(nb_filter, nb_row, nb_col, init='glorot_uniform', activation=None, weights=None, border_mode='valid', subsample=(1, 1), dim_ordering='default', W_regularizer=None, b_regularizer=None, activity_regularizer=None, W_constraint=None, b_constraint=None, bias=True)
model.add(Convolution2D(nb_filter=N_FILTERS, stack_size=1, nb_row=FIELD_SIZE,
                    nb_col=1, subsample=(STRIDE, 1)))
sequential.add(Convolution2D(nb_feature_maps, 1, n_gram, embedding_size))
    keras.layers.convolutional.Convolution2D(nb_filter, nb_row, nb_col, init='glorot_uniform', activation='linear', weights=None, border_mode='valid', subsample=(1, 1), dim_ordering='th', W_regularizer=None, b_regularizer=None, activity_regularizer=None, W_constraint=None, b_constraint=None)