# -*- coding: utf-8 -*-
"""
Created on Thu Apr 8 10:24:08 2021
@author: nkliu
"""
############加载torch & 去除随机性####
import torch
import random
import numpy as np
import os
import math
from skimage import io
from torch import nn
seed = 0
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
###############
labels={"airplane":0,"automobile":1,"bird":2,"cat":3,"deer":4,"dog":5,"frog":6,"horse":7,"ship":8,"truck":9}
def load_img(file,img_name):
label = torch.tensor([labels[img_name[img_name.find("_") + 1:img_name.find(".")]]])
img = torch.from_numpy( np.expand_dims(np.transpose(io.imread(file + "\\" + img_name).astype(np.float32),(2,1,0)),0))
return label,img
def load_imgs(file,img_list):
datas=[]
for img_name in img_list:
datas.append(load_img(file,img_name))
return datas
def load_data(file,batch_num):
data=[]
data_name=os.listdir(file)
random.shuffle(data_name)
data_number=len(data_name)
len_per_batch=math.ceil(data_number/batch_num)
extra_num=data_number-len_per_batch*batch_num
index=[]
#将多余的数据随机分到各个batch中
for i in range(extra_num):
index.append(1)
for i in range(batch_num-extra_num):
index.append(0)
random.shuffle(index)
#将img分配到batch中
start=0
end=start+batch_num+index[0]
for i in range(batch_num):
batch=data_name[start:end]
start=end
if(i!=(batch_num-1)):
end=end+batch_num+index[i]
data.append(load_imgs(file,batch))
return data
###################数据加载##########
# def load_data():
# # N是批大小;D是输入维度
# # H是隐藏层维度;D_out是输出维度
# N, D_in, H, D_out = 64, 1000, 100, 10 # 产生随机输入和输出张量
# x = torch.randn(N, D_in)
# y = torch.randn(N, D_out)
# return N, D_in, H, D_out, x, y
####################模型定义##########
def define_model(H):
# 使用torch.nn.Sequential定义序列化模型
# 一般模型定义方法
class Net(torch.nn.Module):
def __init__(self,H):
super(Net,self).__init__()
self.conv1 = nn.Conv2d(3, 10, 3, padding=2)
self.conv2 = nn.Conv2d(10, 30, 3, padding=2)
self.pool = nn.MaxPool2d(2, 2)
self.linear = nn.Linear(2430,10)
def forward(self, x):
x=self.pool(nn.functional.relu(self.conv1(x)))
x=self.pool(nn.functional.relu(self.conv2(x)))
x=x.view(-1,2430)
x=self.linear(nn.functional.relu(x))
return x
net = Net(H)
return net
################损失函数定义#########
def define_loss():
Loss = torch.nn.CrossEntropyLoss()
return Loss
##############优化器定义#############
def define_optimizer():
learning_rate = 1e-5
optimizer = torch.optim.Adam(net.parameters(), lr=learning_rate)
return optimizer
###################模型训练#########
def train(file, H, batch_num):
net = define_model(H)
Loss = torch.nn.CrossEntropyLoss()
learning_rate = 1e-5
optimizer = torch.optim.Adam(net.parameters(), lr=learning_rate)
datas=load_data(file,batch_num)
for t in range(100):
for k in range(batch_num):
data_in_batch=datas[k]
for j in range(len(data_in_batch)):
x=data_in_batch[j][1]
y=data_in_batch[j][0]
y_pred = net(x) # 前向传播:通过像模型输入x计算预测的y
loss = Loss(y_pred, y) # 计算loss
optimizer.zero_grad() # 在反向传播之前,使用optimizer将它要更新的所有张量的梯度清零
loss.backward() # 反向传播:根据模型的参数计算loss的梯度
optimizer.step() # 调用Optimizer的step函数使它所有参数更新
if((t+1)%10==0):
print("第{}次, 损失函数为 {}".format(t + 1, loss.item()))
y_pred = net(x) # 前向传播:通过像模型输入x计算预测的y
loss = Loss(y_pred, y) # 计算loss
print("训练完成, 损失函数为 {}".format(loss.item()))
## 查看网络参数
#for name, parameters in net.named_parameters():
# print(name, ':', parameters.size(), ',', parameters.mean().item())
net_path = 'net.pth'
torch.save(net.state_dict(), net_path)
return net_path
###################模型测试#########
def test(file, net_path,H):
net = define_model(H)
net.load_state_dict(torch.load(net_path)) # 再加载模型参数
test_datas=load_imgs(file,os.listdir(file))
total=0
correct=0
with torch.no_grad():
for data in test_datas:
label,img = data
outputs = net(img)
_, pre = torch.max(outputs.data, 1)
total += 1
correct += (pre == label).item()
print("accuracy:{}".format(100 * correct / total))
if __name__ == '__main__':
H=20
batch_num=10
net_path = train("cifar\\train", H,10)
test("cifar\\test", net_path,H)
神经网络cifar10 简单预测
需积分: 0 82 浏览量
更新于2023-02-01
收藏 167.47MB RAR 举报
在IT领域,特别是计算机视觉和人工智能分支,CIFAR-10数据集是常见的基准测试集,用于训练和评估各种图像识别模型。本项目聚焦于使用神经网络对CIFAR-10数据集进行简单的预测任务,这涉及到深度学习的基本概念和技术。
CIFAR-10是一个广泛使用的彩色图像数据集,包含10个类别,每个类别有6000张32x32像素的图像,其中5000张用于训练,1000张用于测试。这些类别包括飞机、汽车、鸟类、猫、鹿、狗、青蛙、船和卡车。这个数据集对于初学者理解深度学习模型和训练过程非常友好,同时也能对成熟的方法进行挑战。
神经网络,尤其是卷积神经网络(CNN),在处理图像识别问题上表现出色。CNN利用卷积层来检测图像中的特征,如边缘、颜色和纹理,通过池化层减少计算量并保持模型的大小,以及全连接层将这些特征映射到最终的类别概率。在本项目中,可能会采用预训练的模型,如VGG、ResNet或AlexNet,或者构建一个简单的自定义CNN结构。
训练神经网络通常包括以下步骤:
1. 数据预处理:对CIFAR-10数据集进行归一化,将像素值调整到0到1之间,有时还需要进行数据增强,如随机翻转、旋转以增加模型的泛化能力。
2. 模型构建:设计CNN架构,包括选择合适的卷积层、池化层、激活函数(如ReLU)、Dropout等,以及最后的全连接层和Softmax层,用于分类。
3. 编译模型:设置损失函数(如交叉熵)和优化器(如Adam或SGD),并可能指定学习率调度策略。
4. 训练模型:使用训练集对模型进行迭代训练,监控训练和验证集的损失与准确率,防止过拟合。
5. 评估模型:在测试集上评估模型性能,查看准确率和混淆矩阵,了解模型在不同类别的表现。
6. 调优:根据模型性能进行参数调整,可能包括增加网络深度、改变学习率、调整正则化强度等。
项目中的“cifar10_torch”可能表示使用PyTorch框架实现。PyTorch是一个流行的深度学习库,提供动态计算图和灵活的API,便于构建和训练神经网络模型。使用PyTorch,可以轻松地定义网络结构,加载数据集,训练模型,并保存模型权重以便后续使用。
总结来说,这个项目涉及了深度学习的核心概念,包括神经网络设计、卷积神经网络、数据预处理、模型训练、评估和调优,以及利用PyTorch这一强大的工具实现。通过这个项目,可以深入理解计算机视觉领域的基本方法,以及如何运用人工智能技术解决实际问题。
奥卡姆剃刀_Jab
- 粉丝: 1558
- 资源: 5
最新资源
- 142-西门子S7-1200机器人码垛机程序和1200立体库及码垛机等三个程序案例,程序带注释 ,程序结构清楚明了,注释齐全 涉及到变频器,触摸屏,工业机器人,视觉相机的程序控制.modbus tc
- 三菱plc恒压供水程序+威纶触摸屏程序本成已用于实际项目中 可以直接上载制成产品 也可用来学习plc恒压供水程序学习 三菱PLC恒压供水程序说明 本程序采用三菱FX1N-30MR PLC 配威纶通
- 一种自动扫码设备sw18可编辑全套技术资料100%好用.zip
- JAVA GIS开发测试使用的样例文件
- 基于web的校园二手商品交易平台的设计与实现毕业设计论文.doc
- SAE J1772-2024.关于电动汽车(EV)和插电式混合动力汽车(PHEV)传导充电耦合器的标准
- 不同颜色球体检测24-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- 基于javaweb的新生报到管理系统毕业设计论文.doc
- 基于java的信用卡WEB管理系统设计与制作毕业设计论文.doc
- C++题库期末考试整理选择填空判断问答
- 【未发表】基于阿基米德优化算法AOA优化核极限学习机KELM实现风电数据预测算法研究附Matlab代码.rar
- 【未发表】基于阿基米德优化算法AOA优化集成学习的核极限学习机KELM-Adaboost实现风电数据预测算法研究附Matlab代码.rar
- 【未发表】基于阿基米德优化算法AOA优化核极限学习机KELM实现风电数据时序预测算法研究附Matlab代码.rar
- 【未发表】基于矮猫鼬优化算法DMOA优化核极限学习机KELM实现风电数据预测算法研究附Matlab代码.rar
- 【未发表】基于矮猫鼬优化算法DMOA优化核极限学习机KELM实现风电数据时序预测算法研究附Matlab代码.rar
- 【未发表】基于阿基米德优化算法AOA优化鲁棒极限学习机RELM实现风电数据时序预测算法研究附Matlab代码.rar