如何修改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

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

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