pytorch(6)--深度置信网络

本文介绍如何使用PyTorch构建深度置信网络(DBN)进行回归任务,数据维度为(N, 21),输出为(N, 1)。网络结构包含4层RBM,训练时逐层进行,之后连接BP神经网络并进行微调,回归损失函数采用MSE。训练集MSE loss稳定在2.0-3.0。" 105837261,9032582,51单片机定时器/计数器0、1工作方式解析,"['单片机', 'C语言', '嵌入式开发']
摘要由CSDN通过智能技术生成

一、前言

    本文主要使用pytorch 实现的DBN网络,用于对数据做回归,单个数据维度为(N,21),其中N为不定长,输出则为(N,1),对应N个值

DBN网络结构:

    

    首层神经元数量输入为变量长度21,中间为RBM网络,如本篇使用的网络结构诶[128,64,32,16],为一个4层的RBM网络结构,训练时RBM需要逐层做训练;在RBM训练后,再接上BP神经网络,再对BP网络做微调,回归损失函数使用MSE loss。

二、深度置信网络实现代码

#DBN.py
import torch
import warnings
import torch.nn as nn
import numpy as np

from RBM import RBM
from torch.utils.data import TensorDataset, DataLoader, Dataset
from torch.optim import Adam, SGD

from genCsvData import indefDataSet,DataLoader


class DBN(nn.Module):
    def __init__(self, hidden_units, visible_units=256, output_units=1, k=2,
                 learning_rate=1e-5, learning_rate_decay=False, #1e-5不可改动
                 increase_to_cd_k=False, device='cpu'):
        super(DBN, self).__init__()

        self.n_layers = len(hidden_units)
        self.rbm_layers = []
        self.rbm_nodes = []
        self.device = device
        self.is_pretrained = False
        self.is_finetune = False

        # Creating different RBM layers
        for i in range(self.n_layers):
            if i == 0:
                input_size = visible_units
            else:
                input_size = hidden_units[i - 1]
            rbm = RBM(visible_units=input_size, hidden_units=hidden_units[i],
                      k=k, learning_rate=learning_rate,
                      learning_rate_decay=learning_rate_decay,
                      increase_to_cd_k=increase_to_cd_k, device=device)

            self.rbm_layers.append(rbm)

        self.W_rec = [self.rbm_layers[i].weight for i in range(self.n_layers)]
        self.bias_rec = [self.rbm_layers[i].h_bias for i in range(self.n_layers)]

        for i in range(self.n_layers):
            self.register_parameter('W_rec%i' % i, self.W_rec[i])
            self.register_parameter('bias_rec%i' % i, self.bias_rec[i])

        self.bpnn = torch.nn.Linear(hidden_units[-1], output_units).to(self.device)    
        """ 
        self.bpnn=nn.Sequential(            #用作回归和反向微调参数
            torch.nn.Linear(32, 16),
            torch.nn.ReLU(),
            #torch.nn.Dropout(0.5),
            torch.nn.Linear(16,output_units),
        ).to(self.device)  """

    def forward(self, input_data):
        """
        running a single forward process.

        Args:
            input_data: Input data of the first RBM layer. Shape:
                [batch_size, input_length]

        Returns: Output of the last RBM hidden layer.

        """
        self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
        v = input_data.to(self.device)
        
        hid_output = v.clone()
        for i in range(len(self.rbm_layers)):
            hid_output, _ = self.rbm_layers[i].to_hidden(hid_output)
        output = self.bpnn(hid_output)
        return output

    def reconstruct(self, input_data):
        """
        Go forward to the last layer and then go feed backward back to the
        first layer.

        Args:
            input_data: Input data of the first RBM layer. Shape:
                [batch_size, input_length]

        Returns: Reconstructed output of the first RBM visible layer.

        """
        h = input_data.to(self.device)
        p_h = 0
        for i in range(len(self.rbm_layers)):
            # h = h.view((h.shape[0], -1))
            p_h, h = self.rbm_layers[i].to_hidden(h)

        for i in range(len(self.rbm_layers) - 1, -1, -1):
            # h = h.view((h.shape[0], -1))
            p_h, h = self.rbm_layers[i].to_visible(h)
        return p_h, h

    def pretrain(
            self, x, y, epoch=50, batch_size=10):
        """
        Train the DBN model layer by layer and fine-tuning with regression
        layer.

        Args:
            x: DBN model input data. Shape: [batch_size, input_length]
            epoch: Train epoch for each RBM.
            batch_size: DBN train batch size.

        Returns:

        """
        #hid_output_i = torch.tensor(x, dtype=torch.float, device=self.device)
        hid_output_i = x
        
        for i in range(len(self.rbm_layers)):
            print("Training rbm layer {}.".format(i + 1))
    
网络(Deep Belief Network,DBN)是一种基于深度学习的无监督学习算法,用于对数据进行特征学习和生成模型。PyTorch是一个流行的深度学习框架,提供了丰富的工具和函数来构建和训练神经网络。 在PyTorch中,您可以使用torch.nn模块来构建深度置信网络。首先,您需要定义一个DBN模型类,该类继承自torch.nn.Module。然后,您可以在类的构造函数中定义DBN的结构,包括输入层、隐藏层和输出层的大小。接下来,您需要定义前向传播函数,该函数将输入数据传递到DBN的每一层,并生成输出。 以下是一个简单的示例代码,演示了如何在PyTorch中构建一个深度置信网络: ```python import torch import torch.nn as nn class DBN(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(DBN, self).__init__() self.hidden = nn.Linear(input_size, hidden_size) self.output = nn.Linear(hidden_size, output_size) def forward(self, x): x = torch.sigmoid(self.hidden(x)) x = torch.sigmoid(self.output(x)) return x # 创建一个DBN对象 input_size = 10 hidden_size = 20 output_size = 1 dbn = DBN(input_size, hidden_size, output_size) # 假设有一个输入张量x x = torch.randn(1, input_size) # 将输入张量传递给DBN进行前向传播 output = dbn(x) print(output) ``` 在上面的示例中,我们定义了一个具有10个输入特征、20个隐藏单元和1个输出的DBN模型。通过调用`dbn(x)`,我们可以进行前向传播并生成一个输出张量。请注意,我们在每一层的激活函数之后使用了Sigmoid函数来确保输出值在0到1之间。 希望这个例子能帮助您开始使用PyTorch构建深度置信网络。如果您有任何进一步的问题,请随时提问!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值