pytorch基础(2)

1.数据读入

train_data=datasets.ImageFolder(train_path,transform=data_tranform)

#PyTorch数据读入是通过Dataset+DataLoader的方式完成的
# Dataset定义好数据的格式和数据变换形式,DataLoader用iterative的方式不断读入批次数据。

#定义自己的Dataset类
#定义的类需要继承PyTorch自身的Dataset类
#__init__: 用于向类中传入外部参数,同时定义样本集
#__getitem__: 用于逐个读取样本集合中的元素,可以进行一定的变换,并将返回训练/验证所需的数据
#__len__: 用于返回数据集的样本数

2. 模型构建

#Module 类是 nn 模块里提供的一个模型构造类,是所有神经⽹网络模块的基类,包括init 函数和 forward 函数
class MLP(nn.Module):
    # 声明带有模型参数的层,这里声明了两个全连接层,hidden&output
    def __init__(self, **kwargs):#传递的参数
        # 调用MLP父类模块的构造函数super来进行必要的初始化。这样在构造实例时还可以指定其他函数
        super(MLP, self).__init__(**kwargs)
        self.hidden = nn.Linear(784, 256)#初始化,见3。输入层维度,隐藏层维度
        self.act = nn.ReLU()
        self.output = nn.Linear(256, 10)#隐藏层维度和输出层维度

    # 定义模型的前向计算,即如何根据输入x计算返回所需要的模型输出
    def forward(self, x):
        o = self.act(self.hidden(x))
        return self.output(o)

#实例化 MLP 类/初始化Net
X = torch.rand(2,784)
net = MLP()
print(net)
net(X)

3. 模型初始化

conv = nn.Conv2d(1,3,3) linear = nn.Linear(10,1)
# 对conv参数进行kaiming初始化

torch.nn.init.kaiming_normal_(conv.weight.data)

# 对linear进行常数初始化

torch.nn.init.constant_(linear.weight.data,0.3) 

#判断模块类型

isinstance(conv,nn.Conv2d)


# 查看初始化参数的代码

conv.weight.data
linear.weight.data

4. 损失函数(待补充)

4.1 计算二分类cross  entropy的损失函数,input为{0,1}的概率分布(待补充)

4.2 交叉熵损失函数

4.3 L1loss

4.4 MSE

loss = nn.MSELoss()
input = torch.randn(3, 5, requires_grad=True)
target = torch.randn(3, 5)
output = loss(input, target)
output.backward()

5.训练:反向传播修改参数;测试:不能修改参数

for循环读取训练及测试集的全部数据-》(放入GPU)-》每轮for循环优化器的梯度置零-》数据放入模型训练-》 损失函数-》定义loss反向传播-》优化器更新参数

def train(epoch):
    model.train()
    train_loss = 0
    for data, label in train_loader:
        data, label = data.cuda(), label.cuda()
        optimizer.zero_grad()
        output = model(data)
        loss = criterion(label, output)
        loss.backward()
        optimizer.step()
        train_loss += loss.item()*data.size(0)
    train_loss = train_loss/len(train_loader.dataset)
		print('Epoch: {} \tTraining Loss: {:.6f}'.format(epoch, train_loss))

测试与训练区别:(1)model.eval() (2)with torch.no_grad(): +for (3)无需更新优化器,优化器梯度置零及反向传播

6. 可视化:

分类的ROC曲线,卷积网络中的卷积核,以及训练/验证过程的损失函数曲线

7.优化器:用来更新参数

优化器要实例化后使用

你可能感兴趣的:(深度学习)