我正在尝试使用2D CNN对中文文章进行文本分类,并且无法设置keras Convolution2D
的参数。我知道Convolution2D
处理图像的基本流程,但是使用我的数据集与keras一起停留。
My data is 9800 Chinese Article, max sentence length is 6810,with 200 word2vec size.
So the input shape is `(9800, 1, 6810, 200)`
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)
问题1 。我有设置Convolution2D
参数的问题。我的研究如下,
官方文档不包含2D CNN文本分类的例子(尽管有1D CNN)。
Convolution2D
定义在这里https://keras.io/layers/convolutional/:
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)
nb_filter:要使用的卷积滤镜数 nb_row:卷积内核中的行数。 nb_col:卷积内核中的列数。 border_mode:'valid','same'或'full'。 ('完整'需要Theano后端。)
关于论点的一些研究:
此问题https://github.com/fchollet/keras/issues/233是关于用于文本分类的2D CNN,我阅读了所有评论并选择:
(1)https://github.com/fchollet/keras/issues/233#issuecomment-117427013
model.add(Convolution2D(nb_filter=N_FILTERS, stack_size=1, nb_row=FIELD_SIZE,
nb_col=1, subsample=(STRIDE, 1)))
(2)https://github.com/fchollet/keras/issues/233#issuecomment-117700913
sequential.add(Convolution2D(nb_feature_maps, 1, n_gram, embedding_size))
但它似乎与当前的keras版本存在一些差异,而且不同人命名的参数也是一团糟(我希望keras有一个易于理解的论证扩展)。
我看到关于当前api的另一个评论:
https://github.com/fchollet/keras/issues/1665#issuecomment-181181000
目前的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,one_sample_article_length [6810] / nb_filter),然后转到下一层,是吗?我的代码设置为nb_row
和nb_col
是否正确?
问题2 。什么是正确的MaxPooling2D参数? (对于我的日期或普通,也可以)
我引用此问题https://github.com/fchollet/keras/issues/233#issuecomment-117427013来设置参数,有两种:
MaxPooling2D(poolsize=(((nb_features - FIELD_SIZE) / STRIDE) + 1, 1))
MaxPooling2D(poolsize=(maxlen - n_gram + 1, 1))
我不知道他们为什么会这样计算MaxPooling2D
这个论点。
问题3 。是否建议batch_size
和nb_epoch
进行此类文字分类?我根本不知道。