首页 > 其他分享 >深度学习--全连接层、高阶应用、GPU加速

深度学习--全连接层、高阶应用、GPU加速

时间:2023-04-22 19:25:30浏览次数:50  
标签:200 nn -- data torch True transforms GPU 高阶

深度学习--全连接层、高阶应用、GPU加速

  1. MSE均方差

  2. Cross Entropy Loss:交叉熵损失

Entropy 熵:

1948年,香农将统计物理中熵的概念,引申到信道通信的过程中,从而开创了信息论这门学科,把信息中排除了冗余后的平均信息量称为“信息熵”。香农定义的“熵”又被称为香农熵或信息熵,即

img

其中img标记概率空间中所有可能的样本,img表示该样本的出现几率,img是和单位选取相关的任意常数。

针对此问题,熵越大,不确定程度就越大,对于其中信息量的讨论参考知乎

​ 在信息学里信息量大代表着数据离散范围小,不确定性小。香农作为一个信息学家,他关心的是信息的正确传递,所以信息熵代表着信息传递的不确定性的大小。所以在信息学上,使用香农公式算出来的这个值,在信息学上叫做信息熵值,在熵权法中叫做冗余度值或者叫偏离度值,它的本来含义是指一个确定无疑的信息源发送出来的信息,受到干扰以后,衡量偏离了原始精确信息的程度。离散度越大,计算得这个值越小,则收到的信息越不可靠,得到的信息越小。这个值越大,则收到的信息越可靠,得到的信息越多。

​ 在统计学里,就完全不是这样。统计学家不认为存在仅有一个的确定无疑的原始信息。而是认为收到的统计数字都是确信无疑的,只是由于发送主体可能是很多主体,或者是同一主体不同时间,不同地点,或者是统计渠道不同等等原因,得到了一组具有离散性的数值。在这种情况下,离散性越大,熵值越小,代表着信息量越大,所以权重越大。

a=torch.full([4],1/4)
#tensor([0.2500, 0.2500, 0.2500, 0.2500])

#计算交叉熵
-(a*torch.log2(a)).sum()
#tensor(2.)

​ 交叉熵在神经网络中作为损失函数,p表示真实标记的分布,q则为训练后的模型的预测标记分布,交叉熵损失函数可以衡量p与q的相似性。交叉熵作为损失函数还有一个好处是使用sigmoid函数在梯度下降时能避免均方误差损失函数学习速率降低的问题,因为学习速率可以被输出的误差所控制。

交叉熵计算:H(p,q)=img

MNIST再实现

import  torch
import  torch.nn as nn
import  torch.nn.functional as F
import  torch.optim as optim
from    torchvision import datasets, transforms


batch_size=200
learning_rate=0.01
epochs=10

#加载数据集DataLoader(数据位置,batch_size,shuffle是否打乱,num_workers=4:4线程处理)
    #torchvision.datasets.MNIST(root,train,transform,download)   root指下载到的位置,train指是否下载训练集,transform指对图片进行转换后返回,download指是否下载
        #torchvision.transforms([transforms.ToTensor(),transforms.Normalize((mean),(std))])
            #transforms.ToTensor()做了三件事:1.归一化/255 2.数据类型转为torch.FloatTensor  3.shape(H,W,C)->(C,H,W)
            #transforms.Normalize((mean),(std)) :用均值和标准差对张量图像进行归一化

train_loader = torch.utils.data.DataLoader(
    datasets.MNIST('../data', train=True, download=True,
                   transform=transforms.Compose([
                       transforms.ToTensor(),
                       transforms.Normalize((0.1307,), (0.3081,))
                   ])),
    batch_size=batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(
    datasets.MNIST('../data', train=False, transform=transforms.Compose([
        transforms.ToTensor(),
        transforms.Normalize((0.1307,), (0.3081,))
    ])),
    batch_size=batch_size, shuffle=True)



w1, b1 = torch.randn(200, 784, requires_grad=True),\
         torch.zeros(200, requires_grad=True)
w2, b2 = torch.randn(200, 200, requires_grad=True),\
         torch.zeros(200, requires_grad=True)
w3, b3 = torch.randn(10, 200, requires_grad=True),\
         torch.zeros(10, requires_grad=True)

torch.nn.init.kaiming_normal_(w1)
torch.nn.init.kaiming_normal_(w2)
torch.nn.init.kaiming_normal_(w3)


def forward(x):
    x = [email protected]() + b1
    x = F.relu(x)
    x = [email protected]() + b2
    x = F.relu(x)
    x = [email protected]() + b3
    x = F.relu(x)
    return x



optimizer = optim.SGD([w1, b1, w2, b2, w3, b3], lr=learning_rate)
criteon = nn.CrossEntropyLoss()

for epoch in range(epochs):

    for batch_idx, (data, target) in enumerate(train_loader):
        data = data.view(-1, 28*28)

        logits = forward(data)
#        print(data.shape, target.shape,logits.shape)

        loss = criteon(logits, target)

        optimizer.zero_grad()
        loss.backward()
        # print(w1.grad.norm(), w2.grad.norm())
        optimizer.step()

        if batch_idx % 100 == 0:
            print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
                epoch, batch_idx * len(data), len(train_loader.dataset),
                       100. * batch_idx / len(train_loader), loss.item()))


    test_loss = 0
    correct = 0
    for data, target in test_loader:
        data = data.view(-1, 28 * 28)
        logits = forward(data)
        test_loss += criteon(logits, target).item()

        pred = logits.data.max(1)[1]
        #print(pred)
        correct += pred.eq(target.data).sum()

    test_loss /= len(test_loader.dataset)
    print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
        test_loss, correct, len(test_loader.dataset),
        100. * correct / len(test_loader.dataset)))

