机器学习自用函数整理

查看模型参数

for parameters in net.parameters():
    print(parameters)

for name,parameters in net.named_parameters():
    print(name,':',parameters.size())

加载模型

#方法一:
torch.save(model.state_dict(), model_name) #保存模型,但只是把训练产生的模型参数存入一个字典

#方法二:
torch.save(model, model_name) #保存模型,提供要保存的模型和模型的名字就可以将其整个保存
#载入模型(方法二)
mymodel_path = "G:\\src\\models\\test"
model = torch.load(mymodel_path)

#载入模型(方法一)
mymodel_path = "G:\\src\\models\\test"
m_state_dict = torch.load(mymodel_path)
model = BiLSTM_CRF(                           #仅更新模型的参数
    vocab_size=len(word_to_id),
    tag_to_ix=tag_to_id,
    embedding_dim=parameters["word_dim"],
    hidden_dim=parameters["word_lstm_dim"],
    use_gpu=use_gpu,
    char_to_ix=char_to_id,
    pre_word_embeds=word_embeds,
    use_crf=parameters["crf"],
    char_mode=parameters["char_mode"],
)
model.load_state_dict(m_state_dict)

转化问题

#list 转 numpy
ndarray = np.array(list)


#numpy 转 list
list = ndarray.tolist()

#list 转 torch.Tensor
tensor=torch.Tensor(list)

#torch.Tensor 转 list
先转numpy,后转list
list = tensor.numpy().tolist()


#torch.Tensor 转 numpy
ndarray = tensor.numpy()
*gpu上的tensor不能直接转为numpy
ndarray = tensor.cpu().numpy()


#numpy 转 torch.Tensor
tensor = torch.from_numpy(ndarray) 

使用自己的数据集

利用dataset和DataLOader函数

  1. 无标签数据
import torch
import torch.nn as nn
import os
import numpy as np
import torchvision
from torch.utils.data import DataLoader
from torchvision.utils import save_image
from torch.utils import data
from torchvision import datasets
import torchvision.transforms as transforms
from PIL import Image

#图片路径/文本路径(仅包含图片名称)
img_path="./face/rem_fakes"
txt_path="./face/1.txt"
#重写Dataset类
class imgDataset(data.Dataset):
    def __init__(self, img_path, txt_path ,transform=None ):
        with open(txt_path,'r') as f:
            lines = f.readlines()
            self.img_list = [os.path.join(img_path, i.split()[0]) for i in lines]
            self.transform = transform
    def __getitem__(self,index): #遍历0~len(self.img_list)个图片
        img_path = self.img_list[index]
        img = Image.open(img_path).convert('RGB')#转成Image格式
        if self.transform is not None:
            img = self.transform(img)
        return img
    def __len__(self):
        return len(self.img_list)
#转化图片类型        
mytransform = transforms.Compose([
    transforms.Resize((28,28)),
    transforms.ToTensor()
])
#加载数据
dataloader = DataLoader(
    imgDataset(img_path, txt_path ,transform = mytransform),
    batch_size = 32,
    shuffle = True
)
#查看数据
for i,img in enumerate(dataloader):
    save_image(img,"./face/rem_fakes/a1.png")
    break
  1. 有标签数据
import torch
import torch.nn as nn
import os
import numpy as np
import torchvision
from torch.utils.data import DataLoader
from torchvision.utils import save_image
from torch.utils import data
from torchvision import datasets
import torchvision.transforms as transforms
from PIL import Image

#图片路径/文本路径(包含图片名称和label)
img_path="./test_dataset/train"
txt_path="./test_dataset/train.txt"
#重写Dataset类
class imgDataset(data.Dataset):
    def __init__(self, img_path, txt_path ,transform=None ):
        with open(txt_path,'r') as f:
            lines = f.readlines()
            self.img_list = [os.path.join(img_path, i.split()[0]) for i in lines]
            self.label_list = [i.split()[1] for i in lines]
            self.transform = transform
    def __getitem__(self,index): #遍历0~len(self.img_list)个图片
        img_path = self.img_list[index]
        label = self.label_list[index]
        img = Image.open(img_path).convert('RGB')#转成Image格式
        if self.transform is not None:
            img = self.transform(img)
        return img,label
    def __len__(self):
        return len(self.img_list)
#转化图片类型        
mytransform = transforms.Compose([
    transforms.Resize((28,28)),
    transforms.ToTensor()
])
#加载数据
dataloader = DataLoader(
    imgDataset(img_path, txt_path ,transform = mytransform),
    batch_size = 2,
    shuffle = True
)
#查看数据
for i,(img,label) in enumerate(dataloader):
    print(label)
    save_image(img,"./test_dataset/a1.png")
    break

模型设置参数


import argparse


