【发布时间】:2018-04-13 06:20:53
【问题描述】:
假设我有一个神经网络。我可以在其中执行一些操作,如下所示:
def one_iteration(my_op, data, ...):
for i in range(...):
...
my_op(data)
...
想象一下,for 循环不仅仅只是一个 for 循环,它就是我迭代对象集合的方式。现在,如果将 my_op 传递为 training 函数,我就准备好了。但是,如果我想将evaluate 函数作为my_op 传递,现在我想保留我的中间结果以了解我的表现。所以我会这样做:
def one_iteration(my_op, data, ...):
results = []
for i in range(...):
...
result = my_op(data)
results.append(result)
return results
我会有一个包含结果的列表/数组,以便我评估该网络在该迭代中的表现。现在,假设我希望my_op 成为validate,为此,我需要更多的中间信息。我也许可以这样做:
def one_iteration(my_op, data, is_validation, ...):
results = []
if is_validation:
more_results = []
for i in range(...):
...
result, other_result = my_op(data)
results.append(result)
if is_validation:
more_results.append(other_result)
return results
但是,在这一点上,它开始变得杂乱无章。我知道我可以实现一个单独的 train、evaluate 和 validate 方法,并且在每个方法中,我可以做需要做的事情,但我看到的问题是每个方法都会重复它迭代对象的方式(在本例中为 for 循环),因此,如果我更改迭代方式,我必须在 3 个不同的地方更改它。这里有我遗漏的设计模式吗?
【问题讨论】:
-
看起来将功能分开会更干净。您提到您可能会更改迭代数据的方式。你在考虑嵌套循环吗?如果没有,那可以很容易地抽象出来。也许您可以进一步扩展您想要设计的潜在未来变化。虽然一般来说,现在做最少的必要工作并在您真正需要时进行重构也是很好的。
标签: python oop design-patterns data-structures