报错信息:_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)
# 输出为output
return 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()