基于Pytorch实现自建数据库的深度神经网络模型案例

引言

 本文将详细介绍如何使用自建数据库实现简单的深层神经网络模型。

首先载入相关库:

import torch
import torch.nn as nn
from torch.utils.data import DataLoader,Dataset
import numpy as np
import torch.optim as optim
import xlrd
import matplotlib as mpl
import matplotlib.pyplot as plt #导入画图库
from sklearn import preprocessing

设定自己的数据库:

class Mydataset(Dataset):
    def __init__(self,filepath):
        datalist=[]
        data = xlrd.open_workbook(filepath, encoding_override='utf-8')
        table = data.sheets()[0]  # 选定表sheet1 或sheet2  0表示sheet1 1表示sheet2
        nrows = table.nrows  # 获取行号
        ncols = table.ncols  # 获取列号
        '''
         def __init__(self,filepath):
        xy = np.loadtxt(filepath,delimiter=' ',dtype=np.float)
        self.x_data = torch.from_numpy(data_scaler.fit_transform(datalist[:,:-1]))
        self.y_data = torch.from_numpy(xy[:,[-1]])
        '''
        for i in range(0, nrows):  # 第0行为表头
            alldata = table.row_values(i)  # 循环输出excel表中每一行,即所有数据
            datalist.append(alldata)  # 创建
        datalist = np.array(datalist,dtype=np.float32) #将获取的数据全部转换成数组浮点数
        self.len = datalist.shape[0]
        self.x_data = torch.from_numpy(data_scaler.fit_transform(datalist[:,:-1])) #将特征输入归一化
        self.y_data = torch.from_numpy(datalist[:,[-1]])
        print("数据已录入")

    def __getitem__(self, index):
        return self.x_data[index],self.y_data[index]
    def __len__(self):
        return self.len

看完不会你揍我!!Pytorch利用文本数据建立自己的数据集- Dataset Dataloader详解 附案例_阿进olipe的博客-CSDN博客

 Dataloader加载数据:

#1、使用Dataset 建立自己的数据库
Mydata=Mydataset(Work_inpath)
'''
print(Mydata.x_data)
print(Mydata.y_data)
'''
#2、使用DataLoader 构建训练加载
train_loader=DataLoader(dataset=Mydata,batch_size=20,shuffle=True,num_workers=0)

神经网络通道的建立:

class Model(nn.Module):
    def __init__(self, n_chansl=4):
        super().__init__()
        self.n_chansl = n_chansl
        self.fc1 = nn.Linear(n_chansl, 16)
        self.fc2 = nn.Linear(16, 8)
        self.fc3 = nn.Linear(8,3)
        self.fc4 = nn.Linear(3, 1)

    def forward(self,x):
        out = x.view(-1,self.n_chansl)
        out = torch.relu(self.fc1(out))
        out = torch.relu(self.fc2(out))
        out = torch.relu(self.fc3(out))
        out = torch.relu(self.fc4(out))
        return out

其中

def __init__(self, n_chansl=4): 

表示建立神经网络初始层,输入特征为4 。

def forward(self,x):

表示建立向前传递规则。 

定义训练规则:

def trainingmodel(n_epoch):
    for epoch in range(n_epoch+1):
         for data in train_loader: #enumerate(train_loader)函数表示遍历train_loader中的所有函数
             '1、准备数据'
             inputs, label = data
             '2、向前传播'
             y_pred = model(inputs)
             loss = criterion(y_pred,label)
             print(epoch,loss.item())
             epoch_list.append(epoch)
             loss_list.append(loss)
             '3、向后传播损失函数'
             optimizer.zero_grad()
             loss.backward()
             '4、更新权重参数'
             optimizer.step() #优化器向前def trainingmodel(n_epoch):
    for epoch in range(n_epoch+1):
         for data in train_loader: #enumerate(train_loader)函数表示遍历train_loader中的所有函数
             '1、准备数据'
             inputs, label = data
             '2、向前传播'
             y_pred = model(inputs)
             loss = criterion(y_pred,label)
             print(epoch,loss.item())
             epoch_list.append(epoch)
             loss_list.append(loss)
             '3、向后传播损失函数'
             optimizer.zero_grad()
             loss.backward()
             '4、更新权重参数'
             optimizer.step() #优化器向前

MSE损失值绘图:

#以下两行用来正常显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
mpl.rcParams['legend.fontsize'] = 30  #线段标签 字体大小

