def forward(self, img1, img2): #print("img1.shape", img1.shape) img1 = img1.view(img1.size(0), -1) #print("img1.shape", img1.shape) img2 = img2.view(img2.size(0), -1) out1 = self.policy_single(img1) #print("out1.shape", out1.shape) out2 = self.policy_single(img2) combined = torch.cat( (out1, out2), dim=1) # attaccate usando asse x (una sopra l'altra) probs = self.policy_combined(combined) # sampling dist = Categorical(probs=probs) if self.training: actions = dist.sample() else: actions = dist.argmax(dim=1) logprobs = dist.log_prob(actions) entropy = dist.entropy() return probs, actions, logprobs, entropy
def forward(self, img1, img2, mex): mex = torch.nn.functional.one_hot(mex, num_classes=self.vocab_len) img1 = img1.view(img1.size(0), -1) img2 = img2.view(img2.size(0), -1) out1 = self.policy_single_img(img1) out2 = self.policy_single_img(img2) symbol = mex.view(mex.size(0), -1).float() symbol = self.policy_single_mex(symbol) out1 = torch.bmm(symbol.view(symbol.size(0), 1, symbol.size(1)), out1.view(out1.size(0), symbol.size(1), 1)) # un numero per ogni immagine out2 = torch.bmm(symbol.view(symbol.size(0), 1, symbol.size(1)), out2.view(out2.size(0), symbol.size(1), 1)) out1 = out1.view(out1.size(0), -1) out2 = out2.view(out2.size(0), -1) combined = torch.cat((out1, out2), dim=1) probs = self.softmax(combined) dist = Categorical(probs=probs) if self.training: actions = dist.sample() else: actions = dist.argmax(dim=1) logprobs = dist.log_prob(actions) entropy = dist.entropy() return probs, actions, logprobs, entropy