如何简化动态字符串列表的格式转换操作?
简化PyTorch Conv2d层字符串格式转换的方案
我明白你想要把批量的Conv2d层描述字符串转换成更紧凑的格式,还要给每个条目加上递增的序号对吧?咱们可以用正则表达式精准匹配并提取关键参数,结合你已有的代码框架,快速实现这个动态修改需求。
核心实现思路
- 用正则表达式捕获原字符串里的所有关键参数:输入通道数、输出通道数、卷积核尺寸、步长、填充值
- 遍历字符串列表时,给每个条目从1开始分配序号
- 按照你需要的目标格式拼接提取到的参数,生成新的字符串
完整代码实现
import re def modify_conv2d_strings(str_list): # 正则匹配模式:精准匹配原Conv2d字符串结构,捕获关键参数 conv_pattern = r'Conv2d\((\d+), (\d+), kernel_size=\((\d+), (\d+)\), stride=\((\d+), (\d+)\), padding=\((\d+), (\d+)\)\)' modified_results = [] # 遍历列表,给每个条目加序号(从1开始) for seq_num, original_str in enumerate(str_list, start=1): match_result = re.match(conv_pattern, original_str) if match_result: # 提取捕获到的所有参数 in_channels, out_channels, k_h, k_w, s_h, s_w, p_h, p_w = match_result.groups() # 拼接成目标格式 new_str = f'({seq_num}): Conv2d({in_channels} -> {out_channels}, {k_h}x{k_w}, {s_h},{s_w}, {p_h},{p_w})' modified_results.append(new_str) else: # 如果字符串不匹配格式,保留原内容(可根据需求调整处理逻辑) modified_results.append(original_str) return modified_results
使用示例
假设你有这样的原始字符串列表:
original_conv_list = [ "Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))", "Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))" ] # 调用函数转换 converted_list = modify_conv2d_strings(original_conv_list) # 输出结果 for item in converted_list: print(item)
输出结果会是:
(1): Conv2d(3 -> 64, 3x3, 1,1, 1,1) (2): Conv2d(64 -> 128, 3x3, 1,1, 1,1)
扩展适配说明
如果你的字符串存在其他变体(比如卷积核是单维度如kernel_size=(3,)、包含bias=False这类额外参数),可以调整正则模式来兼容。比如修改卷积核部分的匹配规则:
# 兼容单/双维度卷积核的正则模式 conv_pattern = r'Conv2d\((\d+), (\d+), kernel_size=\((\d+)(?:, (\d+))?\), stride=\((\d+), (\d+)\), padding=\((\d+), (\d+)\)(?:, .*)?\)'
这样就能处理带额外参数或者单维度卷积核的字符串了。
内容的提问来源于stack exchange,提问作者ProGamerGov
相关产品推荐
相关产品推荐