全连接层

import torch
import torch.nn as nn
import torch.nn.functional as F

x=torch.randn(1,784)
x.shape
#torch.Size([1, 784])

# nn.Linear(输入、输出)
layer1 = nn.Linear(784,200)
layer2 = nn.Linear(200,200)
layer3 = nn.Linear(200,10)

x=layer1(x)
x=F.relu(x,inplace=True)
x.shape
#torch.Size([1, 200])

x=layer2(x)
x=F.relu(x,inplace=True)
x.shape
#torch.Size([1, 200])

x=layer3(x)
x=F.relu(x,inplace=True)
x.shape
#torch.Size([1, 10])

网络定义的高阶用法

import torch
import torch.nn as nn
import torch.nn.functional as F
import  torch.optim as optim

class MLP(nn.Module):
    
    def __init__(self):
        super(MLP,self).__init__()
        
        self.model = nn.Sequential(
            nn.Linear(784,200),
            nn.ReLU(inplace=True),
            nn.Linear(200,200),
            nn.ReLU(inplace=True),
            nn.Linear(200,10),
            nn.ReLU(inplace=True),
        )

    def forward(self,x):
        x=self.model(x)
        return x

net= MLP()
optimizer = optim.SGD(net.parameters(),lr=learning_rate)
criteon = nn.CrossEntropyLoss()

其他的激活函数 SELU、softplus、

GPU加速

import  torch
import  torch.nn as nn
import  torch.nn.functional as F
import  torch.optim as optim
from    torchvision import datasets, transforms


batch_size=200
learning_rate=0.01
epochs=10

#加载数据集DataLoader(数据位置,batch_size,shuffle是否打乱,num_workers=4:4线程处理)
    #torchvision.datasets.MNIST(root,train,transform,download)   root指下载到的位置,train指是否下载训练集,transform指对图片进行转换后返回,download指是否下载
        #torchvision.transforms([transforms.ToTensor(),transforms.Normalize((mean),(std))])
            #transforms.ToTensor()做了三件事:1.归一化/255 2.数据类型转为torch.FloatTensor  3.shape(H,W,C)->(C,H,W)
            #transforms.Normalize((mean),(std)) :用均值和标准差对张量图像进行归一化

train_loader = torch.utils.data.DataLoader(
    datasets.MNIST('../data', train=True, download=True,
                   transform=transforms.Compose([
                       transforms.ToTensor(),
                       transforms.Normalize((0.1307,), (0.3081,))
                   ])),
    batch_size=batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(
    datasets.MNIST('../data', train=False, transform=transforms.Compose([
        transforms.ToTensor(),
        transforms.Normalize((0.1307,), (0.3081,))
    ])),
    batch_size=batch_size, shuffle=True)


class MLP(nn.Module):

    def __init__(self):
        super(MLP, self).__init__()

        self.model = nn.Sequential(
            nn.Linear(784, 200),
            nn.LeakyReLU(inplace=True),
            nn.Linear(200, 200),
            nn.LeakyReLU(inplace=True),
            nn.Linear(200, 10),
            nn.LeakyReLU(inplace=True),
        )

    def forward(self,x):
        x=self.model(x)
        return x

    
##重点重点!!! 

device=torch.device('cuda:0')
net = MLP().to(device)
optimizer = optim.SGD(net.parameters(),lr=learning_rate)
criteon = nn.CrossEntropyLoss().to(device)


for epoch in range(epochs):

    for batch_idx, (data, target) in enumerate(train_loader):
        data = data.view(-1, 28*28)
        data,target = data.to(device),target.to(device)


        logits = net(data)
#        print(data.shape, target.shape,logits.shape)

        loss = criteon(logits, target)

        optimizer.zero_grad()
        loss.backward()
        # print(w1.grad.norm(), w2.grad.norm())
        optimizer.step()

        if batch_idx % 100 == 0:
            print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
                epoch, batch_idx * len(data), len(train_loader.dataset),
                       100. * batch_idx / len(train_loader), loss.item()))


    test_loss = 0
    correct = 0
    for data, target in test_loader:
        data = data.view(-1, 28 * 28)
        data, target = data.to(device), target.to(device)
        logits = net(data)
        test_loss += criteon(logits, target).item()

        pred = logits.data.max(1)[1]
        #print(pred)
        correct += pred.eq(target.data).sum()

    test_loss /= len(test_loader.dataset)
    print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
        test_loss, correct, len(test_loader.dataset),
        100. * correct / len(test_loader.dataset)))

