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()
14. Img.size和Array.shape维度的比较
15.无监督学习
本质:没有label的深度学习算法
示例:聚类(分类)、数据压缩
16.scio.loadmat
该函数读取Mask(只含有0,1),虽然数据类型为double型,但最终被优化为UINT8型。切记!!
17.算网络模型的参数量
from res_unet import ResUnet
import torch
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = ResUnet(in_channel=2, out_channel=2, filters=[32, 64, 128, 256]).to(device)
print("The number of parameters of the network is: "
, sum(p.numel() for p in model.parameters() if p.requires_grad))