报错信息:_pickle.PicklingError: Can't pickle <class '__main__.MLPmodel'>: attribute lookup MLPmodel on __main__ failed

解决方法:

报错信息的意思是在main里面找不到MLPmodel(文末附源代码)

因为我是在同一个文件A里定义的网络结构(class MLPmodel),在后面的if __name__ == "__main__"里面使用,故出现上述报错。

将class MLPmodel部分代码剪切粘贴到一个单独的文件B中,在A中import即可解决问题。

下面放出代码:原代码及更改后的代码

原代码:create_net.py

更改后的代码:MLPmodel.py、MLPmodel2.py、create_net_test.py

create_net.py

'''搭建网络:用Module和Sequential两种不同的网络定义方式'''
import torch
import torch.nn as nn  # nn模块方便用户对网络中的层的使用
from torch.optim import SGD
import torch.utils.data as Data  # Data模块用于对使用数据的预处理
from sklearn.datasets import load_boston  # 用于导入数据
from sklearn.preprocessing import StandardScaler  # 对数据进行标准化
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt# 使用继承Module的方式定义一个包含层的全连接神经网络
class MLPmodel(nn.Module):def __init__(self):super(MLPmodel, self).__init__()# 定义第一个隐藏层self.hidden1 = nn.Linear(in_features=13,  # 第一个隐藏层的输入,数据的特征数out_features=10,  # 第一个隐藏层的输出,神经元的数量bias=True,  # 默认会有偏置)self.active1 = nn.ReLU()# 定义第二个隐层self.hidden2 = nn.Linear(10, 10)self.active2 = nn.ReLU()# 定义预测回归层self.regression = nn.Linear(10, 1)# 定义网络的前向传播路径def forward(self, x):x = self.hidden1(x)x = self.active1(x)x = self.hidden2(x)x = self.active2(x)output = self.regression(x)# 输出为outputreturn output# 使用定义网络时使用nn.Sequential的形式
class MLPmodel2(nn.Module):def __init__(self):super(MLPmodel2, self).__init__()# 定义隐藏层# nn.Sequential()可以简化定义网络的结构和前向传播函数self.hidden = nn.Sequential(nn.Linear(13, 10),nn.ReLU(),nn.Linear(10, 10),nn.ReLU(),)# 预测回归层self.regression = nn.Linear(10, 1)# 定义网络的前向传播路径def forward(self, x):x = self.hidden(x)output2 = self.regression(x)return output2def init_weights(m):'''对不同类型层的参数使用不同的方法进行初始化:param m: 网络的某一层:return:'''# 如果是卷积层if type(m) == nn.Conv2d:torch.nn.init.normal_(m.weight, mean=0, std=0.5)# UserWarning: nn.init.normal is now deprecated in favor of nn.init.normal_.# 如果是全连接层if type(m) == nn.Linear:torch.nn.init.uniform_(m.weight, a=-0.1, b=0.1)m.bias.data.fill_(0.01)if __name__ == '__main__':# 读取数据boston_X, boston_y = load_boston(return_X_y=True)print("boston_X.shape:", boston_X.shape)plt.figure()plt.hist(boston_y, bins=20)plt.show()# 数据标准化处理ss = StandardScaler(with_mean=True, with_std=True)boston_Xs = ss.fit_transform(boston_X)# 将数据预处理为可以使用pytorch进行批量训练的形式# 训练集X转化为张量train_xt = torch.from_numpy(boston_Xs.astype(np.float32))# 训练集y转化为张量train_yt = torch.from_numpy(boston_y.astype(np.float32))# 将训练集转化为张量后,使用TensorDataset将X和y整理到一起train_data = Data.TensorDataset(train_xt, train_yt)# 定义一个数据加载器,将训练数据集进行批量处理train_loader = Data.DataLoader(dataset=train_data,  # 使用的数据集batch_size=128,  # 批处理样本大小shuffle=True,  # 每次迭代前打乱数据num_workers=1,  # 使用两个进程)###################### 网络定义与训练方式1 ################################### 输出网络结构mlp1 = MLPmodel()print(mlp1)# # 使用网络的apply方法进行权重初始化# torch.manual_seed(13)# mlp1.apply(init_weights)# 对回归模型mlp1进行训练并输出损失函数的变化情况,定义优化器和损失函数optimizer = SGD(mlp1.parameters(), lr=0.001)  # 使用SGD优化方法对网络进行优化,需要优化的参数可以使用mlp1.parameters()获得loss_function = nn.MSELoss()  # 使用MSELoss()函数作为损失函数:最小均方根误差train_loss_all = []  # 保存每个批次训练的损失函数值,用来可视化# 进行训练,并保存每次迭代的损失函数值for epoch in range(30):  # 定义了对整个数据集训练的次数# 对训练数据的加载器进行迭代计算for step, (b_x, b_y) in enumerate(train_loader):  # 利用train_loader中的每一个batch对模型参数进行优化output = mlp1(b_x).flatten()  # MLP在训练本轮batch上的输出,返回值为一个一维数组train_loss = loss_function(output, b_y)#optimizer.zero_grad()  # 每个迭代步的梯度初始化为0train_loss.backward()  # 损失的后向传播,计算梯度optimizer.step()  # 使用梯度进行优化#train_loss_all.append(train_loss.item())# train_loss_all里面包括120个点,因为506个样本,128/batch,共4batch;# 4batch * 30epoch = 120plt.figure()plt.plot(train_loss_all, "r-")plt.title("Train loss per iteration")plt.show()###################### 网络定义与训练方式2 ################################### 输出网络结构mlp2 = MLPmodel2()print(mlp2)# 使用与mlp1同样的优化方式对mlp2进行训练并输出损失函数的变化情况###################### PyTorch模型保存和加载方法 ################################### 方法一:保存整个模型# torch.save(mlp1, "model_saved/mlp1.pkl")# print('1')# mlp1load = torch.load("model_saved/mlp1.pkl")  # 导入保存的模型# print('2')# print(mlp1load)# print(mlp1load.hidden2.weight)# 方法二:只保存模型的参数torch.save(mlp1.state_dict(), "model_saved/mlp1_param.pkl")print('3')mlp1load_param = torch.load("model_saved/mlp1_param.pkl")  # 导入保存的模型的参数print('4')print(mlp1load_param)

