PyTorch学习(三)

全连接网络

logistic问题其实就是一个很小的全连接网络,全连接网络简单的说就是每个输出节点都与下层的每个节点相连。
下面的是一个简单三层全连接网络和它逐渐添加了优化学习的代码。

import torch
from torch import nn, optim
from torch.autograd import Variable
from torch.utils.data import DataLoader
from torchvision import datasets, transforms

class simpleNet(torch.nn.Module):#简单的全连接网络
    def __init__(self, in_dims, n_hidden1, n_hidden2, out_dims):
        super(simpleNet, self).__init__()
        self.layer1 = torch.nn.Linear(in_dims, n_hidden1)
        self.layer2 = torch.nn.Linear(n_hidden1, n_hidden2)
        self.layer3 = torch.nn.Linear(n_hidden2, out_dims)

    def forward(self, x):
        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        return x

class Activation_Net(torch.nn.Module):#加了激活函数的全连接网络
    def __init__(self, in_dims, n_hidden1, n_hidden2, out_dims):
        super(Activation_Net, self).__init__()
        self.layer1 = torch.nn.Sequential(#进行非线性变换
            torch.nn.Linear(in_dims, n_hidden1), torch.nn.ReLU(True)
        )
        self.layer2 = torch.nn.Sequential(  # 进行非线性变换
            torch.nn.Linear(n_hidden1, n_hidden2), torch.nn.ReLU(True)
        )
        self.layer3 = torch.nn.Sequential(
            torch.nn.Linear(n_hidden2, out_dims)
        )

    def forward(self, x):
        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        return x

class Batch_Net(torch.nn.Module):#批标准化
    def __init__(self, in_dims, n_hidden1, n_hidden2, out_dims):
        super(Batch_Net, self).__init__()
        self.layer1 = torch.nn.Sequential(
            torch.nn.Linear(in_dims, n_hidden1),
            torch.nn.BatchNorm1d(n_hidden1), torch.nn.ReLU(True)
        )
        self.layer2 = torch.nn.Sequential(
            torch.nn.Linear(n_hidden1, n_hidden2),
            torch.nn.BatchNorm1d(n_hidden2), torch.nn.ReLU(True)
        )
        self.layer3 = torch.nn.Sequential(
            torch.nn.Linear(n_hidden2, out_dims)
        )

        def forward(self, x):
            x = self.layer1(x)
            x = self.layer2(x)
            x = self.layer3(x)
       	return x
       	
data_tf = transforms.Compose(#预处理操作
    [transforms.ToTensor(),
     transforms.Normalize([0.5], [0.5])]
)
#数据集下载
train_dataset = datasets.MNIST(
    root="./data", train = True, transform = data_tf, download=True
)
test_dataset = datasets.MNIST(
    root='./data', train=False,  transform=data_tf
)
#数据读取
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)

model = net.simpleNet(28 * 28, 300, 100, 10)
criterion = nn.CrossEntropyLoss()#损失函数  损失函数交叉熵
optimizer = optim.SGD(model.parameters(), lr = 0.01)#随机梯度下降


for epoch in range(10):#训练网络
    for i, (inputs, labels) in enumerate(train_loader, 0):
        inputs = inputs.view(inputs.size(0), -1)#将张量转化为一维
        inputs = Variable(inputs)
        labels = Variable(labels)
        out = model(inputs)
        loss = criterion(out,labels)

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
    print(epoch)

卷积网络

我这里就不对卷积网络进行讲解了,网上书上都写的很好,我只记一下搭建卷积层所需要的函数。

  • nn.Conv2d()
    此函数有五个参数
    in_channel:输入数据体的通道数
    out_channel: 输出数据体的通道数
    kernel_size: 卷积核的大小
    padding: 填充数量
    stride: 滑动步长

  • nn.MaxPool2d()
    此函数为最大值池化,一般我们都使用最大池化,特殊情况可能会使用均值池化。
    kernel_size:卷积核大小
    stride: 滑动步长
    padding: 填充数量
    return_indices:是否返回最大值坐标

import torch
from torch import nn


class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        layer1 = nn.Sequential()
        layer1.add_module('conv1', nn.Conv2d(3, 32, 3, 1, padding=1))
        layer1.add_module('relu1', nn.ReLU(True))
        layer1.add_module('pool1', nn.MaxPool2d(2,2))
        self.layer1 = layer1

        layer2 = nn.Sequential()
        layer2.add_module('conv2', nn.Conv2d(32, 64, 3, 1, padding=1))
        layer2.add_module('relu2', nn.ReLU(True))
        layer2.add_module('pool2', nn.MaxPool2d(2, 2))
        self.layer2 = layer2

        layer3 = nn.Sequential()
        layer3.add_module('conv3', nn.Conv2d(64, 128, 3, 1, padding=1))
        layer3.add_module('relu3', nn.ReLU(True))
        layer3.add_module('pool3', nn.MaxPool2d(2, 2))
        self.layer3 = layer3

        #全连接层
        layer4 = nn.Sequential()
        layer4.add_module('fc1', nn.Linear(2048, 512))
        layer4.add_module('fc_relu', nn.ReLU(True))
        layer4.add_module('fc2', nn.Linear(512, 64))
        layer4.add_module('fc_relu', nn.ReLU(True))
        layer4.add_module('fc3', nn.Linear(64, 10))
        self.layer4 = layer4

    def forward(self, x):
        conv1 = self.layer1(x)
        conv2 = self.layer2(conv1)
        conv3 = self.layer3(conv2)
        fc_input = conv3.view(conv3.size(0), -1)#调整为一维
        fc_out = self.layer4(fc_input)
        return  fc_out


if __name__ == '__main__':
    model = SimpleCNN()
    print(model)

好久没写了,书看的好慢啊。。。

【最优潮流】直流最优潮流(OPF)课设(Matlab代码实现)内容概要:本文档主要围绕“直流最优潮流(OPF)课设”的Matlab代码实现展开,属于电力系统优化领域的教学与科研实践内容。文档介绍了通过Matlab进行电力系统最优潮流计算的基本原理与编程实现方法,重点聚焦于直流最优潮流模型的构建与求解过程,适用于课程设计或科研入门实践。文中提及使用YALMIP等优化工具包进行建模,并提供了相关资源下载链接,便于读者复现与学习。此外,文档还列举了大量与电力系统、智能优化算法、机器学习、路径规划等相关的Matlab仿真案例,体现出其服务于科研仿真辅导的综合性平台性质。; 适合人群:电气工程、自动化、电力系统及相关专业的本科生、研究生,以及从事电力系统优化、智能算法应用研究的科研人员。; 使用场景及目标:①掌握直流最优潮流的基本原理与Matlab实现方法;②完成课程设计或科研项目中的电力系统优化任务;③借助提供的丰富案例资源,拓展在智能优化、状态估计、微电网调度等方向的研究思路与技术手段。; 阅读建议:建议读者结合文档中提供的网盘资源,下载完整代码与工具包,边学习理论边动手实践。重点关注YALMIP工具的使用方法,并通过复现文中提到的多个案例,加深对电力系统优化问题建模与求解的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值