import torch
import torch.nn as nn
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import torch.nn.functional as f
from torch.utils.data import tensordataset
from torch.utils.data import dataloader
from sklearn.model_selection import train_test_split
data = pd.read_csv(r'd:/pycharmworkspace/islr-master/iris.csv')
#將資料species列由字母轉換成數字
data['species']=pd.factorize(data.species)[0]
#x不要第零列,不要最後一列 第乙個:代表全部的行 第二個:代表列
x = data.iloc[:,1:-1].values
#y只要特定一列
y = data.species.values
train_x,test_x,train_y,test_y=train_test_split(x,y)
#將資料轉換成tensor longtensor等價於int64
train_x = torch.from_numpy(train_x).type(torch.float32)
train_y = torch.from_numpy(train_y).type(torch.int64)
test_x = torch.from_numpy(test_x).type(torch.float32)
test_y = torch.from_numpy(test_y).type(torch.longtensor)
#資料只有150行故batch也要小一點
batch = 8
no_of_batches = len(data)//batch
epochs = 1000
#tensordataset()可以對tensor進行打包即合併
train_ds = tensordataset(train_x,train_y)
#希望模型不關注訓練集資料順序故用亂序
train_dl = dataloader(train_ds,batch_size=batch,shuffle=true)
test_ds = tensordataset(test_x,test_y)
#對測試集不需要用亂序避免工作量增加
test_dl = dataloader(test_ds,batch_size=batch)
#建立模型
#繼承nn.module這個類並自定義模型
class model(nn.module):
#定義初始化方法
def __init__(self):
#繼承父類所有屬性
super().__init__()
#(初始化第一層 輸入到隱藏層1)4個輸入特徵 32個輸出特徵
self.liner_1 = nn.linear(4,32)
#(初始化第二層 隱藏層1到隱藏層2)32個輸入特徵 32個輸出特徵
self.liner_2 = nn.linear(32,32)
#(初始化第三層 隱藏層2到輸出層)32個輸入特徵 3個輸出特徵
self.liner_3 = nn.linear(32,3)
#使用f不需要初始化啟用層
#定義def forward會呼叫上述這些層來處理input
def forward(self,input):
#在第一層上對input進行呼叫 並啟用
x = f.relu(self.liner_1(input))
#在第二層上對input進行呼叫 並啟用
x = f.relu(self.liner_2(x))
#多分類任務並不啟用,也有人寫成如下所示,用softmax啟用
#x = f.softmax(self.liner_3(x))
#首先,nn.crossentropyloss()函式的輸入是乙個未啟用的輸出
#其次,多項分類可以使用softmax函式進行啟用
#然後,使用softmax()函式進行啟用是將結果對映到乙個0到1的概率分布上
#最後,如果不用softmax啟用,輸出最大的值依然是那個概率最高的值
x = self.liner_3(x)
return x
model = model()
#損失函式
loss_fn = nn.crossentropyloss()
def accuracy(y_pred,y_true):
#torch.argmax將數字轉換成真正的**結果
y_pred = torch.argmax(y_pred,dim=1)
acc = (y_pred == y_true).float().mean()
return acc
#便於隨著訓練的進行觀察數值的變化
train_loss=
train_acc=
test_loss=
test_acc=
def get_model():
#獲得這個模型
model = model()
#優化函式 優化的是模型所有變數即model.parameters()
opt = torch.optim.adam(model.parameters(),lr=0.0001)
return model,opt
model,optim = get_model()
for epoch in range(epochs):
for x,y in train_dl:
y_pred = model(x)
loss = loss_fn(y_pred, y)
# 梯度置為0
optim.zero_grad()
# 反向傳播求解梯度
loss.backward()
# 優化
optim.step()
# 不需要進行梯度計算
鳶尾花分類python演算法 BP演算法鳶尾花分類
bp演算法鳶尾花分類 網上很多鳶尾花例子,學習其他人後仿寫,我在執行其他人的時候會有溢位和錯誤。下述 準確率95 提取碼 y07d 如果有什麼不對的或者有什麼不懂iamzhubaoliang yeah.net 工程位址 import math import random import pandas ...
鳶尾花資料集
from sklearn import datasets iris datasets.load iris iris是乙個字典集keys iris.keys dict keys data target target names descr feature names data iris.data.sh...
sklearn(一) 鳶尾花
原先有用c 語言,k近鄰演算法實現 鳶尾花型別。from sklearn import datasets datasets模組 from sklearn.model selection import train test split 分離訓練集和測試集資料 from sklearn.neighbor...