_pickle.PicklingError: Can‘t pickle <class ‘__main__.MLPmodel‘>: attribute lookup MLPmodel on __main
报错信息:_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相关推荐
- _pickle.PicklingError: Can‘t pickle <class ‘__main__.XXXX‘>: attribute lookup XXXX on __main的解决方法
这是之前报错的代码.在这个代码中,我把对网络的定义和对数据的train和test都写在了同一个文件(demo_reg.py)内.源码如下所示: import re # 引入正则表达式import nu ...
- [报错解决]_pickle.PicklingError: Can‘t pickle <class ‘__main__.Net‘>: attribute lookup Net on __main__ f
今天在Windows操作系统跑完模型之后想保存模型,无奈遇到如下报错: 真的是挺纳闷啊! 这是关于pickle的报错,于是上网查找了关于pickle的信息: pickle提供了一个简单的持久化功能,可 ...
- pytorch报错:PicklingError: Can’t pickle <function at 0x000001EA6923EAF0>: attribute lookup on main fai
PicklingError: Can't pickle : attribute lookup on main faied 报错显示 任务背景 解决方案 报错显示 PicklingError: Can' ...
- Python爬虫踩坑记录 _pickle.PicklingError: Can‘t pickle <class>
做大作业老师要求帮他们组运行一个爬虫程序,下载源码后在Anaconda里运行,发现了奇怪的报错. Traceback (most recent call last):File "ccf_cr ...
- _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 ...
- _pickle.PicklingError: Can‘t pickle <class ‘MemoryError‘>: 报错
参考这个修改CPU读取数据得线程即可,我测试了下4不可以 2可以3也可以 ,当然保险设置为0 cpu 取数据线程调小一点 参考博客如下. 模型训练中_pickle.PicklingError: Can ...
- _pickle.PicklingError: Can‘t pickle <function <lambda> at 0x000001C172C848C8
_pickle.PicklingError: Can't pickle <function at 0x000001C172C848C8 百度看到很多都是用第三方库dill来解决的,但是我另外一个 ...
- 学习backtrader笔记(1): _pickle.PicklingError: Can‘t pickle attribute lookup
2022年1月5日晚,在学习backtrader时,参考的是CSDN下载的资料<Backtrader官方文档中文翻译.PDF>. 本人开发IDE软件用的是pycharm. 当学习到参数优化 ...
- 模型训练中_pickle.PicklingError: Can’t pickle问题解决办法
模型训练中_pickle.PicklingError: Can't pickle问题解决办法 一.问题描述 二.解决办法 欢迎学习交流! 邮箱: z-@1-6.com 网站: https://zeph ...
最新文章
- Android群英传笔记——第四章:ListView使用技巧
- unshift() 方法将一个或多个元素添加到数组的开头,并返回新数组的长度
- python怎么导入apscheduler,如何强制apscheduler将作业添加到作业存储?
- C++基础与深度解析第六章:函数
- VB.NET工作笔记007---ASP.NET中Session超时一直不起作用
- PHP和MySQL Web开发从新手到高手,第9天-总结
- Hadoop配置文件详解
- java计算机毕业设计网络教学系统源码+系统+数据库+lw文档
- python怎么交换xy轴_matplotlib Y轴和X轴交换
- 【Encoder-Decoder】
- 信息系统高级项目管理师英语词汇(二)-常见项目管理词汇
- ancestral 箭头符号,英文字典
- iPhone内存管理详细解说(二)
- /*输入一个字符串,判断其是否为回文。(回文字符串是指从左到右读和从右到左读完全相同的字符)*/
- ***偷删警察蜀黍文件
- cmd输入cl提示不是内部命令
- 烂泥:利用PhotoShop自定义艺术字体
- 生活明朗,万物可爱,人间值得,未来可期
- SSH三大框架笔面试总结
- 电商购物网站 - 数据库设计