Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x PyTorch中的softmax dims和可变挥发性_Python 3.x_Pytorch - Fatal编程技术网

Python 3.x PyTorch中的softmax dims和可变挥发性

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

我有一个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)
        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)?@Kosh
new_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)
事实上,我在解决这个问题时已经了解了很多东西)