我正在通过此链接了解文本分类的多渠道cnn模型。
代码基于this tutorial.
我已经了解了大多数事情,但是我不明白Keras如何定义某些图层的输出形状。
代码如下:
定义一个具有三个输入通道的模型,以处理4克,6克和8克电影评论文本。
#Skipped keras imports
# load a clean dataset
def load_dataset(filename):
return load(open(filename,'rb'))
# fit a tokenizer
def create_tokenizer(lines):
tokenizer = Tokenizer()
tokenizer.fit_on_texts(lines)
return tokenizer
# calculate the maximum document length
def max_length(lines):
return max([len(s.split()) for s in lines])
# encode a list of lines
def encode_text(tokenizer,lines,length):
# integer encode
encoded = tokenizer.texts_to_sequences(lines)
# pad encoded sequences
padded = pad_sequences(encoded,maxlen=length,padding='post')
return padded
# define the model
def define_model(length,vocab_size):
# channel 1
inputs1 = Input(shape=(length,))
embedding1 = Embedding(vocab_size,100)(inputs1)
conv1 = Conv1D(filters=32,kernel_size=4,activation='relu')(embedding1)
drop1 = Dropout(0.5)(conv1)
pool1 = MaxPooling1D(pool_size=2)(drop1)
flat1 = flatten()(pool1)
# channel 2
inputs2 = Input(shape=(length,))
embedding2 = Embedding(vocab_size,100)(inputs2)
conv2 = Conv1D(filters=32,kernel_size=6,activation='relu')(embedding2)
drop2 = Dropout(0.5)(conv2)
pool2 = MaxPooling1D(pool_size=2)(drop2)
flat2 = flatten()(pool2)
# channel 3
inputs3 = Input(shape=(length,))
embedding3 = Embedding(vocab_size,100)(inputs3)
conv3 = Conv1D(filters=32,kernel_size=8,activation='relu')(embedding3)
drop3 = Dropout(0.5)(conv3)
pool3 = MaxPooling1D(pool_size=2)(drop3)
flat3 = flatten()(pool3)
# merge
merged = concatenate([flat1,flat2,flat3])
# interpretation
dense1 = Dense(10,activation='relu')(merged)
outputs = Dense(1,activation='sigmoid')(dense1)
model = Model(inputs=[inputs1,inputs2,inputs3],outputs=outputs)
# compile
model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])
# summarize
print(model.summary())
plot_model(model,show_shapes=True,to_file='multichannel.png')
return model
# load training dataset
trainLines,trainlabels = load_dataset('train.pkl')
# create tokenizer
tokenizer = create_tokenizer(trainLines)
# calculate max document length
length = max_length(trainLines)
# calculate vocabulary size
vocab_size = len(tokenizer.word_index) + 1
print('Max document length: %d' % length)
print('Vocabulary size: %d' % vocab_size)
# encode data
trainX = encode_text(tokenizer,trainLines,length)
print(trainX.shape)
# define model
model = define_model(length,vocab_size)
# fit model
model.fit([trainX,trainX,trainX],array(trainlabels),epochs=10,batch_size=16)
# save the model
model.save('model.h5')
运行代码:
首先运行示例,然后打印准备好的训练数据集的摘要。 最大文档长度:1380 词汇量:44277 (1800,1380)
____________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
====================================================================================================
input_1 (InputLayer) (None,1380) 0
____________________________________________________________________________________________________
input_2 (InputLayer) (None,1380) 0
____________________________________________________________________________________________________
input_3 (InputLayer) (None,1380) 0
____________________________________________________________________________________________________
embedding_1 (Embedding) (None,1380,100) 4427700 input_1[0][0]
____________________________________________________________________________________________________
embedding_2 (Embedding) (None,100) 4427700 input_2[0][0]
____________________________________________________________________________________________________
embedding_3 (Embedding) (None,100) 4427700 input_3[0][0]
____________________________________________________________________________________________________
conv1d_1 (Conv1D) (None,1377,32) 12832 embedding_1[0][0]
____________________________________________________________________________________________________
conv1d_2 (Conv1D) (None,1375,32) 19232 embedding_2[0][0]
____________________________________________________________________________________________________
conv1d_3 (Conv1D) (None,1373,32) 25632 embedding_3[0][0]
____________________________________________________________________________________________________
dropout_1 (Dropout) (None,32) 0 conv1d_1[0][0]
____________________________________________________________________________________________________
dropout_2 (Dropout) (None,32) 0 conv1d_2[0][0]
____________________________________________________________________________________________________
dropout_3 (Dropout) (None,32) 0 conv1d_3[0][0]
____________________________________________________________________________________________________
max_pooling1d_1 (MaxPooling1D) (None,688,32) 0 dropout_1[0][0]
____________________________________________________________________________________________________
max_pooling1d_2 (MaxPooling1D) (None,687,32) 0 dropout_2[0][0]
____________________________________________________________________________________________________
max_pooling1d_3 (MaxPooling1D) (None,686,32) 0 dropout_3[0][0]
____________________________________________________________________________________________________
flatten_1 (flatten) (None,22016) 0 max_pooling1d_1[0][0]
____________________________________________________________________________________________________
flatten_2 (flatten) (None,21984) 0 max_pooling1d_2[0][0]
____________________________________________________________________________________________________
flatten_3 (flatten) (None,21952) 0 max_pooling1d_3[0][0]
____________________________________________________________________________________________________
concatenate_1 (concatenate) (None,65952) 0 flatten_1[0][0]
flatten_2[0][0]
flatten_3[0][0]
____________________________________________________________________________________________________
dense_1 (Dense) (None,10) 659530 concatenate_1[0][0]
____________________________________________________________________________________________________
dense_2 (Dense) (None,1) 11 dense_1[0][0]
====================================================================================================
Total params: 14,000,337
Trainable params: 14,337
Non-trainable params: 0
____________________________________________________________________________________________________
和
Epoch 6/10
1800/1800 [==============================] - 30s - loss: 9.9093e-04 - acc: 1.0000
Epoch 7/10
1800/1800 [==============================] - 29s - loss: 5.1899e-04 - acc: 1.0000
Epoch 8/10
1800/1800 [==============================] - 28s - loss: 3.7958e-04 - acc: 1.0000
Epoch 9/10
1800/1800 [==============================] - 29s - loss: 3.0534e-04 - acc: 1.0000
Epoch 10/10
1800/1800 [==============================] - 29s - loss: 2.6234e-04 - acc: 1.0000
我对图层和输出形状的解释如下: 请帮助我了解它是否正确,因为我在多维中迷失了。
input_1(InputLayer)(无,1380):---> 1380
是每个数据点的特征总数(即1380个输入神经元)。 1800
是文档或数据点的总数。
embedding_1(嵌入)(无,1380,100)4427700 ---->嵌入层是:1380个特征(单词),每个特征都是一个尺寸为100的向量。
这里的参数数量为4427700
?
conv1d_1(Conv1D)(无,1377,32)12832 ------> Conv1d的名称为kernel size=4
。是1*4
次使用的32
过滤器。那么维度如何通过(None,32)
参数变成12832
?
max_pooling1d_1(MaxPooling1D)(无,688,32)与MaxPooling1D(pool_size = 2)的尺寸如何变为(None,32)
?
flatten_1(平坦)(无,2016年2月),这仅仅是688、32的乘积吗?
**每个纪元都一次训练1800个数据点吗?**
请让我知道如何计算输出尺寸。任何参考或帮助,将不胜感激。