def forward(self, value=None):
if value is not None:
self.value = value
1
2
3
4
5
6
7
8
9
10
成员变量value可以被明确地设置,也可以用 forward() 方法进行设置。该值然后会传递给神经网络的其他节点。
def topological_sort(feed_dict):
"""
用Kahn算法进行拓扑排序
(1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它;
(2)从网中删去该顶点,并且删去从该顶点发出的全部有向边;
(3)重复上述两步,直到剩余的网中不再存在没有前趋的顶点为止。
"""
input_nodes = [n for n in feed_dict.keys()]
G = {}
nodes = [n for n in input_nodes]
while len(nodes) > 0:
n = nodes.pop(0)
if n not in G:
G[n] = {'in': set(), 'out': set()}
for m in n.outbound_nodes:
if m not in G:
G[m] = {'in': set(), 'out': set()}
G[n]['out'].add(m)
G[m]['in'].add(n)
nodes.append(m)
L = []
S = set(input_nodes)
while len(S) > 0:
n = S.pop()
if isinstance(n, Input):
n.value = feed_dict[n]
L.append(n)
for m in n.outbound_nodes:
G[n]['out'].remove(m)
G[m]['in'].remove(n)
# if no other incoming edges add to S
if len(G[m]['in']) == 0:
S.add(m)
return L
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
opological_sort() 传入 feed_dict,我们按此方法为 Input 节点设置初始值。feed_dict 由 Python 字典数据结构表示。
1.3.2 forward_pass:按拓扑排序前向计算节点value
该方法按拓扑排序计算网络中每个节点的值,并返回输出节点的value值
def forward_pass(output_node, sorted_nodes):
for n in sorted_nodes:
n.forward()
output_node.forward()
return output_node.value
1
2
3
4
5
1.3.3 简单前向计算实现算例