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

这显然会导致以下错误:

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

奇怪的是,即使是我的训练损失也没有达到0。我会想,如果我的网络过于适合,它只会完美地学习我的数据集,但这不会发生,无论我建立我的模型有多复杂。我唯一能想到的就是我的特征表示完全是荒谬的,或者我的训练功能中出现了一个错误,一些奇怪的事情正在发生。
我尝试过混淆丢失函数,在网络结束时尝试了不同的激活函数,比如Tanh、sigmoid、ReLU,而根本没有激活函数。目前,我已经尽可能地简化了我的训练数据,并且正在处理一个8通道1s长的Chirp信号,在这里可以找到(至少是暂时的):https://file.re/2021/06/20/chirp/。
如前所述,我尝试了各种大小的标准ResNet和各种不同的特性表示,最近的一次是采用所有8个通道的复杂STFT,垂直叠加震级并将角度信息添加到X轴,如下所示:

如果有人有任何想法的话,我很乐意尝试。目前,我正在使用带有垂直卷积和没有池操作的CNN来保存时间信息。
我的主要训练方法如下:
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)这很可能是我刚刚错过了一些东西,但主要的想法是,我认为相当简单。我抽象了很多东西,因为我用不同的数据集测试了许多不同的模型,并且希望在分类和回归之间很容易地切换。
发布于 2021-06-20 07:34:46
我无法访问文件。如果你不能分享,你能分享一个小样本吗?
一些想法:
1-你是否试图使你的数据正常化?有些数据的异常值需要标准化,才能得到正确的训练。
2-训练中也可能有问题,可能是过度适应。你是否申请了一个辍学来增加泛化。
3-如果你使用的任何模型都有相同的错误,那么在你的学习过程中可能会有一些错误:可能是你没有应用于预测数据的初始数据转换。
https://datascience.stackexchange.com/questions/96868
复制相似问题