【问题标题】:Pytorch: How to unflatten/get back the network from flattened network?Pytorch:如何从扁平化网络中解压/取回网络?
【发布时间】:2021-05-02 15:02:41
【问题描述】:

我正在使用以下函数来扁平化网络:

#############################################################################
# Flattening the NET
#############################################################################
def flattenNetwork(net):
    flatNet = []
    shapes = []
    for param in net.parameters():
        #if its WEIGHTS
        curr_shape = param.cpu().data.numpy().shape
        shapes.append(curr_shape)
        if len(curr_shape) == 2:
            param = param.cpu().data.numpy().reshape(curr_shape[0]*curr_shape[1])
            flatNet.append(param)
        elif len(curr_shape) == 4:
            param = param.cpu().data.numpy().reshape(curr_shape[0]*curr_shape[1]*curr_shape[2]*curr_shape[3])
            flatNet.append(param)
        else:
            param = param.cpu().data.numpy().reshape(curr_shape[0])
            flatNet.append(param)
    finalNet = []
    for obj in flatNet:
        for x in obj:
            finalNet.append(x)
    finalNet = np.array(finalNet)
    return finalNet,shapes

上述函数将所有权重作为网络的numpy 列向量finalNetshapes(列表)返回。我想看看权重修改对预测准确性的影响。所以,我改变了权重。如何将此修改后的权重向量复制回原始网络?请帮忙。谢谢。

【问题讨论】:

    标签: python pytorch flatten


    【解决方案1】:

    模型定义(其forward 函数)和参数配置(所谓的模型状态,可以使用state_dict 作为字典轻松访问)之间存在差异。

    您可以获得模型的状态,就像您对实现 flattenNetwork 所做的那样。然而,几乎所有模型都无法恢复此操作(,如果您只有权重和图层形状)。

    现在,假设您仍然可以访问net。我的建议是直接使用net.state_dict(),修改它,然后使用load_state_dict 加载权重字典。这样,您将不必自己处理模型参数的序列化。

    【讨论】:

    • 先生,我需要整个网络的序列化权重向量来执行一些数学运算。我是 PyTorch 的初学者,你能举一些例子吗?谢谢。
    猜你喜欢
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    • 2018-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多