Ошибка типа: неподдерживаемые типы операндов для +: 'Tensor' и 'dict' - PullRequest
0 голосов
/ 08 марта 2020

Я новичок в мире нейронных сетей и пытаюсь реализовать генератор CNN из этой модели и эти уравнения (N = 32) для генерации движения , Я написал следующий код, где H_txt - это словарь, содержащий в качестве ключей название моих клипов и значения, вектор, представляющий действие, показанное в клипе, а z - белый гауссов шум с размерностью (1, 256).

N=32  

class CNNGenerator(nn.Module):

    def __init__(self, htxt = H_txt):                                       
        super(CNNGenerator, self).__init__()

        self.htxt = htxt
        self.conv1 = nn.Conv1d(1, 1, 3)
        self.conv2 = nn.Conv1d(1, 1, 3)            
        self.conv3 = nn.Conv1d(1, 1, 3)            
        self.conv4 = nn.Conv1d(4, 4, 3)            
        self.conv5 = nn.Conv1d(2, 2, 3)
        self.conv6 = nn.Conv1d(8, 8, 3)
        self.conv7 = nn.Conv1d(4, 4, 3)
        self.conv8 = nn.Conv1d(16, 16, 3)        
        self.conv9 = nn.Conv1d(8, 8, 3)
        self.conv10 = nn.Conv1d(32, 32, 3)
        self.conv11 = nn.Conv1d(16, 16, 3)
        self.conv12 = nn.Conv1d(32, 32, 3)
        self.conv13 = nn.Conv1d(1, 1, 3)
        self.conv14 = nn.Conv1d(2, 2, 3)
        self.conv15 = nn.Conv1d(2, 2, 3)
        self.conv16 = nn.Conv1d(4, 4, 3)
        self.conv17 = nn.Conv1d(4, 4, 3)
        self.conv18 = nn.Conv1d(8, 8, 3)
        self.conv19 = nn.Conv1d(8, 8, 3)
        self.conv20 = nn.Conv1d(16, 16, 3)
        self.conv21 = nn.Conv1d(16, 16, 3)
        self.conv22 = nn.Conv1d(32, 32, 3)
        self.conv23 = nn.Conv1d(32, 32, 3)





    def forward(self, x):                              
        x[0] = self.conv1(F.relu(self.conv2(z) + self.htxt))  

        x[1] = self.conv3(F.relu(self.conv4(z) + self.htxt))
        x[2] = self.conv5(F.relu(self.conv6(z) + self.htxt))
        x[3] = self.conv7(F.relu(self.conv8(z) + self.htxt))
        x[4] = self.conv9(F.relu(self.conv10(z) + self.htxt))
        x[5] = self.conv11(F.relu(self.conv12(z) + self.htxt))
        h = np.zeros(np.log2(N))               

        h[0] = x[0]                                  

        h[1] = nn.AdaptiveAvgPool1d(2*h[0]) + self.conv13(F.relu(nn.AdaptiveAvgPool1d(2*(self.conv14(h[0])+x[1]))))   
        h[2] = nn.AdaptiveAvgPool1d(2*h[1]) + self.conv15(F.relu(nn.AdaptiveAvgPool1d(2*(self.conv16(h[1])+x[2]))))   
        h[3] = nn.AdaptiveAvgPool1d(2*h[2]) + self.conv17(F.relu(nn.AdaptiveAvgPool1d(2*(self.conv18(h[2])+x[3]))))   
        h[4] = nn.AdaptiveAvgPool1d(2*h[3]) + self.conv19(F.relu(nn.AdaptiveAvgPool1d(2*(self.conv20(h[3])+x[4]))))   
        h[5] = nn.AdaptiveAvgPool1d(2*h[4]) + self.conv21(F.relu(nn.AdaptiveAvgPool1d(2*(self.conv22(h[4])+x[5]))))
        A = self.conv23(h[np.log2(N)])
        return A




    def num_flat_features(self, x):
        size = x.size()[1:]  # all dimensions except the batch dimension
        num_features = 1
        for s in size:
            num_features *= s
        return num_features


    net = CNNGenerator()
    z= torch.randn(1, 1, 256)       #k=256
    out = net(z)
    print(out)

Когда я запускаю свой код, я получаю следующее сообщение об ошибке из функции forward :

TypeError: unsupported operand type(s) for +: 'Tensor' and 'dict'

Мой код не любит Дело в том, что я пытаюсь суммировать тензор со словарем. Я не нашел никакого решения онлайн, поэтому мне было интересно, можно ли суммировать мой тензор со словарем? Есть ли функция, которая может преобразовать мой словарь в тензор? Я попытался преобразовать словарь в массив с помощью np.asarray (), но получил сообщение об ошибке, в котором говорится, что я не могу использовать для этого функцию numpy.

Большое спасибо за чтение моего сообщения

1 Ответ

0 голосов
/ 08 марта 2020

В вашем вопросе отсутствуют сведения о ваших переменных, но из-за ошибки я даю вам ответ. Вы добавляете словарь и тензор, который выдает ошибку. Если вы хотите добавить значения словаря в тензор затем вы должны преобразовать словарь в тензор. И также, почему вы добавляете словарь напрямую, потому что здесь нет необходимости в ключах. Если вы хотите объединить значения в словаре после преобразования его в тензор по желаемой оси, тогда вам нужно использовать функцию torch.cat. Чтобы добавить значения в словаре в тензор, получите значения из dict и преобразуйте в тензор примерно так:

torch.Tensor(list(htxt.values()))

...