使用 Python 进行深度学习 (Keras):路透社多类分类

问题描述 投票:0回答:1

我正在阅读这本精彩的书,重写 PyTorch 中的示例,以便我更好地保留这些材料。对于大多数示例,我的结果与本书的 Keras 代码相当,但我在这个练习中遇到了一些问题。对于那些有这本书的人,这是第 106 页。

书中用于文本分类的网络如下:

书籍代码(Keras)

keras_model = keras.Sequential([
    layers.Dense(64,activation='relu'),
    layers.Dense(64,activation='relu'),
    layers.Dense(46,activation='softmax'),
])

keras_model.compile(
    optimizer = 'rmsprop',
    loss = 'sparse_categorical_crossentropy',
    metrics = ['accuracy']
)

hist = keras_model.fit(
    partial_train_xs,
    partial_train_ys,
    epochs=20,
    batch_size=512,
    validation_data=[val_xs,val_ys]
)

我尝试在 PyTorch 中重新创建相同的内容:

model = nn.Sequential(
          nn.Linear(10_000,64),
          nn.ReLU(),
          nn.Linear(64,64),
          nn.ReLU(),
          nn.Linear(64,46),
          nn.Softmax()
        )

def compute_val_loss(model,xs,ys):
    preds = model(xs)
    return(F.cross_entropy(preds,ys)).item()

def compute_accuracy(model,xs,ys):
    preds = model(xs)
    acc = (preds.argmax(dim=1) == ys).sum() / len(preds)
    return acc.item()

def train_loop(model,xs,ys,epochs=20,lr=1e-3,opt=torch.optim.RMSprop,
               batch_size=512,loss_func=F.cross_entropy):
    opt = opt(model.parameters(),lr=lr)
    losses = []
    for i in range(epochs):
        epoch_loss = []
        for b in range(0,len(xs),batch_size):
            xbatch = xs[b:b+batch_size]
            ybatch = ys[b:b+batch_size]            
            logits = model(xbatch)
            loss = loss_func(logits,ybatch)
            model.zero_grad()
            loss.backward()
            opt.step()
            epoch_loss.append(loss.item())
        losses.append([i,sum(epoch_loss)/len(epoch_loss)])
        print(loss.item())
    return losses

为了简洁起见,我排除了数据加载部分,但这只是对单词序列进行“多热”编码。例如,如果词汇表有 10k 个单词,则每个输入都是一个 10k 向量,其中向量中的每个索引都有一个“1”,对应于词汇表中的单词索引。

我的问题:

我在这里遇到的问题是,本书的 Keras 版本(其行为符合预期)和 PyTorch 版本之间的结果存在很大差异。经过 20 个 epoch 后,Keras 版本的训练损失可以忽略不计,并且验证准确率约为 80%。然而,Torch 版本在训练损失方面几乎没有任何进展。对于上下文来说,它从大约 3.4 开始,在 20 个 epoch 后于 3.1 结束。 Keras 版本的训练损失低于单个 epoch 后的训练损失 (2.6)。

torch 版本确实在准确性方面取得了进步,但仍然落后于 Keras 版本。准确性还有一个奇怪的阶梯模式:

我在 Torch 版本中做错了什么?或者预期的差异是否有合理的理由?这两个库的 RMSProp args 中存在细微的超参数差异,但我摆弄了这些差异,并没有发现太大的差异。两者的学习率是相等的。即使我运行 torch 版本 150 个 epoch,训练/测试损失仍然会继续下降(非常缓慢),但验证准确度峰值可达 75% 左右。

python keras deep-learning pytorch
1个回答
0
投票

您可以定义从

nn.Module
继承的模型,如下所示:

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        model = []
        model += [nn.Linear(10_000,64)]
        model += [nn.ReLU()]
        model += [nn.Linear(64, 64)]
        model += [nn.ReLU()]
        model += [nn.Linear(64, 46)]
        model += [nn.Softmax()]
        self.model = nn.Sequential(*model)
    
    def forward(self, x):
        return self.model(x)

然后使用

model = MyModel()

希望对你有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.