5 MLP版本的鸢尾花分类任务

编程入门 行业动态 更新时间:2024-10-08 20:38:37

5 MLP<a href=https://www.elefans.com/category/jswz/34/1771446.html style=版本的鸢尾花分类任务"/>

5 MLP版本的鸢尾花分类任务

MLP-多层感知机
一次线性变化加上一次激活函数组成MLP中完整的一个隐藏层,又称全连接层( Dense Layer )。
此版本为3个全连接层的鸢尾花分类模型
主代码模块如下:

import numpy as np
import torch
from torch import nn
from torch.utils.data import DataLoader
from chapter1 import data_download_and_load as ddal  # 数据下载
import matplotlib.pyplot as plt
import tqdm  # 进度条模块# 画散点图
def draw_scatter(ds, names):fig, ax = plt.subplots()x = range(len(ds[0]))for d, name in zip(ds, names):ax.scatter(x, d, alpha=0.6, label=name)ax.legend(fontsize=16, loc='upper left')ax.grid(c='gray')plt.show()# 计算精度
def accuracy4classification(true_classes, pr_classes):return sum(np.array(true_classes) == np.array(pr_classes))/len(true_classes)# 多层感知机版本
class SoftmaxRegMLP(nn.Module):# 初始化子类def __init__(self, n_features, n_classes):# 继承父类属性super(SoftmaxRegMLP, self).__init__()  # 第一种继承方法 python2 python3通用# 初始化权值self.mlp = nn.Sequential(nn.Linear(n_features, n_features * 2),  # 初始化线性层 输入特征数量 输出类别数量nn.Sigmoid(),  # 激活函数 使形成一个完整的隐藏层 又称全连接层nn.Linear(n_features * 2, n_features),nn.Sigmoid(),nn.Linear(n_features, n_classes),nn.Softmax(dim=1),  # Softmax激活函数常用于多分类中)# 前向传播def forward(self, x):y = self.mlp(x)  # MLP多层感知机网络return y@torch.no_grad()  # 关掉梯度计算 节省计算时间
def eva(dates, net):net.eval()  # 测试模式x = torch.Tensor(dates[:, :-1])  # 将测试集数据转化为tensor格式y = dates[:, -1]y_pr = net.forward(x)  # 输入必须为tensor格式pr_classes = np.argmax(y_pr, axis=1)  # 取矩阵里各项最大值的索引 对应标签值acc = accuracy4classification(y, pr_classes)  # 计算精度return accdef train(epochs=100, batch_size=8, lr=0.01):# 数据处理df = ddal.load_iris()  # 下载数据 为csv格式(float32) 这里不需要归一化n_features = df.shape[1] - 1  # 权重项个数n_classes = len(df["target"].unique())  # unique去重获取标签的类别数train_df, test_df = ddal.split_train_test_from_df(df, test_ratio=0.2)  # 将数据集划分为训练集和测试集# 初始化模型、损失函数、梯度下降函数三大类net = SoftmaxRegMLP(n_features, n_classes)  # 初始化模型 同时初始化权值criterion = nn.CrossEntropyLoss()  # 初始化交叉熵损失函数 常用于多分类与二分类问题optimizer = torch.optim.AdamW(net.parameters(), lr=lr)  # 初始化梯度下降函数net.train()  # 训练模式for e in range(epochs):for datas in DataLoader(train_df.values, batch_size=batch_size, shuffle=True):optimizer.zero_grad()  # 梯度归0x = datas[:, :-1]  # 获取X 训练值y = torch.LongTensor(datas[:, -1].detach().numpy())  # 获取y 这里是真值为类别代码 需要将数据转换为tensor格式的long类型y_pr = net.forward(x)  # 得到预测值y 这里返回的一个带有概率值的一维矩阵 如[0.2, 0.5, 0.3]loss = criterion(y_pr, y)  # 将预测的y与真实的y带入损失函数计算损失值 注意这里第一个参数需要是概率值即网络的最后一层输出 第二个参数需要是标签的索引值loss.backward()  # 后向传播 从输出根据链式求导法则求损失函数对于各个模型参数的偏导,以更新各模型参数的过程optimizer.step()  # 沿梯度下降方向更新所有参数# 测试训练结果return eva(test_df.values, net)if __name__ == '__main__':a = []for i in tqdm.tqdm(range(100)):  # 将总的训练时常分为100份acc = train()a.append(acc)print(np.average(np.array(a)))
from chapter1 import data_download_and_load as ddal  # 数据下载

代码模块如下:

import pandas as pd  # 科学计算库 数据基本结构为DataFrame
from sklearn import datasets  # 机器学习库
from data_set import filepaths as fp
from os import path as osp
import numpy as np
from utils import osUtils as oU
import randomBOSTON_CSV = osp.join(fp.BOSTON_DIR, 'boston.csv')
IRIS_CSV = osp.join(fp.IRIS_DIR, 'iris.csv')
ML100K_TSV = osp.join(fp.ML100K_DIR, 'rating_index.tsv')# 将下载的数据转化为DataFrame格式(pandas所用的格式)
def sklearn_to_df(sklearn_dataset):df = pd.DataFrame(sklearn_dataset.data, columns=sklearn_dataset.feature_names)df['target'] = pd.Series(sklearn_dataset.target)return df# 下载波士顿房价数据及格式转换
def download_boston():boston = datasets.load_boston()  # 从datasets数据库里下载波士顿房价数据df = sklearn_to_df(boston)  # 将下载的数据转化为DataFrame格式(pandas所用的格式)print(df)df.to_csv(BOSTON_CSV)  # 将DataFrame格式转化为excel可读的csv格式# 读取波士顿房价csv文件并转化为pandas所用的DataFrame格式
def load_boston():return pd.read_csv(BOSTON_CSV, index_col=0, dtype=np.float32)# 下载鸢尾花数据及格式转化
def download_iris():iris = datasets.load_iris()df = sklearn_to_df(iris)df.to_csv(IRIS_CSV)# # 读取鸢尾花csv文件并转化为pandas所用的DataFrame格式
def load_iris():return pd.read_csv(IRIS_CSV, index_col=0, dtype=np.float32)# 将数据划为为训练集和测试集
def split_train_test_from_df(df, test_ratio=0.2):  # 指定测试集的百分比test_df = df.sample(frac=test_ratio)  # 在数据集里面采样20%作为测试集train_df = df[~df.index.isin(test_df.index)]  # 其余的为训练集return train_df, test_dfdef read_rec_data(path=ML100K_TSV, test_ratio=0.2):user_set, item_set = set(), set()triples = []for u, i, r in oU.readTriple(path):user_set.add(int(u))item_set.add(int(i))triples.append((int(u), int(i), int(r)))test_set = random.sample(triples, int(len(triples)*test_ratio))train_set = list(set(triples)-set(test_set))# 返回用户集合列表,物品集合列表,与用户,物品,评分三元组列表return list(user_set), list(item_set), train_set, test_setif __name__ == '__main__':download_boston()

数据集一共150条训练数据,训练集:测试集=4:1,共3个分类
训练了20个epoch,batch_size = 8, lr = 0.01
单层网络训练结果如下:

多层网络训练结果如下:

可以看出,明显在多层网络下的效果要比单层网络效果好,不过相应的多层网络下训练的时间也会随之增长。

更多推荐

5 MLP版本的鸢尾花分类任务

本文发布于:2024-02-11 02:48:39,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1678717.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:版本   鸢尾花   MLP

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!