【发布时间】:2019-12-09 07:49:32
【问题描述】:
我想知道对象名称后面的括号。
我正在学习 AI 并构建 AI 模型,现在在教程的代码中,作者写了一行,其中包含对象名称后面的括号:self.model(...)
其中 self.model 是 Network 类的对象。 对象如何将括号作为对象而不是函数? 现在我想知道对象名称后面的括号。
class Network(nn.Module):
def __init__(self, input_size, nb_action):
super(Network, self).__init__()
self.input_size = input_size
self.nb_action = nb_action
self.fc1 = nn.Linear(input_size, 30)
self.fc2 = nn.Linear(30, nb_action)
def forward(self, state):
x = F.relu(self.fc1(state))
q_values = self.fc2(x)
return q_values
class Dqn():
def __init__(self, input_size, nb_action, gamma):
self.gamma = gamma
self.reward_window = []
self.model = Network(input_size, nb_action)
self.memory = ReplayMemory(100000)
self.optimizer = optim.Adam(self.model.parameters(), lr = 0.001)
self.last_state = torch.Tensor(input_size).unsqueeze(0)
self.last_action = 0
self.last_reward = 0
def select_action(self, state):
probs = F.softmax(self.model(Variable(state, volatile = True))*100) # <-- The problem is here where the self.model object is CALLED with Parenthesis.
action = probs.multinomial(10)
return action.data[0,0]
【问题讨论】:
-
括号中调用的是
Network的构造函数(__init__)。 -
类定义
class Dqn()中类名后面的括号允许包含“父”对象,其方法将由子对象继承。正如@iz_ 所暗示的,当您实例化对象时(例如dq = Dqn(x,y,z)),括号用于将参数(除了隐含的self)传递给类的__init__方法。 -
@iz_ 不,从技术上讲,它正在调用
type.__call__(Network, input_size, nb_action),它调用Network.__new__(Network, input_size, nb_action),如果Network.__new__确实返回了Network的实例,then 调用Network.__init__在那个实例上。 -
但是,在代码中,一个 Object self.model 已经用 Network 类初始化了: self.model = Network(size,action) ,但是在调用 init之后> 关于初始化,我们如何将括号放在对象本身之后?喜欢:self.model() ....?请简化...我不是那么好...@Deepstop
标签: python artificial-intelligence pytorch