Beispiel #1
0
    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
Beispiel #2
0
    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