2017-11-11 16 views
0

내가 겪고있는 문제와 관련된 코드는 다음과 같습니다. 아이겐 (Eigen)을 사용하여 신경망을 작성하려고합니다. 나는 신경 네트워크의 레이어를 구현하기 위해 Eigen의 텐서를 사용하고 싶지만 어떻게 확신 할 수는 없습니다. Eigen의 텐서는 제가 텐서의 차원 수에 대한 타입과 int라는 두 개의 템플릿 인자를 입력해야합니다. 사용하려는 유일한 유형은 double이지만, 각 Layer는 입력 Tensor를 가져 와서 출력 Dimension을 반환해야합니다. 따라서 Layer 클래스에 두 개의 숫자에 대한 템플릿이 있어야합니다. 그러나 이렇게하면 레이어의 표준 벡터를 가질 수 없습니다. 이 주위에 어떤 방법이 있습니까? 또한 말할 수 있듯이 Layer 클래스는 다른 클래스가 그 클래스로부터 상속 받기 때문에 추상 클래스입니다 (이것이 내가 std :: vector에 넣을 수 있기를 바랍니다). Boost의 변형 클래스를 살펴 봤지만 사용하기 전에 사용할 수있는 모든 가능한 유형의 레이어를 명시 적으로 추가 할 수 있다고 생각하지 않기 때문에 사용할 수 있는지 잘 모르겠습니다. 어떻게 든 템플릿을 사용하여 자동으로 그렇게 할 수 있다면 어떨까요?템플릿 클래스의 다른 유형의 벡터입니까?

#include <unsupported/Eigen/CXX11/Tensor> 

template<int inputDims, int outputDims> 
class Layer{ 
public: 
    virtual ~Layer(); 
    virtual Eigen::Tensor<double,outputDims> fire(Eigen::Tensor<double,inputDims>) = 0; 
    virtual Eigen::Tensor<double,outputDims> derivative(Eigen::Tensor<double,inputDims>) = 0; 
}; 

std::vector<Layer> v; //Doesn't compile 
+0

'표준 : : 벡터 > V,'예를 들어, 좋은하지? –

+0

그걸 컴파일하지만, 원하는 경우 레이어 <3,4>을 추가 할 수 없습니다. – BadProgrammer99

+0

'Layer <10,20> '은'Layer <3.4> '과 같은 유형이 아닙니다. 이것은 'Car' 클래스와'Chair' 클래스가 있고 같은 벡터에 넣고 싶을 때와 다르지 않습니다. 그래서이 문제는 여러 유형을 포함 할 수있는 하나의 컨테이너를 생각해내는 것까지로 이어집니다. 그래서 저는 중복 된 질문과 답변이 있다는 것을 확신합니다. – PaulMcKenzie

답변

0

이와 비슷한?

class BaseLayer 
{ 
public: 
    virtual ~BaseLayer() {}; 
}; 

template<int inputDims, int outputDims> 
class Layer : public BaseLayer 
{ 
public: 

    void fire() { std::cout << inputDims << ":" << outputDims << std::endl; } 
    void derivative() { std::cout << inputDims << ":" << outputDims << std::endl; } 
}; 


int main() 
{ 
    std::vector<BaseLayer *> v; 
    BaseLayer *l1 = new Layer<10, 20>; 
    v.push_back(l1); 

    Layer<10, 20> *l11 = dynamic_cast<Layer<10, 20> *>(l1); 
    if (l11) 
     l11->fire(); 

    BaseLayer *l2 = new Layer<3,4>; 
    v.push_back(l2); 

    Layer<3,4> *l22 = dynamic_cast<Layer<3,4> *>(l2); 
    if (l22) 
     l22->derivative(); 

    return 0; 
} 

인쇄 :

10:20 
3:4 
+0

그러나 BaseLayer 인스턴스에서 fire() 또는 derivative()를 호출 할 수 없습니다. – BadProgrammer99

+0

@ BadProgrammer99 예, BaseLayer를 동적으로 캐스트하여 적절한 레이어에 넣으면 호출 할 수 있습니다. 'Eigen :: Tensor'가 어떻게 생겼는지 모르기 때문에 예제를 조금 변경했는데 컴파일하지 않으면 컴파일되지 않습니다. 일반적인 방법을 사용하여 어떻게 작동하는지 보여줍니다. –

+1

이것을 더 확장하려면 생성자를 통해 baseLayer 클래스에 차원 정보를 전달하고 거기에 저장 한 다음 해당 정보를 사용하여 올바른 형 변환을 수행 할 수 있습니다. 그렇게하면 레이어를 추적 할 필요가 없습니다. – super