11.25 深度学习-pytorch模型组件
import torch
import os
import cv2
from PIL import Image
import numpy as np
import pandas as pd
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import Dataset,DataLoader
# PyTorch已内置多种损失函数,在构建神经网络时随用随取!
def loss_func():
# 均分误差 自动计算 均方误差 这里直接算出来均分误差就可以反向传播了
# nn.MSELoss()
torch.manual_seed(666)
y_ture=torch.rand(3,3,dtype=torch.float32)
torch.manual_seed(6)
y_ture=torch.rand(3,3,dtype=torch.float32)
loss1=nn.MSELoss(y_ture,y_ture) # 传入预测的y,和真实的y
print(loss1)
pass
# 线性层组件
# 建一个简单的线性层,后续还有卷积层、池化层、激活、归一化等需要我们去学习和使用...
# nn.Linear(20, 60) 传参 输入的特征数量 输出的特征数量 bias 是否有截距 DEVICE 设备
def linear_func():
# 自动初始化w 和算预测的值
model1=nn.Linear(4,1) # 代表 w1+w2+w3+w4=y 输出的是y的值 这个会自动 初始化W 只是看不到 相当于 初始化了W 并且算了一个值 为预测的值 不是真实的值
# 优化器方法
# import torch.optim as optim
# - params=model.parameters():模型参数获取;
# - optimizer=optim.SGD(params):优化器方法;
# - optimizer.zero_grad():梯度清零;
# - optimizer.step():参数更新;
def optimizer():
# 先定义假数据
torch.manual_seed(666)
x=torch.rand(30,5,dtype=torch.float32)
torch.manual_seed(6)
y=torch.rand(30,1,dtype=torch.float32)
model1=nn.Linear(5,1) #
# 优化器对象 就是统一对W 进行管理
y_pre=model1(x) # 这里就把x的5个特征变为了一个特征 相当于变为了60,1 跟 y对应上了 实际上是初始化了一组W进行了计算
sgd=optim.SGD(model1.parameters(),lr=0.01) # model1.parameters()能够返回 模型的参数(初始化的W和预测的值) 传给optim.SGD 这里相当于做梯度下降的
# for....
# 损失函数
loss1=nn.MSELoss()
loss=loss1(y_pre,y)
# 清梯度 使用优化器的方法 优化器进行W的统一管理了
sgd.zero_grad()
# 反向传播
loss.backward()
# 参数更新
sgd.step() # 相当于梯度下降
# 到此完成了一次梯度下降 加循环 轮次
# 获得当前的梯度 在model1.item()
# 数据加载器
# 构建数据类
# 在 PyTorch 中,构建自定义数据加载类通常需要继承 torch.utils.data.Dataset 并实现以下几个方法:
# 核心就是让 __getitem__ __len__能够使用访问数据
# 然后使用 torch.utils.data.DataLoader 去小批次训练
"""
1. **\__init__ 方法**
用于初始化数据集对象:通常在这里加载数据,或者定义如何从存储中获取数据的路径和方法。
```python
def __init__(self, data, labels):
self.data = data
self.labels = labels
```
2. **\__len__ 方法**
返回样本数量:需要实现,以便 Dataloader加载器能够知道数据集的大小。
```python
def __len__(self):
return len(self.data)
```
3. **\__getitem__ 方法**
根据索引返回样本:将从数据集中提取一个样本,并可能对样本进行预处理或变换。
```python
def __getitem__(self, index):
sample = self.data[index]
label = self.labels[index]
return sample, label
```
如果你需要进行更多的预处理或数据变换,可以在 **\__getitem__** 方法中添加额外的逻辑。
"""
# 构建继承类 大致结构如下
#
def demo1():
class my_datasets(Dataset):
def __init__(self,data):
# 初始化数据 自己对数据进行处理 加载图片或者文件什么的 去nan标准化 让__len__ __getitem__可以正确的返回数据
super().__init__()
self.data=data
def __len__(self):
return len(self.data)
def __getitem__(self, index):
sample = self.data[index]
label = self.labels[index]
return sample, label
# 使用DataLoader进行小批次训练
data=torch.rand(3,3)
my_datasets1=my_datasets(data)
dataloader = DataLoader(my_datasets1, batch_size=4, shuffle=True) # 传入Dataset继承的对象 批次大小batch_size 是否随机shuffle
# 是一个迭代器 返回x,和y
# 加载csv文件数据
def demo2():
class my_datasets(Dataset):
def __init__(self,path):
super().__init__()
df1=pd.read_csv(path)
# 标签 就是结果 y
self.label=df1["price_range"].to_numpy()
# self.label=torch.from_numpy(label)
self.data= df1.drop(["price_range"],axis=1)
self.data= self.data.to_numpy()
self.len=len(self.data)
self.data=torch.tensor(self.data,dtype=torch.float32)
self.label=torch.tensor(self.label,dtype=torch.float32)
def __len__(self):
return self.len
def __getitem__(self, index):
idx = min(max(index, 0), self.len - 1)
sample=self.data[idx]
label=self.label[idx]
return sample,label
my_datasets1=my_datasets("assets/csv/手机价格预测.csv")
DataLoader1=DataLoader(my_datasets1,batch_size=32)
for x,y in DataLoader1:
print(x.shape)
print(y.shape)
# 加载图像数据集 用到os模块
# os模块的api介绍
# for root, dirs, files in os.walk(folder): root为 传入的文件路径的那个文件夹 dirs是一个列表 为root中有哪些文件夹 files是一个列表 为root中有哪些文件 会一层层文件夹的遍历完
# os.path.split(str) 路径分割 返回 去掉路径的最后一级的str和最后一级
def demo3():
class my_datasets(Dataset):
def __init__(self,path):
self.target_names=[]
img_path=[]
self.target=[]
root_str=[]
self.img_tensor_list=[]
type=0
self.feature_names=["C","H","W"]
for root,dir,files in os.walk(path):
self.target_names.append(dir)
for flie in files:
img_path.append(files)
if len(self.target)==0:
self.target.append(type)
elif root!=root_str[-1]:
type+=1
self.target.append(type)
else:
self.target.append(type)
root_str.append(root)
total_img_path=root+"\\"+flie
img=cv2.imread(total_img_path)
img=cv2.resize(img,(300,300))
img_tensor=torch.from_numpy(img)
img_tensor=img_tensor.permute(2,0,1)
self.img_tensor_list.append(img_tensor)
root_str.append(root)
self.target_names=self.target_names[0]
self.target=np.array(self.target)
self.len=len(img_path)
# print(img_tensor_list[0].shape)
pass
def __len__(self):
return self.len
def __getitem__(self, index):
idx=min(max(index,0),self.len-1)
return self.img_tensor_list[idx],self.target[idx]
my_datasets1=my_datasets("assets/image/animal")
DataLoader1=DataLoader(my_datasets1,16,shuffle=True)
for x,y in DataLoader1:
print(my_datasets1.target_names[y.numpy()[0]])
pass
# 加载官方数据集
# 在 PyTorch 中官方提供了一些经典的数据集,如 CIFAR-10、MNIST、ImageNet 等,可以直接使用这些数据集进行训练和测试。
def demo4():
pass
# 数据增强
if __name__=="__main__":
# optimizer()
# demo2()
demo3()
pass
原文地址:https://blog.csdn.net/2401_86807530/article/details/144037694
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!