莫烦 pytorch 高阶内容

莫烦主页:https://mofanpy.com/

5. 高阶内容

5.1 为什么 torch 是动态的

TensorFlow 是先搭建好一个计算系统(计算图),一旦搭建好了,就不能改动了,所有的计算都会在这个图中流动。

PyTorch 是动态搭建,动态计算,每次都会重新搭建一个新的计算图。

用 RNN 的例子展示动态计算时,数据的格式是 ( batch, time_step, input_size ),通常在 TensorFlow 中会将 batch 设置为 None ,可以让 batch_size 随时产生变化;但有时 time_step 也是随机变化的,也需要将 time_step 设置为 None,但是 TensorFlow 不支持两个随机变化的维度,Torch 当中可以。

5.2 GPU(CUDA) 显卡加速运算

利用 CNN 的例子来展示如何修改,使得在 GPU 上进行运算

  • 参数移动
# 每次 loader train data 以后都需要将 x 移动到 cuda 中
b_x = x.cuda()    # Tensor on GPU
# 移动 test data
test_x = torch.unsqueeze(test_data.test_data, dim=1).type(torch.FloatTensor)[:2000].cuda()/255.   # Tensor on GPU
  • 计算图纸移动
pred_y = torch.max(test_output, 1)[1].cuda().data  # move the computation in GPU
# matplotlib 无法使用 GPU 的数据形式
# 把数据变成在 CPU 上
# 就可以进行可视化过程
pred_y = pred_y.cpu()
  •  CNN 模块移动
cnn = CNN()
cnn.cuda()      # Moves all model parameters and buffers to the GPU.

5.3 过拟合(Overfitting)

机器模型过于“自信”,以至于“自负”。在自己的小圈子里表现非凡,但在大圈子里却处处碰壁

解决方法:

  • 增加数据量
  • L1,L2 ... 正规化(Regulation)以及专门用于神经网络的 Dropout Regulation

简化机器学习公式为:y = Wxcost = (Wx - real\ y)^2

  1. L1:cost = (Wx - real\ y)^2 + abs(W)

  2. L2:cost = (Wx - real\ y)^2+(W)^2

  3. Dropout Regulation:每次训练时随机忽略一些神经元(训练的时候需要屏蔽功能,测试及预测时不需要)

# 没有处理能力的神经网络
net_overfitting = torch.nn.Sequential(
    torch.nn.Linear(1, N_HIDDEN),
    torch.nn.ReLU(),
    torch.nn.Linear(N_HIDDEN, N_HIDDEN),
    torch.nn.ReLU(),
    torch.nn.Linear(N_HIDDEN, 1),
)

# 有处理过拟合能力的神经网络
net_dropped = torch.nn.Sequential(
    torch.nn.Linear(1, N_HIDDEN),
    torch.nn.Dropout(0.5),      # 每次随机屏蔽掉 50% 的神经元
    torch.nn.ReLU(),
    # Dropout 也可以添加到这一层,具体添加到哪一层看效果
    torch.nn.Linear(N_HIDDEN, N_HIDDEN),
    torch.nn.Dropout(0.5),
    torch.nn.ReLU(),
    torch.nn.Linear(N_HIDDEN, 1),
)
# 每隔 10 步进行预测
if t % 10 == 0:
    # 在进行预测或检测时,要将 dropout 的屏蔽功能取消掉,eval()可以取消
    net_overfitting.eval()
    # overfitting_net 可以不使用eval()
    net_dropped.eval()

    test_pred_ofit = net_overfitting(test_x)
    test_pred_drop = net_dropped(test_x)

    ... ...

    net_overfitting.train()
    net_dropped.train()

5.4 批标准化 / 归一化(Batch Normalization)

标准化是将分散的数据统一,是优化神经网络的一种方法。具有统一规格的数据能让机器学习更容易学习到数据之间的规律。Batch Normalization 中的 batch 是批数据,把数据分成小批小批进行 stochastic gradient descent(随机梯度下降),在每批数据进行 forward propagation 时,对每一层都进行Normalization 处理。Batch Normalization (BN) 被添加在每一个全连接和激励函数之间。

BN 是通过一定的规范化手段,把每层的神经网络任意神经元输入值的分布强行拉回到均值为 0 方差为 1 的标准正态分布,避免了梯度爆炸和梯度消失。

# hidden num
N_HIDDEN = 8
# init bad bias parameter for simulation
B_INIT = -0.2
# activation function
ACTIVATION_FUNC = F.relu   # or F.tanh

class Net(nn.Module):
    def __init__(self, batch_normalization=False):
        super(Net, self).__init__()
        self.do_bn = batch_normalization
        self.fcs = []
        self.bns = []
        self.bn_input = nn.BatchNorm1d(1, momentum=0.5)
        # momentum 用来平滑化 Batch Mean and StdDev

        for i in range(N_HIDDEN):
            input_size = 1 if i == 0 else 10  # 第一层为 1,隐藏层为 10 个神经元
            fc = nn.Linear(input_size, 10)    # 全连接层
            setattr(self, 'fc%i' % i, fc)     # setattr() 设置 class 的一个 attribute
            self._set_init(fc)
            self.fcs.append(fc)
            if self.do_bn:
                bn = nn.BatchNorm1d(10, momentum=0.5)
                setattr(self, 'bn%i' % i, bn)
                self.bns.append(bn)

        self.predict = nn.Linear(10, 1)
        self._set_init(self.predict)


    def _set_init(self, layer):        # 参数初始化
        init.normal_(layer.weight, mean=0., std=.1)
        init.constant_(layer.bias, B_INIT)

    def forward(self, x):
        pre_activation = [x]
        if self.do_bn: x = self.bn_input(x)
        layer_input = [x]
        for i in range(N_HIDDEN):
            x = self.fcs[i](x)        
            pre_activation.append(x)
            if self.do_bn : x = self.bns[i](x)
            x = ACTIVATION(x)
            layer_input.append(x)    # append 到下一层的输入
        out = self.predict(x)
        return out, layer_input, pre_activation

