Несоответствие размеров CNN LibTorch / PyTorch

У меня есть структура CNN в LibTorch, но размеры не подходят. Моя цель - ввести 3-канальное изображение 64x64 и вывести плавающее значение логистической регрессии для DGAN. Последний слой я установил в качестве входных каналов 36, потому что, если я удалю этот слой, выходной нейрон будет иметь размер 6x6, поэтому я предполагаю, что это было необходимое измерение для входа полностью подключенного. Я бы хотел знать:

  • Что вы обычно делаете для проверки размеров в LibTorch или Pytorch (т.е. проверяете требуемый размер для последнего модуля, проверяете, сколько обучаемых параметров имеет каждый слой ...)
  • В чем ошибка в этом случае
   #include <torch/torch.h>
   #include "parameters.h"
   using namespace torch;

    class DCGANDiscriminatorImpl: public nn::Module {

    private:
        nn::Conv2d conv1, conv2, conv3, conv4;
        nn::BatchNorm2d batch_norm1, batch_norm2;
        nn::Linear fc1;

    public:
        DCGANDiscriminatorImpl()
            :conv1(nn::Conv2dOptions(3, 64, 4).stride(2).padding(1).bias(false)),

             conv2(nn::Conv2dOptions(64, 128, 4).stride(2).padding(1).bias(false)),

             batch_norm1(128),

             conv3(nn::Conv2dOptions(128, 256, 4).stride(2).padding(1).bias(false)),

             batch_norm2(256),

             conv4(nn::Conv2dOptions(256, 1, 3).stride(1).padding(0).bias(false)),

             fc1(6*6, 1)

        {
            register_module("conv1", conv1);
            register_module("conv2", conv2);
            register_module("conv3", conv3);
            register_module("conv4", conv4);
            register_module("batch_norm1", batch_norm1);
            register_module("batch_norm2", batch_norm2);
            register_module("fc1", fc1);

        }

        Tensor forward(torch::Tensor x)
        {
            x = leaky_relu(conv1(x), cte::NEGATIVE_SLOPE);
            x = leaky_relu(batch_norm1(conv2(x)), cte::NEGATIVE_SLOPE);
            x = leaky_relu(batch_norm2(conv3(x)), cte::NEGATIVE_SLOPE);
            x = sigmoid(fc1(x));
            return x;
        }

    };

    TORCH_MODULE(DCGANDiscriminator);

Я получаю следующую ошибку:

libc++abi.dylib: terminating with uncaught exception of type std::runtime_error: size mismatch, m1: [131072 x 8], m2: [36 x 1] at ../aten/src/TH/generic/THTensorMath.cpp:136

person Hector Esteban    schedule 24.03.2020    source источник
comment
В вашем коде не используется conv4, следовательно, у вас [batch x 256 x height x width] измерения. Примените conv4 в forward и проверьте, сохраняется ли ошибка (вам также может потребоваться применить операцию _5 _ / _ 6_ к torch::Tensor после conv4).   -  person Szymon Maszke    schedule 24.03.2020
comment
спасибо @SzymonMaszke, у меня все еще была проблема с размерами, но я ее решил.   -  person Hector Esteban    schedule 24.03.2020
comment
Замечательно, отметьте свой ответ как решающий вашу проблему, спасибо.   -  person Szymon Maszke    schedule 24.03.2020


Ответы (1)


У меня было несколько проблем, но в конце концов эта архитектура сработала.

using namespace torch;

class DCGANDiscriminatorImpl: public nn::Module {

private:
    nn::Conv2d conv1, conv2, conv3, conv4;
    nn::BatchNorm2d batch_norm1, batch_norm2;
    nn::Linear fc1;

public:
    DCGANDiscriminatorImpl()
        :conv1(nn::Conv2dOptions(3, 64, 4).stride(2).padding(1).bias(false)),

         conv2(nn::Conv2dOptions(64, 128, 4).stride(2).padding(1).bias(false)),

         batch_norm1(128),

         conv3(nn::Conv2dOptions(128, 256, 4).stride(2).padding(1).bias(false)),

         batch_norm2(256),

         conv4(nn::Conv2dOptions(256, 64, 3).stride(1).padding(0).bias(false)),

         fc1(6*6*64, 1)

    {
        register_module("conv1", conv1);
        register_module("conv2", conv2);
        register_module("conv3", conv3);
        register_module("conv4", conv4);
        register_module("batch_norm1", batch_norm1);
        register_module("batch_norm2", batch_norm2);
        register_module("fc1", fc1);

    }

    Tensor forward(torch::Tensor x)
    {
        x = leaky_relu(conv1(x), cte::NEGATIVE_SLOPE);
        x = leaky_relu(batch_norm1(conv2(x)), cte::NEGATIVE_SLOPE);
        x = leaky_relu(batch_norm2(conv3(x)), cte::NEGATIVE_SLOPE);
        x = leaky_relu(conv4(x), cte::NEGATIVE_SLOPE);
        x = x.view({x.size(0), -1});
        x = sigmoid(fc1(x));
        return x;
    }

};

TORCH_MODULE(DCGANDiscriminator);
person Hector Esteban    schedule 24.03.2020