Pytorch:深度学习实战经验总结

1. dataloader查看迭代数据

phase_dataset = PhaseDataset(transforms=T.ToTensor())
phase_loader = DataLoader(phase_dataset, batch_size=1)
dataiter = iter(phase_loader)
t_data, g_data = next(dataiter)  # 第一个数据
t_data, g_data = next(dataiter)  # 第二个数据

2. tensor变array

numpy.array(Hor_tensor)

3.数据集划分为训练集和验证集

已知所有数据在一个文件夹内,先用Dataset获取所有文件,再用random_spilt划分

phase_dataset = PhaseDataset(transforms=T.ToTensor())
train_dataset, val_dataset = random_split(phase_dataset, [round(0.8 * len(phase_dataset)), round(0.2 * len(phase_dataset))],
            generator=torch.Generator().manual_seed(42))  # 把数据机随机切分训练集和验证集
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=0)
val_loader = DataLoader(val_dataset, batch_size=batch_size, shuffle=True, num_workers=0)

参考代码

import torch
from torch.utils.data import random_split
dataset = range(10)
train_dataset, test_dataset = random_split(
    dataset=dataset,
    lengths=[7, 3],
    generator=torch.Generator().manual_seed(0)  # 随机种子
    # 保证实验可重复
)
print(list(train_dataset))
print(list(test_dataset))

4.pytorch 的weight数据类型为float32,输入数据需和其保持一致

(1)三维初始化数据,各个维度数据经数分别进行据强制转换,无效;
(2)作为一个整体转换,有效

# method1
g_data = np.empty([512, 512, 2])
g_data[:, :, 1] = np.array(t_data, dtype='float32')
g_data[:, :, 0] = np.array(t_data, dtype='float32')  # 转换失效
c_data = np.array(g_data, dtype='float32')   # 有效
# method2
c_data = g_data.astype(np.float32)

5. visdom实时显示训练过程

调用

python -m visdom.server

6.自定义loss函数

(1)模板

class CustomLoss(nn.Module): # 注意继承 nn.Module
    def __init__(self):
        super(CustomLoss, self).__init__()

    def forward(self, x, y):
        # .....这里写x与y的处理逻辑,即loss的计算方法
        return loss # 注意最后只能返回Tensor值,且带梯度,即 loss.requires_grad == True

(2)实例

class CustomLoss(nn.Module):
    def __init__(self):
        super(CustomLoss, self).__init__()

    def forward(self, x, y):
        mse_loss = torch.mean(torch.pow((x - y), 2)) # x与y相减后平方,求均值即为MSE
        return mse_loss

(3)loss值

  • 利用nn.MSEloss计算损失函数,计算结果为一个常数(tensor类型),requires_grad = truth;
  • 也可说,输出的是整批样本损失函数的平均值

7.dataloader加载出来的数据维度

(1) 原始数据, [H, W, C]
	data (512, 512, 2) 
(2) totensor之后, [C, H, W]
	T.ToTensor(data) (2, 512, 512) 
(3) Dataloader 之后, [B, C, H, W]
	phase_dataset = PhaseDataset(transforms=data_transforms)
	train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=0) 
	(batch_size, 2, 512, 512) 

8.torch数学运算:pow

  • torch.pow(a, n):求a中每个元素的n次方

9.常用画图方法

import matplotlib.pyplot as plt
plt.subplot(231)
plt.plot(fringe_np[500, :])
plt.subplot(232)
plt.plot(fringe_cut[500, :])
plt.subplot(233)
plt.imshow(mask_np)
plt.subplot(234)
plt.imshow(fringe_np)
plt.subplot(235)
plt.imshow(fringe_cut)
plt.show()

显示的图像中,点上数值,会不准确。

10.路径

(1)相对路径

. 代表当前所在目录
. . 代表当前所在目录的父目录
. / 代表当前所在目录下的某个文件夹或文件
. . / 代表当前所在目录的父目录下的某个文件夹或文件
eg:
A
———B
———C
———D
——————E.py
——————F

类似于上示的一个目录结构,在E.py中 . 代表D,. . 代表A,./F 代表F,…/C 代表C

(2)寻找绝对路径

1)返回当前目录
print(os.getcwd())
print(os.path.abspath(os.path.dirname(__file__)))
2)返回上一层目录
print(os.path.abspath(os.path.dirname(os.path.dirname(__file__))))
print(os.path.abspath(os.path.dirname(os.getcwd())))
print(os.path.abspath(os.path.join(os.getcwd(), "..")))
3)返回上上一层目录
print(os.path.abspath(os.path.join(os.getcwd(), "../..")))

11.卷积层中是否可以应用dropout来防止过拟合?

click
dropout一般放于全连接层,较少用于卷积层,非主流trick。卷积网络中batchnor层也有正则化功能。

12. CUDA 内存爆炸

(1)代码运算量四个loss函数,导致内存爆炸
(2)将其中两个loss运算指定到另外一个cuda。
以上均为解决问题
(3)将loss调用方式改为loss.item()。 问题得到解决

loss_tra = criterion(outputs_tra, labels_mdg_tra)  # 计算损失
epoch_trainloss += loss_tra.item()

你可能感兴趣的:(深度学习,python,pytorch,深度学习,机器学习)