Iris数据集神经网络训练
Iris數(shù)據(jù)集神經(jīng)網(wǎng)絡(luò)訓(xùn)練
Iris數(shù)據(jù)集簡(jiǎn)介
Iris數(shù)據(jù)集中簡(jiǎn)單來說有四個(gè)輸入量(四種花的性狀),一個(gè)輸出量(花的種類),神經(jīng)網(wǎng)絡(luò)的作用其實(shí)就是通過數(shù)據(jù)集訓(xùn)練來預(yù)測(cè)未被訓(xùn)練的數(shù)據(jù)的輸出
import csv,pandas as pd import torch import numpy as np import torch.nn as nn import torch.nn.functional as F import matplotlib.pyplot as plt from torch.autograd import Variableinput,output = [],[]#輸入輸出分別對(duì)應(yīng)列表with open('Iris數(shù)據(jù)集下載之后的絕對(duì)路徑')as(f): f_csv=csv.reader(f)headers=next(f_csv)for row in f_csv:input.append([row[1],row[2],row[3],row[4]])#4維張量output.append([row[5]])#單輸出 #讀入CSV文件中的數(shù)據(jù)input = np.asarray(input,dtype=np.float32) input = torch.from_numpy(input)output = np.asarray(output,dtype=np.float32) output = torch.from_numpy(output) #數(shù)據(jù)類型轉(zhuǎn)換為tensorx = torch.unsqueeze(input,dim=1)y = torch.unsqueeze(output,dim=1)x,y =(Variable(x),Variable(y)) print(y) #擴(kuò)充維度class Net(nn.Module):def __init__(self,n_input,n_hidden,n_output):super(Net,self).__init__()self.hidden1 = nn.Linear(n_input,n_hidden)self.hidden2 = nn.Linear(n_hidden,n_hidden)self.predict = nn.Linear(n_hidden,n_output) #Module類構(gòu)造函數(shù)初始化,兩層隱藏層,輸入輸出def forward(self,input):out = self.hidden1(input)out = F.relu(out)out = self.hidden2(out)out = F.sigmoid(out)out = self.predict(out)return out #前饋函數(shù)第一層使用ReLu函數(shù),第二層使用sigmoid函數(shù) net = Net(4,20,1) print(net) #輸入層四個(gè)變量,中間層20,輸出層一個(gè)輸出optimizer = torch.optim.SGD(net.parameters(),lr = 0.2) loss_func = torch.nn.MSELoss() #殘差,即損失函數(shù)for t in range(100000):prediction = net(x)loss = loss_func(prediction, y)optimizer.zero_grad()loss.backward()optimizer.step()if t%5 ==0:print('Loss = %.4f' % loss.data)z=[[5.1,3.8,1.9,0.4]] z = np.asarray(z,dtype=np.float32) z = torch.from_numpy(z) z = torch.unsqueeze(z,dim=1) z=(Variable(z)) pre = net(z) print("pre=",pre)z=[[5.7,2.8,4.1,1.3]] z = np.asarray(z,dtype=np.float32) z = torch.from_numpy(z) z = torch.unsqueeze(z,dim=1) z = (Variable(z)) pre = net(z) print("pre=",pre)z=[[6.2,3.4,5.4,2.3]] z = np.asarray(z,dtype=np.float32) z = torch.from_numpy(z) z = torch.unsqueeze(z,dim=1) z = (Variable(z)) pre = net(z) print("pre=",pre) #因?yàn)镮ris數(shù)據(jù)集總共150組數(shù)據(jù),程序采用120組數(shù)據(jù)訓(xùn)練神經(jīng)網(wǎng)絡(luò),最后使用剩下三十組數(shù)據(jù)進(jìn)行預(yù)測(cè),花的種類直接用0,1,2表示首先在網(wǎng)上下載Iris數(shù)據(jù)集,查找下載后在你電腦上的絕對(duì)路徑,python的讀入文件要用(我是先把Iris的csv文件最后的花種類全部改成了數(shù)字,不然會(huì)報(bào)錯(cuò)),初始化的時(shí)候?qū)nput和output都初始化成列表,通過讀入的數(shù)據(jù)集錄入數(shù)據(jù),input直接讀入四種數(shù)據(jù)因?yàn)闃?gòu)建Iris數(shù)據(jù)集對(duì)應(yīng)的神經(jīng)網(wǎng)絡(luò)是一個(gè)多輸入(四輸入)單輸出的結(jié)構(gòu),將input和output張量(tensor)化
下來就是神經(jīng)網(wǎng)絡(luò)的構(gòu)建,Net類繼承Module類,構(gòu)造函數(shù)兩層隱藏層,前饋函數(shù)第一層使用ReLu函數(shù),第二層使用sigmoid函數(shù)
類的實(shí)例化參數(shù)為(4,20,1),即為矩陣相乘的法則,四輸入單輸出,中間層20
損失函數(shù)采用pytorch自帶的函數(shù)
循環(huán)10w遍,每隔5次計(jì)算當(dāng)前的損失函數(shù)并輸出
最后直接使用未參與訓(xùn)練的數(shù)據(jù)進(jìn)行預(yù)測(cè),因?yàn)閿?shù)據(jù)集中只有150組數(shù)據(jù),我是將其中120組抽出來進(jìn)行訓(xùn)練,剩下30組抽出三組進(jìn)行預(yù)測(cè),pre輸出的數(shù)0,1,2分別代表花的種類(輸出的都是浮點(diǎn)數(shù),可以直接用python的數(shù)學(xué)函數(shù)四舍五入就能得到0,1,2)
總結(jié)
以上是生活随笔為你收集整理的Iris数据集神经网络训练的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。