“”"
作者:lds
整个实验运行时涉及的一些自定义方法
包括数据获取、网络初始化、网络训练、网络测试以及交叉验证
“”"
import pandas as pd
import numpy as np
import Visualization as v
import time
import torch as t
import torch.nn as nn
import scipy.io
import net as classifier
import torch.optim as opt
def init(model):
“”"
训练前对模型权重进行初始化
:param model: 训练模型
“”"
for m in model.modules():
if isinstance(m, nn.Linear):
nn.init.xavier_uniform_(m.weight) ##这里调用xavier_uniform初始化函数
def train(train_ds, train_ls, model, criterion, optimizer, epochs=20):
“”"
训练模型
:param train_ds: 训练数据
:param train_ls: 训练标签
:param model: 训练模型
:param criterion: 损失函数
:param optimizer: 优化算法
:param epochs: 迭代次数
:return: 训练损失值
“”"
t_loss_list = []
train_correct = 0
将训练集迁移到GPU上
train_ds = train_ds.cuda()
train_ls = train_ls.cuda()
model = model.cuda()
init(model)
for epoch in range(epochs-1):
model.train()
每次训练前梯度置零
optimizer.zero_grad()
正向传播
output = model(train_ds)
计算损失值
train_loss = criterion(output, train_ls.squeeze())
反向传播,计算梯度
train_loss.backward()
更新参数
optimizer.step()
t_loss_list.append(train_loss.item())
获取预测值
predict = output.max(1, keepdim=True)[1]
统计预测正确个数
train_correct += predict.eq(train_ls.view_as(predict)).sum().item()
计算准确率
train_accuracy = train_correct / train_ds.shape[0]
print(“Train loss: {:.3f}”.format(train_loss.item()))
print(“Train Accuracy:{:.2f}%”.format(train_accuracy*100))
return train_loss.item(), train_accuracy, t_loss_list
def for_test(test_ds, test_ls, model, criterion):
“”"
测试模型
:param test_ds: 测试数据
:param test_ls: 测试标签
:param model: 测试模型
:param criterion: 损失函数
:return: 测试损失值,测试准确度
“”"
将测试数据迁移到GPU上
test_ds = test_ds.cuda()
test_ls = test_ls.cuda()
model = model.eval()
correct = 0
with t.no_grad():
使用训练好的模型测试
output = model(test_ds)
计算测试集损失函数
test_loss = criterion(output, test_ls.squeeze())
获取预测值
predict = output.max(1, keepdim=True)[1]
统计预测正确个数
correct += predict.eq(test_ls.view_as(predict)).sum().item()
计算准确率
accuracy = correct / test_ds.shape[0]
print(“Test loss: {:.3f}”.format(test_loss.item()))
print(“Test Accuracy:{:.2f}%”.format(accu