import torch
import torchvision
# from torch.utils.tensorboard import SummaryWriter
from torch.utils.tensorboard.writer import SummaryWriter
# from tensorboardX import SummaryWriter
from dataset import MyDataset
from model import *
from torch import nn
# 准备数据集
from torch.utils.data import DataLoader
from torchvision import transforms as T
print("算法1,自定义卷积神经网络,使用十折交叉检验")
transform = T.Compose([
T.Resize(32), # 缩放图片(Image),保持长宽比不变,最短边为224像素
T.CenterCrop(32), # 从图片中间切出224*224的图片
T.ToTensor(), # 将图片(Image)转成Tensor,归一化至[0, 1]
T.Normalize(mean=[0.560, 0.550, 0.494], std=[0.203, 0.196, 0.193]) # 标准化至[-1, 1],规定均值和标准差
])
myData = MyDataset("/Users/zhengxiaozhu/Desktop/MachineLearning/FinalExam/dataset/dataset_all",
transform=transform) # 读到的这个文件夹一定要是直接包含了所有数据集或者所有测试集的文件夹
# length 长度
train_data_size = 180
test_data_size = 20
# 利用 DataLoader 来加载数据集
myDataloader = DataLoader(myData, batch_size=4, shuffle=True)
# 数据加载完毕
# 创建网络模型
model = Model()
# 损失函数
loss_fn = nn.CrossEntropyLoss() # 交叉熵
# 优化器
learning_rate = 0.01
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate) # 优化器选择随机梯度下降优化器,model.parameters()是我们的模型参数
# 设置训练网络的一些参数
# 记录训练的次数
total_train_step = 0
# 记录测试的次数
total_test_step = 0
# 训练的轮数
epoch = 10
# 添加tensorboard
writer = SummaryWriter("logs")
for i in range(epoch):
print("-------第 {} 轮训练开始-------".format(i + 1))
# print("本轮测试集的下标是:%d~%d,%d~%d" % (12 * i, 12 * (i + 1), 8 * (24 - i), 8 * (25 - i)))
# 训练步骤开始
model.train()
count = -1
for data in myDataloader: # 在本轮中,对每一个数据进行处理
count = count + 1 # count用来统计已经读取了多少个data(总共应该有200/4=50个),初值为0,每读取一个data,count值+1
if i * 3 <= count < (i + 1) * 3 or (24 - i) * 2 <= count < (25 - i) * 2: # 跳过这些样本,因为这些样本要作为测试集。
# print("跳过测试集", count)
continue
# 每轮作为测试集的样本下标分别是:[0~12,192~200][12~24,184~192]...[108~120,120~128],即头取12个,尾取8个
# 由于每个data里面包含四个样本,所以对应的count值应该是:[0~3,48~50][3~6,46~48]...[27~30,30~32]
imgs, targets = data
outputs = model(imgs)
loss = loss_fn(outputs, targets) # 计算损失函数
# 优化器优化模型
optimizer.zero_grad() # 梯度清零
loss.backward() # 反向传播
optimizer.step() # 利用刚刚得到的grad来进行优化
total_train_step = total_train_step + 1
if total_train_step % 100 == 0: # 只有训练的次数是100的倍数时才输出一次,这样输出的信息不会那么多
print("训练次数:{}, Loss: {}".format(total_train_step, loss.item()))
writer.add_scalar("train_loss", loss.item(), total_train_step) # 画图,标题:train_loss,y轴:,x轴
# print("-------第 {} 轮训练结束,开始测试-------".format(i + 1))
# 测试步骤开始(每轮训练都做一次测试,确保程序在跑,以及精度在逐渐提高)
model.eval()
total_test_loss = 0 # 将测试集上的误差初始化
total_accuracy = 0 # 将测试集上的精度初始化
TP = 0
FN = 0
FP = 0
TN = 0
with torch.no_grad(): # 不需要调整梯度,也不需要用梯度来优化
count = -1
for data in myDataloader:
count = count + 1 # count用来统计已经读取了多少个data,每读取一个data,count值+1
if not (i * 3 <= count < (i + 1) * 3 or (24 - i) * 2 <= count < (25 - i) * 2): # 跳过不是测试集的样本
continue
# print("测试:",count)
imgs, targets = data
outputs = model(imgs)
loss = loss_fn(outputs, targets) # 计算损失函数
total_test_loss = total_test_loss + loss.item() # 误差值累加
accuracy = (outputs.argmax(1) == targets).sum() # 精度值累加
total_accuracy = total_accuracy + accuracy
# if i + 1 == 10:
for j in range(4):
p = outputs.argmax(1)[j]
y = targets[j]
if p == 1 and y == 1:
TP = TP + 1
elif p == 1 and y == 0:
FP = FP + 1
elif p == 0 and y == 0:
TN = TN + 1
elif p == 0 and y == 1:
FN = FN + 1
print("整体测试集上的Loss: {}".format(total_test_loss))
print("整体测试集上的正确率: {}".format(total_accuracy / test_data_size))
print("TP:", TP, "FP:", FP, "TN:", TN, "FN:", FN)
writer.add_scalar("test_loss", total_test_loss, total_test_step) # 画图
writer.add_scalar("test_accuracy", total_accuracy / test_data_size, total_test_step) # 画图
total_test_step = total_test_step + 1
# torch.save(model, "model_{}.pth".format(i)) # 用文件名为model_XX.pth的文件来保存每一轮训练出来的模型
writer.close()
# 打开 tensorboard:在terminal里面输入 tensorboard --logdir "/Users/zhengxiaozhu/PycharmProjects/pythonProject_pytorch/A1_2/logs"
ml大作业代码.zip
需积分: 0 153 浏览量
更新于2023-05-25
收藏 60KB ZIP 举报
标题中的"ml大作业代码.zip"表明这是一个与机器学习(Machine Learning, ML)相关的课程作业,其中包含了使用Python编程语言和PyTorch框架编写的代码。PyTorch是目前广泛应用于深度学习领域的开源库,它提供了强大的计算工具,支持动态计算图,便于模型的构建、训练和调试。
在描述中,我们同样看到"ml大作业代码.zip",这确认了压缩文件的内容是关于机器学习的代码。通常,这样的作业可能包括数据预处理、模型构建、训练、验证和测试等步骤,涉及到许多机器学习的基本概念和技术。
由于标签为空,我们无法获得更多的分类信息,但根据文件名"pythonProject_pytorch",我们可以推断这个项目是使用Python编程语言,并且主要基于PyTorch框架进行的。在Python中,PyTorch通常用于实现神经网络,进行监督学习、无监督学习或强化学习任务。项目可能涵盖了以下几个方面的知识点:
1. **数据预处理**:在机器学习中,数据预处理是至关重要的一步,包括数据清洗、缺失值处理、标准化、归一化、特征选择和编码等。
2. **PyTorch基础**:理解Tensor的概念,它是PyTorch的核心数据结构,用于存储和操作多维数组。此外,还包括运算符、张量操作、自动梯度机制等。
3. **构建神经网络**:使用`torch.nn.Module`来定义自定义的神经网络架构,包括卷积神经网络(CNN)、循环神经网络(RNN)、长短时记忆网络(LSTM)或者Transformer等。
4. **优化器**:如Adam、SGD等,用于调整网络权重以最小化损失函数。
5. **损失函数**:如交叉熵损失、均方误差损失等,衡量模型预测与真实结果的差距。
6. **训练过程**:包含前向传播、反向传播、损失计算和权重更新。
7. **模型保存与加载**:使用`torch.save()`和`torch.load()`来保存和恢复模型权重,以便于后续使用或继续训练。
8. **数据加载器**:`torch.utils.data.DataLoader`用于批量加载和预处理数据,加速训练过程。
9. **模型评估**:计算模型在验证集或测试集上的性能指标,如准确率、精确率、召回率、F1分数等。
10. **可视化工具**:如TensorBoardX,可以用来监控训练过程中的损失和指标变化。
这个Python项目涵盖了机器学习的基础知识,特别是深度学习中使用PyTorch的相关技能。通过研究和理解这些代码,学生可以深入学习机器学习模型的构建、训练和优化过程,以及如何利用PyTorch这一强大工具来实现。

尛小
- 粉丝: 0
最新资源
- 争议电气自动化控制技术在电力系统中的应用.docx
- 园区网络设计.doc完成版.doc新版.doc
- java面向对象编程继承.ppt
- 大型园区网络设计方案.doc
- 石家庄市创建国家电子商务示范城市的路径和保障措施.doc
- 电子商务下的现代物流.doc
- IFELSE条件语句翻译程序设计方案(LR方法输出元式).doc
- 对互联网+背景下乌拉街满族风情游的发展研究.docx
- 计算机应用基础课程的慕课建设初探.docx
- 大数据时代下企业税务会计面临的挑战与对策.docx
- java课程设计方案Hannoi汉诺塔游戏.doc
- 物业管理软件对比.doc
- 智能分布式馈线自动化技术银川会议.ppt
- ——基于单片机的数字温度计的方案设计书.doc
- 智能家居控系统.doc
- 基于项目化教学的物联网研发人才培养的研究.docx