北京一诺网站建设公司,wordpress sae 安装主题,专业建站教程,crm客户管理系统免费拿来练手#xff0c;大神请绕道。 1.网上的代码大多都写在一个函数里#xff0c;但是其实很多好论文都是把网络#xff0c;数据训练等分开写的。
2.分开写就是有一个需要注意的事情#xff0c;就是要import 要用到的文件中的模型或者变量等。
3.全连接的回归也写了#…拿来练手大神请绕道。 1.网上的代码大多都写在一个函数里但是其实很多好论文都是把网络数据训练等分开写的。
2.分开写就是有一个需要注意的事情就是要import 要用到的文件中的模型或者变量等。
3.全连接的回归也写了有空再上传吧。
4.一般都是先写data或者model
import torch
import torch.nn as nn
import torch.nn.functional as F
#nn.func这个里面很多功能其实nn里就有可以不导入而且后面新的版本的torch也取消了cc.functional里面的部分函数#定义网络需要定义两部分一部分就是初始化另一部分就是数据流
class FCNet(nn.Module):def __init__(self):super(FCNet,self).__init__()self.fc1 nn.Linear(8,16#初始的这个8要和你的数据的特征数一样才行后面的数可以随意设置但是不要太多容易过拟合# self.fc2 nn.Linear(50,20)self.fc3 nn.Linear(16,2)#二分类输出2其实1也可以的#最后的就是分类数因为用的sigmod和交叉熵损失就不用额外加softmax了多分类要用softmaxself.sig nn.Sigmoid()# self.drop nn.Dropout(0.3)#可以把用到的放在这里也可以用nn.Sequential()放在一起这样后面的话就可以直接用这个不用写那么多了def forward(self,x):x self.sig(self.fc1(x))# x self.sig(self.fc2(x))x self.sig(self.fc3(x))return x#就是x要怎么在网络中走要写一遍#可以自己输出测试一下看看网络是不是自己想的那样在真的调用的时候再屏蔽掉
# net FCNet()
# print(net)
首先看看数据是是啥样outcome就是有没有糖尿病 其实可以手动把csv分成train和test
import pandas as pd
from sklearn.model_selection import train_test_split
import torch
from torch.utils.data import Dataset
from torch.utils.data import DataLoader
import numpy as np
#导入pands是为了读数据当然使用numpy也可以读得sklearn是为了把训练数据分为训练和验证集data pd.read_csv(./train.csv)
#就是把对应的数据哪出来x代表的是feature上的datay代表的是label因为pd可以读到最上面的标签所以从第2行i1开始读就行
x data.iloc[1:,:-1]
y data.iloc[1:,[-1]]
#可以输出看看数据对不对x中不应该包含labels
# print(x)
# print(y)
#test_size就是划分的比例后面的是种子意思是每次运行这个函数时候0.8就是那些0.2也还是每次一样如果想要不一样只要每次运行这个函数时候换个值就行
x_train,x_test,y_train,y_test train_test_split(x,y,test_size0.2,random_state0)
#print(x_train,y_test)
# print(x_test,y_test)
#给数据进行归一化可以用很多方法我用最简单的归一到-1到1
x_train x_train.apply(lambda x: (x - x.mean()) / (x.std()))
x_test x_test.apply(lambda x: (x - x.mean()) / (x.std()))#写dataset可以用两种方法第一种就是 每一个数据自己单独处理第二个就是要自己重写dataset类
#1.
# 可以使用分别的处理把数据(首先转换为tensor或者把dataframe.valus拿出来才能转换为tensor)转换为tensor并且数据类型转换为float32,如果测试没有真值需要单独转换
# x_train torch.tensor(np.array(x_train),dtypetorch.float32)
# y_train torch.tensor(np.array(y_train),dtypetorch.float32)
# x_test torch.tensor(np.array(x_test),dtypetorch.float32)
# y_test torch.tensor(np.array(x_test),dtypetorch.float32)
# train_dataset torch.utils.data.TensorDataset(x_train,y_train)
# test_dataset torch.utils.data.TensorDataset(x_test,y_test)#2.也可以直接重写datasetclass dataset(Dataset):def __init__(self, x, y):#把值拿出来或者变为np类型才能转换为tensor# self.data torch.tensor(x.values,dtypetorch.float32)# self.labels torch.tensor(y.values,dtypetorch.float32)self.data torch.tensor(np.array(x),dtypetorch.float32)self.labels torch.tensor(np.array(y),dtypetorch.float32)def __len__(self):return len(self.data)def __getitem__(self,idx):return self.data[idx],self.labels[idx]#应该返回的是list类型不是字典也不是setBATCH_SIZE 64#验证集一般不用shuffle
train_dataset dataset(x_train,y_train)
test_dataset dataset(x_test,y_test)
# print(train_dataset)
train_loader DataLoader(train_dataset,batch_sizeBATCH_SIZE,shuffleTrue)
test_lodaer DataLoader(test_dataset,batch_sizeBATCH_SIZE,shuffleFalse)
# print(train_loader)
然后就可以写train或者test了其实test和train一样
from Model import FCNet
import torch
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt
import data
#导入要调用的net和data也可以from data import xxx 这样可以直接用xxx现在的这个需要用data.xxx#看自己的设备最好用gpu来跑
if (torch.cuda.is_available()):my_device torch.device(cuda)
else:my_device torch.device(cpu)print(my_device)
#实例化一个net并且放到gpu上需要放到gpu上的有inputslabelsnetloss
net FCNet().to(my_device)
# print(net)
#定义损失函数和优化器
criterion nn.CrossEntropyLoss()
#一开始是不需要weight_decay也就是l2正则化,可以等出现过拟合在用也可以先用上
optimizer optim.Adam(net.parameters(),lr0.001,weight_decay0.01)epochs 600
#定义train因为一边训练一边验证所有就把两个loader都放进去了不过写法很多也可以不放dataloader放epoches也可以
def train(dataloader,valloader):losses []acces []losses_val []for epoch in range(epochs):loss_batch 0for i,data in enumerate(dataloader):#需要注意的这里的inputs和labels和之前定义的dataset相关需要是list类型才可以inputs,labels data#print(data)可以打印出来查看一下inputs,labels inputs.to(my_device),labels.to(my_device)optimizer.zero_grad()#每次要梯度清零outputs net(inputs)#print(outputs)#model的最后一层是sigmod#labels的格式需要注意因为现在是[[1],[0],[1],[1]..]这样得格式无法放到交叉熵了需要时[0,1,1,1...]这样得格式才行loss criterion(outputs,labels.squeeze(1).long()).to(my_device)#print(labels.squeeze(1).long())loss.backward()optimizer.step()loss_batch loss.item()length i#验证的时候不用反向传播和梯度下降这些net.eval()count 0right 0loss_batch_val 0with torch.no_grad():for j,data2 in enumerate(valloader):val_inputs,val_labels data2val_inputs,val_labels val_inputs.to(my_device),val_labels.squeeze(1).long().to(my_device)val_outputs net(val_inputs)loss_val criterion(val_outputs,val_labels)#因为net的最后一层是2所以输出的是2维的【0.60.4】这种但是这个可以直接放到交叉熵中#——中放的是概率pred中放的是预测的类别算损失还是要用outputs但是算准确率就是用pred和真实labels相比了_,pred torch.max(val_outputs,1)#print(pred)right (pred val_labels).sum().item()count len(val_labels)acc right/countloss_batch_val loss_val.item()length2 jif epoch % 10 9:print(train_epoch:,epoch1,train_loss:,loss_batch/length,val_loss:,loss_batch_val/length2,acc:,acc)losses.append(loss_batch/length)acces.append(acc)losses_val.append(loss_batch_val/length2)#可以画一些曲线输出一些值plt.plot(range(60),losses,color blue,label train_loss)plt.plot(range(60),acces, color red,label val_acc)plt.plot(range(60),losses_val,color yellow,label val_loss)plt.legend()plt.show()torch.save(net.state_dict(),./weights_epoch1000.pth)#保存参数train(data.train_loader,data.test_lodaer)
最后看一下结果最后的准确率在85%左右还可以毕竟数据不多也是简单的全连接。 在这个结果之前出现了很多问题比如波动很大损失先降后升等问题找个有问题的图 下面是一些总结
1.跳跃很大波动增大batch_size减小lr。
2.降低过拟合 a.降低模型的复杂程度但是修改具体的神经元个数因为这个网络本身就不大所有没啥用模型非常大没准会有用。 b.batchsize增大lr减小是有效的。 c.输入数据进行归一化是有用的归一化之后lr可以调大一点收敛变快了。 d.L2正则化是有用的很有用。dropout应该也有用但是模型本来就很小我试了试没啥差别。而且有正则化之后可以加速收敛lr可以稍微调大一点较少的epoches也可以收敛了而已acc也会更高一点稳定一点。