Neural network 如何设置适当的参数来构建keras卷积2D NN模型[文本分类]?
我试图使用2D CNN对中文文章进行文本分类,但在设置kerasNeural 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:卷积内核中的列数。 边框模式:“有效”、“相同”或“完整”。(“
Convolution2D
的参数时遇到困难。我知道处理图像的基本流程卷积2D
,但仍然坚持使用keras的数据集
输入数据
建筑模型规范
问题1。我无法设置卷积2D
参数。我的研究成果如下:
官方文档不包含用于2D CNN文本分类的exmaple(尽管有1D CNN)
卷积2D
定义如下:
nb_过滤器:要使用的卷积过滤器的数量。nb_行:卷积内核中的行数。 nb_col:卷积内核中的列数。 边框模式:“有效”、“相同”或“完整”。(“完整”需要Theano后端。) 关于这些论点的一些研究:
- 本期是关于2D CNN的文本分类,我阅读了所有评论并选择: (一) (二) 但它似乎与当前的keras版本有些不同,而且不同的人命名的论点也很混乱(我希望keras有一个易于理解的论点解释)
- 我看到的关于当前api的另一条评论:
目前的API如下所示:
所以(36,1,7,7)似乎是原因,正确的论点应该是(36,7,7,…)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)
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)