# 建立两个 net, 一个有 BN, 一个没有
nets = [Net(batch_normalization=False), Net(batch_normalization=True)]

 

### 回答1: PyTorch是一个开源的深度学习框架,可以用于训练和构建各种神经网络模型。而高光谱技术是以不同波长范围内的能量信息为基础,获取受检材料的特性和组成的一种分析方法。 PyTorch可以应用于高光谱数据的处理和分析。高光谱数据通常包含大量的波谱信息,而PyTorch提供了丰富的工具和算法,用于处理和提取这些数据的有用信息。通过PyTorch的张量操作和矩阵计算,可以对高光谱数据进行预处理、特征提取和模型训练等操作。 在高光谱数据处理PyTorch可以用于构建卷积神经网络(CNN)和循环神经网络(RNN)等模型,以实现对高光谱数据的分类、目标检测和图像分割等任务。同PyTorch还提供了各种优化算法和损失函数,可以用于训练和调整模型的参数,以实现更好的性能。 此外,PyTorch还支持GPU加速,可以利用GPU的并行计算能力加快高光谱数据的处理速度。这对于大规模高光谱数据集的处理和分析非常有益。 总而言之,PyTorch作为一个强大的深度学习框架,可以在高光谱数据的处理和分析发挥重要作用。它提供了丰富的工具和算法,可用于构建和训练各种神经网络模型,为高光谱数据的分类、目标检测和图像分割等任务提供支持。同PyTorch的GPU加速还可以加快数据处理速度,提高效率。 ### 回答2: PyTorch是一种开源的机器学习框架,提供了丰富的工具和库用于开发、训练和部署深度学习模型。高光谱图像处理是一种研究和应用领域,主要关注在可见光谱范围之外的波长上获取的图像。 PyTorch可以应用于高光谱图像处理的各个环节。首先,在数据预处理阶段,可以使用PyTorch提供的数据加载和转换功能,将高光谱图像加载并进行必要的预处理操作,如归一化、降维、去噪等。 在模型构建和训练阶段,PyTorch提供了灵活且高效的神经网络构建工具,可以用于构建适用于高光谱图像处理的深度学习模型,如卷积神经网络(CNN)、循环神经网络(RNN)等。同PyTorch还提供了自动求导功能,可以方便地计算和更新模型参数,优化模型的性能。 此外,PyTorch还支持分布式训练,可以使用多个GPU或多台计算机进行高效的并行计算,加速训练过程。这对于处理大规模高光谱图像数据集是非常有用的。 最后,在部署阶段,PyTorch提供了模型导出和推理的功能,可以将训练好的模型导出为可执行文件,在不同的环境进行实际应用。同PyTorch还与其他深度学习框架和库兼容,可以方便地与其他工具进行整合。 总之,PyTorch在高光谱图像处理发挥了重要的作用,提供了丰富的功能和工具,帮助研究人员和开发者构建、训练和应用深度学习模型,进一步推动了高光谱图像处理的发展。 ### 回答3: PyTorch是一个开源的Python机器学习库,主要用于深度学习领域。PyTorch提供了丰富的工具和功能,使得高光谱数据的处理和分析变得更加容易和高效。 高光谱数据是指在更多波段上进行测量的光谱数据。相比于传统的光谱数据,高光谱数据可以提供更多的光谱细节和更高的分辨率。然而,由于高光谱数据的特殊性,传统的数据处理和分析方法往往无法直接应用于高光谱数据。 在PyTorch,可以利用其强大的数值计算能力和灵活性来处理高光谱数据。首先,PyTorch提供了丰富的张量操作函数,可以方便地进行数据的存储、变换、计算等操作。这些操作能够满足高光谱数据的需求,例如将数据转换为张量进行矩阵运算,或者通过调整张量形状来适应不同的算法模型。 其次,PyTorch具有强大的深度学习框架,可以用于高光谱数据的分类、回归、聚类等任务。PyTorch提供了一系列的神经网络模型和算法,例如卷积神经网络(CNN)、循环神经网络(RNN)等,这些模型可以直接用于高光谱数据的特征提取和分类。 此外,PyTorch还支持可视化工具,可以帮助用户更直观地观察和分析高光谱数据的特征。通过PyTorch的可视化功能,用户可以绘制数据分布图、特征图等,从而更好地理解和分析高光谱数据。 综上所述,PyTorch在高光谱数据的处理和分析方面具有许多优势。它提供了丰富的工具和功能,可以帮助用户更有效地处理和分析高光谱数据,从而为高光谱数据的应用提供支持和帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值