parser = argparse.ArgumentParser()
parser.add_argument("--n_epochs", type=int, default=200, help="number of epochs of training")
parser.add_argument("--batch_size", type=int, default=64, help="size of the batches")
parser.add_argument("--lr", type=float, default=0.0002, help="adam: learning rate")
parser.add_argument("--b1", type=float, default=0.5, help="adam: decay of first order momentum of gradient")
parser.add_argument("--b2", type=float, default=0.999, help="adam: decay of first order momentum of gradient")
parser.add_argument("--n_cpu", type=int, default=8, help="number of cpu threads to use during batch generation")
parser.add_argument("--latent_dim", type=int, default=100, help="dimensionality of the latent space")
parser.add_argument("--img_size", type=int, default=28, help="size of each image dimension")
parser.add_argument("--channels", type=int, default=1, help="number of image channels")
parser.add_argument("--sample_interval", type=int, default=400, help="interval betwen image samples")
opt = parser.parse_args([])
print(opt)
使用参数时直接opt.***    (opt.img_size)

数据集划分

整条的数据集划分

import random
def randSplit(dataSet,rate):
    l = list(dataSet.index)
    random.shuffle(l)
    dataSet.index = l
    n = dataSet.shape[0]
    m = int(n*rate)
    train = dataSet.loc[range(m),:]
    test = dataSet.loc[range(m,n),:]
    dataSet.index = range(dataSet.shape[0])
    test.index = range(test.shape[0])
    return train, test

特征值和目标值分离的数据集划分

#划分数据集和测试集 ,划分数据集随机划分数据
from sklearn.model_selection import train_test_split
Xtrain, Xtest, Ytrain, Ytest = train_test_split(X, Y, test_size=0.25)

数据按batch_size分组

注意 这里DataLoader里的数据类型一定是tensor

import torch as nn
import numpy as np
import torch.utils.data as Data
import pandas as pd

train_set = pd.read_csv('ratings.csv',encoding='utf-8')
train_set = np.array(train_set)#将DataFrame转成array
mytensor = nn.tensor(train_set)#将array转换tensor

loader = Data.DataLoader(dataset = train_set,batch_size = 10,shuffle = False)#batch_size分组
#第一种遍历
for i,data in enumerate(loader):#遍历
    print(data)
# 第二种遍历
for b in iter(dl_train):
    print(b[0], b[1])
    break

DataLoader参数:
在这里插入图片描述

读取数据

Pandas读取文件(read_csv与read_table 的区别)

在这里插入图片描述

数据清洗

data.info()#数据信息
data.isnull().sum()#查看缺失值
data.drop(['Name','Cabin','Ticket'],inplace=True,axis=1)#删除缺失值多,目测对建模没有用的列
data = data.dropna()#把Nan去除
data["Age"] = data["Age"].fillna(data["Age"].mean())#Age列的NaN填充Age平均值
data= data.fillna(method='ffill')#在列方向上以前一个值作为值赋给NaN
data["Sex"] = (data["Sex"]=='male').astype('int')#将二分类变量转换为数值型变量
#将三分类变量转换为数值型变量
labels = data["Embarked"].unique().tolist()
data["Embarked"] = data["Embarked"].apply(lambda x: labels.index(x))

数据截取

pandas中iloc和loc的区别和用法:

  1. loc函数:通过行索引 “Index” 中的具体值来取行数据(如取"Index"为"A"的行)
data.loc['b','B']#获取第二行、第二列对应的值

data.loc['b':'c','B':'C']#获取从第二行开始。第二列开始的右下角区域的值
  1. iloc函数:通过行号来取行数据(如取第二行的数据)
data.iloc[1,1]#获取第二行、第二列的值
 
data.iloc[1:3,1:3]#获取从第二行,第二列开始对应的右下角的区域

随机种子

numpy版本

同一堆种子每次运行得到的随机数都一样

np.random.seed(1)#第一堆种子
a= np.random.randn(5)
np.random.seed(1)#第一堆种子
b= np.random.randn(5)
print(a)
print(b)

在这里插入图片描述
在这里插入图片描述
torch版本
在这里插入图片描述

torch.manual_seed(10)
print(torch.rand(6))
torch.manual_seed(10)
print(torch.rand(6))
torch.manual_seed(10)
print(torch.rand(6))

在这里插入图片描述
在这里插入图片描述

稀疏矩阵

indptr = np.array([0, 2, 3, 6])
indices = np.array([0, 2, 2, 0, 1, 2])
data = np.array([1, 2, 3, 4, 5, 6])
csr_matrix((data, indices, indptr), shape=(3, 3)).toarray()

array([[1, 0, 2],
       [0, 0, 3],
       [4, 5, 6]])

在这里插入图片描述

快速读取文件中图片名字

快速读取文件中图片名字

训练进度API

在这里插入图片描述

from tqdm import tqdm

dataloader = torch.utils.data.DataLoader...
...
for epoch in range(opt.n_epochs):
    loop = tqdm(enumerate(dataloader), total =len(dataloader))
    for i, (imgs, _) in loop:
        ...
       loop.set_description(f'Epoch [{epoch}/{opt.n_epochs}]')
       loop.set_postfix(d_loss= d_loss.item(),g_loss= g_loss.item())

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aaHua_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值