gpt4 book ai didi

python - 图上的 C++ 反向传播;异构载体?

转载 作者:行者123 更新时间:2023-11-30 05:20:32 26 4
gpt4 key购买 nike

我过去曾成功编写过几个神经网络。我已经编写了一个具有完全连接层(任意大小和数量)的多层感知器,并使用反向传播对其进行了训练。我已经完成了一个卷积网络,并通过手写/计算数学找到了它的梯度。我现在想变得更笼统。我想本着 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 节点可以将任何类型的处理 vector 的节点作为输入并作为输出。可以从矩阵乘法等中获取输入...但我不想为每种特定类型的 1d vector 输入我们的输出使用单独的 ElementwiseVectorDoubler 类。

最佳答案

已回答。谢谢不洁之羊。我只需要虚函数。 http://www.cplusplus.com/doc/tutorial/polymorphism/

关于python - 图上的 C++ 反向传播;异构载体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40618385/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com