pytorch tensor切片操作影响模型的梯度下降

先说torch版本:

torch                     1.10.0                   pypi_0    pypi
torchaudio                0.10.0               py39_cu113    pytorch
torchmetrics              0.6.2                    pypi_0    pypi
torchvision               0.11.1               py39_cu113    pytorch

首先使用active_collection函数预处理数据,然后得到x_train_data, x_test_data, y_train_data, y_test_data用于训练和测试设计的分类器。
后面两行做了一个切片操作,就是y_train_data和y_test_data里面有多个label列,每次实验的时候我只选其中的一列。

with torch.no_grad():
	state_generator = RandomStateGenerator(self.task_name, self.state_logit_action_shape,  self.sequence_length, self.device) 
	x_train_data, x_test_data, y_train_data, y_test_data = self.agent_state_action_collector.active_collection(self.task_name, self.action_is_discrete, self.agent_dataset, self.sequence_length, self.multi_thread, state_generator)
y_train_data = y_train_data[:, self.target_attribute_index]
y_test_data = y_test_data[:, self.target_attribute_index]     

这样处理之后,分类模型loss不下降并且分类错误(pred=0,但是y=1)。
后来把后两行移动到with torch.no_grad():内部,模型就正常了。

with torch.no_grad():
	state_generator = RandomStateGenerator(self.task_name, self.state_logit_action_shape,  self.sequence_length, self.device) 
	x_train_data, x_test_data, y_train_data, y_test_data = self.agent_state_action_collector.active_collection(self.task_name, self.action_is_discrete, self.agent_dataset, self.sequence_length, self.multi_thread, state_generator)
	y_train_data = y_train_data[:, self.target_attribute_index]
	y_test_data = y_test_data[:, self.target_attribute_index]     

但是觉得前后没有什么不同,但是为什么第一种情况下模型不能正常收敛呢?

你可能感兴趣的:(pytorch,机器学习,python)