假设我有一个神经网络。我可以在其中执行一些操作,如下所示:
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个不同的地方更改它。我是否缺少一种设计模式?
答案 0 :(得分:0)
所以传递两个方法:一个是元操作,它接受操作:
'response' => [
'formatters' => [
\yii\web\Response::FORMAT_JSON => [
'class' => 'yii\web\JsonResponseFormatter',
'prettyPrint' => YII_DEBUG, // use "pretty" output in debug mode
'encodeOptions' => JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE,
],
],
],
'urlManager' => [
'enablePrettyUrl' => false,
'showScriptName' => false,
'rules' => [
[
'class' => 'yii\rest\UrlRule',
'controller' => 'v1/blog',
'pluralize'=>false
]
],
]
让def one_iteration(meta_op, my_op, data, ...):
for i in range(...):
...
meta_op(my_op, data)
...
决定如何处理结果。