#定义画布大小
fig = plt.figure(figsize=(20,20),dpi=72)  #创造一个画布
plt.xlabel('训练步数',size=20,labelpad=20)
plt.ylabel('损失值',size=20,labelpad=20)
plt.plot(epoch_list,new_loss_list,label='MSE损失值',color='blue',linestyle='-',marker='o') #画点plt.scatter()
plt.legend()
plt.show()

效果展示:

完整代码:

import torch
import torch.nn as nn
from torch.utils.data import DataLoader,Dataset
import numpy as np
import torch.optim as optim
import xlrd
import matplotlib as mpl
import matplotlib.pyplot as plt #导入画图库
from sklearn import preprocessing

device=(torch.device('cuda') if torch.cuda.is_available()
        else torch.device('cpu'))
Work_inpath = r'C:\Users\Administrator\Desktop\2.xlsx'
new_loss_list = []
data_scaler = preprocessing.MinMaxScaler(feature_range = (0,1))

class Mydataset(Dataset):
    def __init__(self,filepath):
        datalist=[]
        data = xlrd.open_workbook(filepath, encoding_override='utf-8')
        table = data.sheets()[0]  # 选定表sheet1 或sheet2  0表示sheet1 1表示sheet2
        nrows = table.nrows  # 获取行号
        ncols = table.ncols  # 获取列号
        '''
         def __init__(self,filepath):
        xy = np.loadtxt(filepath,delimiter=' ',dtype=np.float)
        self.x_data = torch.from_numpy(data_scaler.fit_transform(datalist[:,:-1]))
        self.y_data = torch.from_numpy(xy[:,[-1]])
        '''
        for i in range(0, nrows):  # 第0行为表头
            alldata = table.row_values(i)  # 循环输出excel表中每一行,即所有数据
            datalist.append(alldata)  # 创建
        datalist = np.array(datalist,dtype=np.float32) #将获取的数据全部转换成数组浮点数
        self.len = datalist.shape[0]
        self.x_data = torch.from_numpy(data_scaler.fit_transform(datalist[:,:-1])) #将特征输入归一化
        self.y_data = torch.from_numpy((datalist[:,[-1]]))
        print('数据录入成功')

    def __getitem__(self, index):
        return self.x_data[index],self.y_data[index]
    def __len__(self):
        return self.len

#1、使用Dataset 建立自己的数据库
Mydata=Mydataset(Work_inpath)
'''
print(Mydata.x_data)
print(Mydata.y_data)
'''
#2、使用DataLoader 构建训练加载
train_loader=DataLoader(dataset=Mydata,batch_size=20,shuffle=True,num_workers=0)

class Model(nn.Module):
    def __init__(self, n_chansl=4):
        super().__init__()
        self.n_chansl = n_chansl
        self.fc1 = nn.Linear(n_chansl, 16)
        self.fc2 = nn.Linear(16, 8)
        self.fc3 = nn.Linear(8,3)
        self.fc4 = nn.Linear(3, 1)

    def forward(self,x):
        out = x.view(-1,self.n_chansl)
        out = torch.relu(self.fc1(out))
        out = torch.relu(self.fc2(out))
        out = torch.relu(self.fc3(out))
        out = torch.relu(self.fc4(out))
        return out

model = Model()
criterion = torch.nn.MSELoss()  #定义损失函数
optimizer = torch.optim.SGD(model.parameters(),lr=0.001)

epoch_list = []
loss_list = []
def trainingmodel(n_epoch):
    for epoch in range(n_epoch+1):
         for data in train_loader: #enumerate(train_loader)函数表示遍历train_loader中的所有函数
             '1、准备数据'
             inputs, label = data
             '2、向前传播'
             y_pred = model(inputs)
             loss = criterion(y_pred,label)
             print(epoch,loss.item())
             epoch_list.append(epoch)
             loss_list.append(loss)
             '3、向后传播损失函数'
             optimizer.zero_grad()
             loss.backward()
             '4、更新权重参数'
             optimizer.step() #优化器向前
train_model=trainingmodel(10000)
print(epoch_list)
for i in loss_list:
    new_loss_list.append(float(i))
print(new_loss_list)

#以下两行用来正常显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
mpl.rcParams['legend.fontsize'] = 30  #线段标签 字体大小

#定义画布大小
fig = plt.figure(figsize=(20,20),dpi=72)  #创造一个画布
plt.xlabel('训练步数',size=20,labelpad=20)
plt.ylabel('损失值',size=20,labelpad=20)
plt.plot(epoch_list,new_loss_list,label='MSE损失值',color='blue',linestyle='-',marker='o') #画点plt.scatter()
plt.legend()
plt.show()


 

创作不易,可不可以请您动动宝贵的手指给我顶个赞呢??

非常感谢,祝您有个愉快的一天!!

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值