首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模型拟合时抑制数值或平滑结果

模型拟合时抑制数值或平滑结果
EN

Data Science用户
提问于 2021-06-20 06:48:53
回答 1查看 38关注 0票数 2

我正在训练一个网络来做到达方向的预测,我的问题是无论我的网络是什么(ResNet 18-101,CRNN,CNN等等)我的结果倾向于一个小范围的值,如下图所示。

这显然会导致以下错误:

我一直试图“等待它”,直到我的网络最终了解,但我的验证损失几乎立即发散。下面可以看到一个例子。

奇怪的是,即使是我的训练损失也没有达到0。我会想,如果我的网络过于适合,它只会完美地学习我的数据集,但这不会发生,无论我建立我的模型有多复杂。我唯一能想到的就是我的特征表示完全是荒谬的,或者我的训练功能中出现了一个错误,一些奇怪的事情正在发生。

我尝试过混淆丢失函数,在网络结束时尝试了不同的激活函数,比如Tanh、sigmoid、ReLU,而根本没有激活函数。目前,我已经尽可能地简化了我的训练数据,并且正在处理一个8通道1s长的Chirp信号,在这里可以找到(至少是暂时的):https://file.re/2021/06/20/chirp/

如前所述,我尝试了各种大小的标准ResNet和各种不同的特性表示,最近的一次是采用所有8个通道的复杂STFT,垂直叠加震级并将角度信息添加到X轴,如下所示:

如果有人有任何想法的话,我很乐意尝试。目前,我正在使用带有垂直卷积和没有池操作的CNN来保存时间信息。

我的主要训练方法如下:

代码语言:javascript
复制
def train(self):
        steps, losses, metrics = TrainingUtilities.get_training_variables(self.parameters)
        patience_counter = 0
        best_epoch_data = None
        best_epoch_validation_loss = 999
        best_epoch = 0
        exit_training = False
        try:
            for epoch in range(steps, self.epoch_count):
                epoch_metrics = TrainingUtilities.initialize_metrics(self.mode)
                if exit_training:
                    break
                for idx, phase in enumerate(['train', 'val']):
                    if phase == 'train':
                        self.model.train()
                    else:
                        self.model.eval()
                    for _, data in tqdm(enumerate(self.data_loaders[idx])):

                        self.optimizer.zero_grad()
                        inputs, labels = data

                        outputs = self.model(inputs.to(self.device))
                        # labels = azi_class.squeeze_().to(self.device)
                        loss = self.criterion(outputs.squeeze(), labels.to(self.device))

                        epoch_metrics = TrainingUtilities.get_epoch_metrics(
                            outputs, labels, loss, epoch_metrics, phase, self.mode)

                        if phase == 'train':
                            loss.backward()
                            self.optimizer.step()

                    TrainingUtilities.report_metrics(self.writer, epoch_metrics, epoch, phase, self.parameters, self.mode)
                    if phase == "val":
                        TrainingUtilities.step_scheduler(
                            self.scheduler, np.mean(epoch_metrics[0][phase]), self.parameters)
                  
                losses.append(epoch_metrics[0])
                metrics.append(epoch_metrics)
                if epoch % self.epoch_save_count == 0:
                    TrainingUtilities.save_checkpoint(self.model, losses, metrics, self.training_dir, epoch, self.mode, self.model_name, self.size)

                steps += 1

        except (KeyboardInterrupt, RuntimeError) as error:
            print(f"Error: {error}")
            TrainingUtilities.save_checkpoint(self.model, losses, metrics, self.training_dir, steps, self.mode, self.model_name, self.size)

这很可能是我刚刚错过了一些东西,但主要的想法是,我认为相当简单。我抽象了很多东西,因为我用不同的数据集测试了许多不同的模型,并且希望在分类和回归之间很容易地切换。

EN

回答 1

Data Science用户

发布于 2021-06-20 07:34:46

我无法访问文件。如果你不能分享,你能分享一个小样本吗?

一些想法:

1-你是否试图使你的数据正常化?有些数据的异常值需要标准化,才能得到正确的训练。

2-训练中也可能有问题,可能是过度适应。你是否申请了一个辍学来增加泛化。

3-如果你使用的任何模型都有相同的错误,那么在你的学习过程中可能会有一些错误:可能是你没有应用于预测数据的初始数据转换。

票数 0
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/96868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档