本文介绍: 参考Train# train文件主要是训练模型,主要步骤有:# 1、导入必要的包# 2、设置参数# 3、读入数据预处理# 4、开始训练打印错误和准确率# 5、保存模型,并给出提示import torchimport pandas as pdfrom torchvision import datasetsfrom torch.autograd import VariableLOSS_TYPE = ‘MSELoss‘METHOD = ‘alex‘EPOCHS = 400BA

一、声明

非常感谢这些资料作者
【参考1】【PyTorch速成教程 (by Sung Kim)】

二、工程结构

├── main.py实现训练 (train) 、验证(validation)和测试(test)
│ ├── model.py:实现的模型
│ ├── dataset.py加载数据
│ ├── utils.py:常用功能

三、文件内容

main.py

from torch.utils.data import Dataset, DataLoader
from torch import from_numpy, tensor
from torch.autograd import Variable
import numpy as np
import model
import utils

# load data
dataset = MyDataset()
train_loader = DataLoader(dataset=dataset, batch_size=32, shuffle=True, num_workers=2)

# model
model=Model()

# define loss and optimizer
criterion=torch.nn.BCELoss(size_average=True)
optimizer=torch.optim.SGD(model.parameters(),lr=0.1)

# train
for epoch in range(2):
    for i, data in enumerate(train_loader, 0):
        # get the inputs
        inputs, labels = data

        # wrap them in Variable
        inputs, labels = Variable(inputs), Variable(labels)
		
		# Forward pass
		y_pred=model(inputs)
		
		# Compute and print loss
		loss=criterion(y_pred,labels)
		accuracy= ultis.accuracy(y_pred,labels)
		print("[{:05d}/{:05d}] train_loss:{:.4f} accuracy: {:.4f}]".format(
				i,epoch,loss.data[0],accuracy))
		
		# update
		optimizer.zero_grad()	# zero gradients
		loss.backward()			# perform a backward pass
		optimizer.step() 		# update weight or parameters

model.py

import torch
class Model(torch.nn.Module):
	def __init__(self):
		super(Model,self).__init__()
		self.l1=torch.nn.Linear(8,6)
		self.l2=torch.nn.Linear(6,4)
		self.l3=torch.nn.Linear(4,1)
		self.sigmoid=torch.nn.Sigmoid()

	# 数据流
	def forward(self,x):
		out1=self.sigmoid(self.l1(x))
		out2=self.sigmoid(self.l2(out1))
		y_pred=self.sigmoid(self.l3(out2))
		return y_pred

dataset.py

要点
(1)必须重载 __getitem____len__
(2)

import torch
from torch.utils.data import Dataset, DataLoader
class MyDataset(Dataset):
    def __init__(self):  # Initialize your data, download, etc.
        xy = np.loadtxt('./data/diabetes.csv.gz', delimiter=',', dtype=np.float32)
        self.len = xy.shape[0]
        self.x_data = torch.from_numpy(xy[:, 0:-1])
        self.y_data = torch.from_numpy(xy[:, [-1]])

    def __getitem__(self, index):
        return self.x_data[index], self.y_data[index]

    def __len__(self):
        return self.len

utils.py

import numpy as np
import scipy.sparse as sp
import torch
import os

def encode_onehot(labels):
    classes = set(labels)
    classes_dict = {c: np.identity(len(classes))[i, :] for i, c in
                    enumerate(classes)}
    labels_onehot = np.array(list(map(classes_dict.get, labels)),
                             dtype=np.int32)
    return labels_onehot

def accuracy(output, labels):
    preds = output.max(1)[1].type_as(labels)
    correct = preds.eq(labels).double()
    correct = correct.sum()
    return correct / len(labels)

def list_all_files(rootdir):
    _files = []

    #列出文件夹下所有的目录文件
    list_file = os.listdir(rootdir)
    
    for i in range(0,len(list_file)):

        # 构造路径
        path = os.path.join(rootdir,list_file[i])

        # 判断路径是否是一个文件目录或者文件
        # 如果是文件目录,继续递归        
        if os.path.isdir(path):
            _files.extend(list_all_files(path))
        if os.path.isfile(path):
             _files.append(path)
    return _files

def mkdir(path):
    # 去除首位空格
    path=path.strip()
    # 去除尾部  符号
    path=path.rstrip("\")
 
    # 判断路径是否存在
    # 存在     True
    # 不存在   False
    isExists=os.path.exists(path)
 
    # 判断结果
    if not isExists:
        # 如果不存在创建目录
        # 创建目录操作函数
        os.makedirs(path) 
        print(path+' create sucess')
        return True
    else:
        # 如果目录存在则不创建,并提示目录存在
        print(path+' path exist !')
        return False

四、问题汇总

dataset.py中__getitem__返回的是一个元素,还是一个batch数据

原文地址:https://blog.csdn.net/i13270752870/article/details/121093682

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_14379.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注