过去,我已经成功地编写了一些神经网络。我已经编写了一个具有完全连接的层(任何大小和数量)的多层感知器,并使用了反向传播技术对其进行了训练。我做了一个卷积网络,并通过手写/计算数学发现了它的梯度。我现在想变得更笼统。我想本着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中,这很容易,因为子级是潜在异构类型的列表,每种类型都有自己的forward_propagate行为。在C++中,我该怎么办?
我觉得答案是继承,但是如果它们都是某个基类,那么它将调用基类向前传播,而不是子级。
我正在努力避免冗余。节点知道做什么操作将其输入变成输出。但是,只要形状相同,它们就可以采用不同类型的输入。 IE中,ElementwiseVectorDoubler节点可以作为输入,并具有处理 vector 的任何类型的节点作为输出。可以从矩阵乘法等获得输入...但是我不想为每种特定类型的1d vector 输入我们的输出设置单独的ElementwiseVectorDoubler类。
最佳答案
回答。谢谢UnholySheep。我只需要虚函数。 http://www.cplusplus.com/doc/tutorial/polymorphism/
关于python - 图上的C++反向传播异构载体?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40618385/