MLPmodel.py

import torch.nn as nn# 使用继承Module的方式定义一个包含层的全连接神经网络
class MLPmodel(nn.Module):def __init__(self):super(MLPmodel, self).__init__()# 定义第一个隐藏层self.hidden1 = nn.Linear(in_features=13,  # 第一个隐藏层的输入,数据的特征数out_features=10,  # 第一个隐藏层的输出,神经元的数量bias=True,  # 默认会有偏置)self.active1 = nn.ReLU()# 定义第二个隐层self.hidden2 = nn.Linear(10, 10)self.active2 = nn.ReLU()# 定义预测回归层self.regression = nn.Linear(10, 1)# 定义网络的前向传播路径def forward(self, x):x = self.hidden1(x)x = self.active1(x)x = self.hidden2(x)x = self.active2(x)output = self.regression(x)# 输出为outputreturn output

MLPmodel2.py

import torch.nn as nn# 使用定义网络时使用nn.Sequential的形式
class MLPmodel2(nn.Module):def __init__(self):super(MLPmodel2, self).__init__()# 定义隐藏层# nn.Sequential()可以简化定义网络的结构和前向传播函数self.hidden = nn.Sequential(nn.Linear(13, 10),nn.ReLU(),nn.Linear(10, 10),nn.ReLU(),)# 预测回归层self.regression = nn.Linear(10, 1)# 定义网络的前向传播路径def forward(self, x):x = self.hidden(x)output2 = self.regression(x)return output2

create_net_test.py

