Python 3.x PyTorch中的softmax dims和可变挥发性
我有一个PyTorch以前版本的代码,我收到了第三行的2条警告:Python 3.x PyTorch中的softmax dims和可变挥发性,python-3.x,pytorch,Python 3.x,Pytorch,我有一个PyTorch以前版本的代码,我收到了第三行的2条警告: import torch.nn.functional as F def select_action(self, state): probabilities = F.softmax(self.model(Variable(state, volatile = True))*100) # T=100 action = probs.multinomial(num_samples=1) re
import torch.nn.functional as F
def select_action(self, state):
probabilities = F.softmax(self.model(Variable(state, volatile = True))*100) # T=100
action = probs.multinomial(num_samples=1)
return action.data[0,0]
UserWarning:volatile已被删除,现在无效。将与
torch.no_grad():
UserWarning:softmax的隐式维度选择已被弃用。将调用更改为包含dim=X>作为参数
我发现:
如果您确定,建议将Volatile用于纯推理模式
您甚至不会调用.backward()。它比任何一种都有效
其他自动标签设置-它将使用绝对最小数量的
内存来评估模型。volatile还决定了
要求你的梯度为假
我应该把它拿走,对吗?
因为我想得到概率,所以我应该使用dim=1吗?
我的代码的第三行应该是这样的:
状态在此处创建:
def update(self, reward, new_signal):
new_state = torch.Tensor(new_signal).float().unsqueeze(0)
self.memory.push((self.last_state, new_state, torch.LongTensor([int(self.last_action)]), torch.Tensor([self.last_reward])))
action = self.select_action(new_state)
if len(self.memory.memory) > 100:
batch_state, batch_next_state, batch_action, batch_reward = self.memory.sample(100)
self.learn(batch_state, batch_next_state, batch_reward, batch_action)
self.last_action = action
self.last_state = new_state
self.last_reward = reward
self.reward_window.append(reward)
if len(self.reward_window) > 1000:
del self.reward_window[0]
return action
你是对的,但不是完全正确
除您提到的更改外,您应该使用火炬。无梯度()如下所述:
def select_action(self, state):
with torch.no_grad():
probabilities = F.softmax(self.model(state), dim=1)*100
action = probs.multinomial(num_samples=1)
return action.data[0,0]
此块关闭其中代码的自动加载引擎(因此您保存内存的方式类似于volatile
)
另外,请注意,变量
也被弃用(请检查),状态
应为torch。使用创建的张量
需要_grad=True
顺便说一句,你有
probs
和probability
,但我认为这是同一件事,只是一个打字错误。我找到了用Python2.7
-“自动驾驶汽车”应用程序编写的相同源代码。我无法为Python2.7安装pytorch
/pytorch cpu
(CUDA驱动程序问题…),因此我必须修复代码以在Python3.*
中运行
以下是我为使其正常工作所做的更改(包括上面其他人建议的更改):
更新选择
和学习Dqn
类的功能,如下所示:
def select_action(self, state):
with torch.no_grad():
probabilities = F.softmax(self.model(state), dim=1)*100
action = probs.multinomial(num_samples=1)
return action.data[0,0]
def选择动作(自身、状态):
使用手电筒。无梯度()
probs=F.softmax(自模型(状态)*100,尺寸=1)#T=100
动作=问题多项式(num_samples=1)
返回操作。数据[0,0]
def学习(自我、批次状态、批次下一个状态、批次奖励、批次行动):
输出=self.model(批处理状态)。聚集(1,批处理操作。取消查询(1))。挤压(1)
下一个输出=self.model(批处理下一个状态).detach().max(1)[0]
目标=self.gamma*下一次输出+批量奖励
td_损耗=F.平滑_l1_损耗(输出、目标)
self.optimizer.zero_grad()
td_损失向后()
self.optimizer.step()
我编辑了最初的帖子,并在其中包含了一段创建状态的代码。你的意思是我应该把它改成:new_state=torch.Tensor(new_signal,requires_grad=True)和remove.float().unsqueze(0)?@Koshnew_state=torch.Tensor(new_signal,requires_grad=True)。float().unsqueze(0)
。您不应该删除它,因为它只是将张量转换为特定类型并添加额外的第一维度(可能是批处理)。添加requires_grad=True后,我开始接收类型错误:new()接收到无效的参数组合-get(list,requires_grad=bool),但应为:*(,torch.device)不匹配,因为某些关键字不正确:requires_grad*(torch.Storage)*(Tensor other)*(整数大小的元组,*,torch.device)*(对象数据,*,torch.device)@Kosh版本的pytorch?然后试着用手电筒。张量作为快速修复工具,最终得到了它。我的问题根源在于表面。你写的是probabilities=F.softmax(self.model(state),dim=1)*100
而它应该是probabilities=F.softmax(self.model(state)*100,dim=1)
事实上,我在解决这个问题时已经了解了很多东西)