C ++在图上的反向传播;异构向量?

时间:2016-11-15 19:43:57

标签: python c++ vector neural-network

我过去曾成功写过一些神经网络。我写了一个多层感知器,它有完全连接的层(任何大小和数量),并用backprop进行训练。我已经完成了卷积网,并通过手写/计算数学找到了它的渐变。我现在想要更加一般。我想在Theano的精神中为任何计算图写反向传播。

考虑这个Python代码:

from __future__ import division
from pylab import *
class Node(object):
    def __init__(self):
        self.children = []
        self.parents = []
        self.state = []
    def forward_prop(self):
        for child in self.children:
            child.forward_prop()


class Static(Node):
    def __init__(self, *shape):
        super(Static, self).__init__()
        state = zeros(shape)

class MatrixProduct(Node):
    def __init__(self, w, x):
        super(MatrixProduct, self).__init__()
        self.w = w
        self.x = x
        self.state = [0]*len(x.state)

    def forward_prop(self):
        self.state = self.w.state.dot(self.x.state)
        for child in self.children:
            child.forward_prop()

class Doubler(Node):
    def __init__(self):
        super(Doubler, self).__init__()
    def forward_prop(self):
        self.state = [s*2 for s in self.state]
        for child in self.children:
             child.forward_prop()


a = Static()
a.state = array([2,3])
w = Static()
w.state = array([[1,2],[3,4]])
x = MatrixProduct(w, a)
a.children.append(x)
d = Doubler()
d.state.append(3)
x.children.append(d)
a.forward_prop()
print a.state
print d.state

我主要看到如何将它移植到C ++。我的问题是我无法想象如何让孩子的前向传播在C ++中工作。在Python中,它很容易,因为children是一个潜在异构类型的列表,每个类型都有自己的forward_propagate行为。在C ++中,我该怎么办?

我觉得答案是继承,但如果它们都是一些基类,那么它会调用基类前向传播,而不是子类。

我正在努力避免冗余。节点知道要做什么操作将输入转换为输出。但是,只要它们具有相同的形状,它们就可以采用不同类型的输入。 IE,一个ElementwiseVectorDoubler节点可以作为输入,并具有处理向量的任何类型的节点作为输出。可以从矩阵乘法等获得输入......但是我不希望为每个特定类型的1d向量输入我们的输出都有单独的ElementwiseVectorDoubler类。

1 个答案:

答案 0 :(得分:1)

回答。谢谢UnholySheep。我只需要虚拟功能。 http://www.cplusplus.com/doc/tutorial/polymorphism/