Python Pytorch和Keras实现在文本分类中的性能差异很大
我已经在Keras和Pytorch中实现了CNN,用于多标签文本分类任务。两个实现以两种截然不同的性能结束。有Keras的CNN明显优于有Pytorch的CNN。两者都使用内核大小为4的单层CNN Pytorch版本的微观F1得分0.023,宏观F1得分0.47。模型如下图所示(更多详细信息见colab笔记本): 对于微观F1,Keras版本得分0.70;对于宏观F1,Keras版本得分0.56。模型如下图所示(更多详细信息见colab笔记本): 我认为我的Pytorch实现有问题。如有任何评论,我们将不胜感激。我已经为Pytork和Keras的完整实现创建了。请随意复制并运行它。请告诉我我在这件事上做错了什么。谢谢Python Pytorch和Keras实现在文本分类中的性能差异很大,python,tensorflow,keras,pytorch,torchtext,Python,Tensorflow,Keras,Pytorch,Torchtext,我已经在Keras和Pytorch中实现了CNN,用于多标签文本分类任务。两个实现以两种截然不同的性能结束。有Keras的CNN明显优于有Pytorch的CNN。两者都使用内核大小为4的单层CNN Pytorch版本的微观F1得分0.023,宏观F1得分0.47。模型如下图所示(更多详细信息见colab笔记本): 对于微观F1,Keras版本得分0.70;对于宏观F1,Keras版本得分0.56。模型如下图所示(更多详细信息见colab笔记本): 我认为我的Pytorch实现有问题。如有任何评论
class CNN_simple(nn.Module):
def __init__(self, vocab_size, embedding_dim, n_filters, filter_sizes, output_dim,
dropout, pad_idx):
super().__init__()
self.embedding = nn.Embedding(vocab_size, embedding_dim, padding_idx = pad_idx)
self.conv = nn.Conv1d(in_channels = embedding_dim,
out_channels = n_filters,
kernel_size = 4) # (N,C,L)
self.fc = nn.Linear(n_filters, output_dim)
self.dropout = nn.Dropout(dropout)
def forward(self, text):
embedded = self.embedding(text)
embedded = embedded.permute(0, 2, 1)
conved = F.relu(self.conv(embedded))
pooled = F.max_pool1d(conved, conved.shape[2]).squeeze(2)
dropout = self.dropout(pooled)
return self.fc(dropout)
def get_model_cnn():
inp = Input(shape=(MAX_TEXT_LENGTH, ))
x = Embedding(MAX_VOCAB_SIZE, embed_size)(inp)
x = Conv1D(embed_size, 4, activation="relu")(x)
x = GlobalMaxPool1D()(x)
x = Dense(6, activation="sigmoid")(x)
model = Model(inputs=inp, outputs=x)
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
return model