'''搭建网络:用Module和Sequential两种不同的网络定义方式'''
import torch
import torch.nn as nn  # nn模块方便用户对网络中的层的使用
from torch.optim import SGD
import torch.utils.data as Data  # Data模块用于对使用数据的预处理
from sklearn.datasets import load_boston  # 用于导入数据
from sklearn.preprocessing import StandardScaler  # 对数据进行标准化
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from MLPmodel import MLPmodel
from MLPmodel2 import MLPmodel2def init_weights(m):'''对不同类型层的参数使用不同的方法进行初始化:param m: 网络的某一层:return:'''# 如果是卷积层if type(m) == nn.Conv2d:torch.nn.init.normal_(m.weight, mean=0, std=0.5)# UserWarning: nn.init.normal is now deprecated in favor of nn.init.normal_.# 如果是全连接层if type(m) == nn.Linear:torch.nn.init.uniform_(m.weight, a=-0.1, b=0.1)m.bias.data.fill_(0.01)if __name__ == '__main__':# 读取数据boston_X, boston_y = load_boston(return_X_y=True)print("boston_X.shape:", boston_X.shape)plt.figure()plt.hist(boston_y, bins=20)plt.show()# 数据标准化处理ss = StandardScaler(with_mean=True, with_std=True)boston_Xs = ss.fit_transform(boston_X)# 将数据预处理为可以使用pytorch进行批量训练的形式# 训练集X转化为张量train_xt = torch.from_numpy(boston_Xs.astype(np.float32))# 训练集y转化为张量train_yt = torch.from_numpy(boston_y.astype(np.float32))# 将训练集转化为张量后,使用TensorDataset将X和y整理到一起train_data = Data.TensorDataset(train_xt, train_yt)# 定义一个数据加载器,将训练数据集进行批量处理train_loader = Data.DataLoader(dataset=train_data,  # 使用的数据集batch_size=128,  # 批处理样本大小shuffle=True,  # 每次迭代前打乱数据num_workers=1,  # 使用两个进程)###################### 网络定义与训练方式1 ################################### 输出网络结构mlp1 = MLPmodel()print(mlp1)# # 使用网络的apply方法进行权重初始化# torch.manual_seed(13)# mlp1.apply(init_weights)# 对回归模型mlp1进行训练并输出损失函数的变化情况,定义优化器和损失函数optimizer = SGD(mlp1.parameters(), lr=0.001)  # 使用SGD优化方法对网络进行优化,需要优化的参数可以使用mlp1.parameters()获得loss_function = nn.MSELoss()  # 使用MSELoss()函数作为损失函数:最小均方根误差train_loss_all = []  # 保存每个批次训练的损失函数值,用来可视化# 进行训练,并保存每次迭代的损失函数值for epoch in range(30):  # 定义了对整个数据集训练的次数# 对训练数据的加载器进行迭代计算for step, (b_x, b_y) in enumerate(train_loader):  # 利用train_loader中的每一个batch对模型参数进行优化output = mlp1(b_x).flatten()  # MLP在训练本轮batch上的输出,返回值为一个一维数组train_loss = loss_function(output, b_y)#optimizer.zero_grad()  # 每个迭代步的梯度初始化为0train_loss.backward()  # 损失的后向传播,计算梯度optimizer.step()  # 使用梯度进行优化#train_loss_all.append(train_loss.item())# train_loss_all里面包括120个点,因为506个样本,128/batch,共4batch;# 4batch * 30epoch = 120plt.figure()plt.plot(train_loss_all, "r-")plt.title("Train loss per iteration")plt.show()###################### 网络定义与训练方式2 ################################### 输出网络结构mlp2 = MLPmodel2()print(mlp2)# 使用与mlp1同样的优化方式对mlp2进行训练并输出损失函数的变化情况###################### PyTorch模型保存和加载方法 ################################### 方法一:保存整个模型torch.save(mlp1, "model_saved/mlp1.pkl")print('1')mlp1load = torch.load("model_saved/mlp1.pkl")  # 导入保存的模型print('2')print(mlp1load)print(mlp1load.hidden2.weight)# 方法二:只保存模型的参数torch.save(mlp1.state_dict(), "model_saved/mlp1_param.pkl")print('3')mlp1load_param = torch.load("model_saved/mlp1_param.pkl")  # 导入保存的模型的参数print('4')print(mlp1load_param)