标签:200,nn,--,data,torch,True,transforms,GPU,高阶
From: https://www.cnblogs.com/ssl-study/p/17343719.html

相关文章

  • Gitee自动部署 cocoscreator web端
    Gitee自动部署参考文档:Gitee目前支持特性:推送代码到Gitee时,由配置的WebHook触发Jenkins任务构建。评论提交记录触发提交记录对应版本Jenkins任务构建提交PullRequest到Gitee项目时,由配置的WebHook触发Jenkins任务构建,支持PR动作:新建,更新,接受,关闭,审查通过,测试......
  • Django 知识库:path()路径映射
    网站地址是由统一资源定位符表示的,也是就我们常说的url。Django中有非常强大的path()方法,可以动态构造出你想要的各种不同形态的url。基本写法如下:fromdjango.urlsimportpathurlpatterns=[#固定地址path('articles/2003/',...),#可传入int参......
  • Discourse Google Analytics 3 的升级提示
    根据Google官方的消息:GoogleAnalytics(分析)4是我们的新一代效果衡量解决方案,即将取代UniversalAnalytics。自2023年7月1日起,标准UniversalAnalytics媒体资源将停止处理新的命中数据。如果您仍在使用UniversalAnalytics,我们建议您为以后使用GoogleAnalytics(分......
  • 注解的作用?
    注解的作用?注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。它主要的作用有以下四方面:生成文档,通过代码里标识的元数据生成javadoc文档。编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证。编......
  • Oracle:fedora-server-38:安装oracle12c:注意点
    首先,必须的准备!其次,需要注意,fedora-server默认安装时,临时目录/tmp是tempfs系统,其空间大小(默认最大为内存的一半)可能不足!建议将其卸载,重新在根目录创建或连接到一个足够大的磁盘空间上! ......
  • vue2源码-十二、mixin的使用和原理
    mixin的使用和原理使用:可以通过Vue.mixin来实现逻辑的复用,问题在于数据来源不明确。声明的时候可能对导致命名冲突vue3采用的就是compositionAPI局部混入:varmyMixin={created:function(){this.hello()},methods:{hello:function(){......
  • 注解的常见分类?
    Java自带的标准注解,包括@Override、@Deprecated和@SuppressWarnings,分别用于标明重写某个方法、标明某个类或方法过时、标明要忽略的警告,用这些注解标明后编译器就会进行检查。元注解,元注解是用于定义注解的注解,包括@Retention、@Target、@Inherited、@Documented@Retention用......
  • 天天打卡一小时第七天
    1.问题描述实验2-24.25-输出层数的倒金字塔编写一段程序,像下面这样显示输入整数层的向下的金字塔形状。第i行显示i%10的结果。-----出自【明解C语言】练习4-25.让我们来画一个向下的金字塔。金字塔有几层:3111112223输入样例:在这里给出一组输入。例如:3输出样例:......
  • Java异常类层次结构?
    Throwable是Java语言中所有错误与异常的超类。Error类及其子类:程序中无法处理的错误,表示运行应用程序中出现了严重的错误。Exception程序本身可以捕获并且可以处理的异常。Exception这种异常又分为两类:运行时异常和编译时异常。运行时异常都是RuntimeException类......
  • c# 异步进阶———— paralel [二]
    前言简单整理一下paralel,以上是并行的意思。正文我们在工作中常常使用taskawait和async,也就是将线程池进行了封装,那么还有一些更高级的应用。是对task的封装,那么来看下paralel。staticvoidMain(string[]args){ varints=Enumerable.Range(1,100); varresult=Pa......