如何修改Python生成器的最后一个元素?

我有一个生成器,我想修改这个生成器的最后一个元素。我想用另一个元素替换最后一个元素。我知道如何获取最后一个元素,但不知道如何修改它。

解决这个问题的最佳方法是什么?

为了提供更多背景信息,这是我想做的事情:

for child in alexnet.children():    for children_of_child in child.children():         print(children_of_child);

我的生成器对象是:children_of_child,对于第二个子节点,它的所有子节点是:

Dropout(p=0.5)Linear(in_features=9216, out_features=4096, bias=True)ReLU(inplace)Dropout(p=0.5)Linear(in_features=4096, out_features=4096, bias=True)ReLU(inplace)Linear(in_features=4096, out_features=1000, bias=True)

我想用我自己的回归网络替换最后一层Linear(in_features=4096, out_features=1000, bias=True)


回答:

由于你处理的是一个相对较小的列表(即使是ResNet-150在RAM方面也被认为是“合理的小”),我建议采取一种易于理解和维护的方法。没有“明显”的方法可以检测到你距离耗尽生成器只差一步。

  1. 耗尽当前生成器,将其输出制作成一个列表。
  2. 按需替换最后一个元素。
  3. 围绕这个修改后的列表创建一个新的生成器。

做这件事的“优雅”(?)方法是编写一个带有一步预读功能的包装生成器:在每次调用N时,你的包装器中已经有了元素N。你从“真实”的生成器(你发布的代码)中获取元素N+1。如果该元素存在,那么你正常返回元素N。如果该生成器已经耗尽,那么你用你想要的元素替换这个最后的元素,并返回这个修改后的元素。

示例

为了保持简单,我用range代替了你原来的生成器。

def new_tail():    my_list = list(range(6))    my_list[-1] = "new last element"    for elem in my_list:        yield elemfor item in new_tail():    print(item)

输出:

01234new last element

这有帮助吗?

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注