_pickle.PicklingError: Can‘t pickle <class ‘__main__.MLPmodel‘>: attribute lookup MLPmodel on __main相关推荐

  1. _pickle.PicklingError: Can‘t pickle <class ‘__main__.XXXX‘>: attribute lookup XXXX on __main的解决方法

    这是之前报错的代码.在这个代码中,我把对网络的定义和对数据的train和test都写在了同一个文件(demo_reg.py)内.源码如下所示: import re # 引入正则表达式import nu ...

  2. [报错解决]_pickle.PicklingError: Can‘t pickle <class ‘__main__.Net‘>: attribute lookup Net on __main__ f

    今天在Windows操作系统跑完模型之后想保存模型,无奈遇到如下报错: 真的是挺纳闷啊! 这是关于pickle的报错,于是上网查找了关于pickle的信息: pickle提供了一个简单的持久化功能,可 ...

  3. pytorch报错:PicklingError: Can’t pickle <function at 0x000001EA6923EAF0>: attribute lookup on main fai

    PicklingError: Can't pickle : attribute lookup on main faied 报错显示 任务背景 解决方案 报错显示 PicklingError: Can' ...

  4. Python爬虫踩坑记录 _pickle.PicklingError: Can‘t pickle <class>

    做大作业老师要求帮他们组运行一个爬虫程序,下载源码后在Anaconda里运行,发现了奇怪的报错. Traceback (most recent call last):File "ccf_cr ...

  5. _pickle.PicklingError:Can‘t pickle <function <lambda> at 0>: attribute lookup <lambda> on xxx failed

    报错提示: _pickle.PicklingError: Can't pickle <function <lambda> at 0x0000016CEB6F0488>: att ...

  6. _pickle.PicklingError: Can‘t pickle <class ‘MemoryError‘>: 报错

    参考这个修改CPU读取数据得线程即可,我测试了下4不可以 2可以3也可以 ,当然保险设置为0 cpu 取数据线程调小一点 参考博客如下. 模型训练中_pickle.PicklingError: Can ...

  7. _pickle.PicklingError: Can‘t pickle <function <lambda> at 0x000001C172C848C8

    _pickle.PicklingError: Can't pickle <function at 0x000001C172C848C8 百度看到很多都是用第三方库dill来解决的,但是我另外一个 ...

  8. 学习backtrader笔记(1): _pickle.PicklingError: Can‘t pickle attribute lookup

    2022年1月5日晚,在学习backtrader时,参考的是CSDN下载的资料<Backtrader官方文档中文翻译.PDF>. 本人开发IDE软件用的是pycharm. 当学习到参数优化 ...

  9. 模型训练中_pickle.PicklingError: Can’t pickle问题解决办法

    模型训练中_pickle.PicklingError: Can't pickle问题解决办法 一.问题描述 二.解决办法 欢迎学习交流! 邮箱: z-@1-6.com 网站: https://zeph ...

最新文章

  1. Android群英传笔记——第四章:ListView使用技巧
  2. unshift() 方法将一个或多个元素添加到数组的开头,并返回新数组的长度
  3. python怎么导入apscheduler,如何强制apscheduler将作业添加到作业存储?
  4. C++基础与深度解析第六章:函数
  5. VB.NET工作笔记007---ASP.NET中Session超时一直不起作用
  6. PHP和MySQL Web开发从新手到高手,第9天-总结
  7. Hadoop配置文件详解
  8. java计算机毕业设计网络教学系统源码+系统+数据库+lw文档
  9. python怎么交换xy轴_matplotlib Y轴和X轴交换
  10. 【Encoder-Decoder】
  11. 信息系统高级项目管理师英语词汇(二)-常见项目管理词汇
  12. ancestral 箭头符号,英文字典
  13. iPhone内存管理详细解说(二)
  14. /*输入一个字符串,判断其是否为回文。(回文字符串是指从左到右读和从右到左读完全相同的字符)*/
  15. ***偷删警察蜀黍文件
  16. cmd输入cl提示不是内部命令
  17. 烂泥:利用PhotoShop自定义艺术字体
  18. 生活明朗,万物可爱,人间值得,未来可期
  19. SSH三大框架笔面试总结
  20. 电商购物网站 - 数据库设计

热门文章

  1. 家用洗地机哪种好用?最适合家用的洗地机
  2. 百度熊掌号: 2018-2020年, 你不容错过的流量红利!
  3. 配置 zabbix 监控 MySQL
  4. Linux 中 sudo和su的区别
  5. iOS WCDB 使用
  6. 汽车 - 数据交换格式
  7. fpga hdmi接收和发送部分调试
  8. ORA-00257: 归档程序错误-增加空间、删除日志、关闭日志
  9. 按键精灵 获取包名和使用
  10. PHP数组合并 array_merge