我有一个生成器,我想修改这个生成器的最后一个元素。我想用另一个元素替换最后一个元素。我知道如何获取最后一个元素,但不知道如何修改它。
解决这个问题的最佳方法是什么?
为了提供更多背景信息,这是我想做的事情:
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方面也被认为是“合理的小”),我建议采取一种易于理解和维护的方法。没有“明显”的方法可以检测到你距离耗尽生成器只差一步。
- 耗尽当前生成器,将其输出制作成一个列表。
- 按需替换最后一个元素。
- 围绕这个修改后的列表创建一个新的生成器。
做这件事的“优雅”(?)方法是编写一个带有一步预读功能的包装生成器:在每次调用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
这有帮助吗?