zoukankan      html  css  js  c++  java
  • Pytorch-基础入门之RNN

    RNN循环神经网络,也是一种很常见的神经网络了,在这里也不进行原理展示了。直接上代码。

    这一块的话与上一篇逻辑斯蒂回归使用的是相同的数据集MNIST。

    第一部分:构造模型

    # Import Libraries
    import torch
    import torch.nn as nn
    from torch.autograd import Variable
    
    # Create RNN Model
    class RNNModel(nn.Module):
        def __init__(self, input_dim, hidden_dim, layer_dim, output_dim):
            super(RNNModel, self).__init__()
            
            # Number of hidden dimensions
            self.hidden_dim = hidden_dim
            
            # Number of hidden layers
            self.layer_dim = layer_dim
            
            # RNN
            self.rnn = nn.RNN(input_dim, hidden_dim, layer_dim, batch_first=True, nonlinearity='relu')
            
            # Readout layer
            self.fc = nn.Linear(hidden_dim, output_dim)
        
        def forward(self, x):
            
            # Initialize hidden state with zeros
            h0 = Variable(torch.zeros(self.layer_dim, x.size(0), self.hidden_dim))
                
            # One time step
            out, hn = self.rnn(x, h0)
            out = self.fc(out[:, -1, :]) 
            return out
    
    # batch_size, epoch and iteration
    batch_size = 100
    n_iters = 8000
    num_epochs = n_iters / (len(features_train) / batch_size)
    num_epochs = int(num_epochs)
    
    # Pytorch train and test sets
    train = TensorDataset(featuresTrain,targetsTrain)
    test = TensorDataset(featuresTest,targetsTest)
    
    # data loader
    train_loader = DataLoader(train, batch_size = batch_size, shuffle = False)
    test_loader = DataLoader(test, batch_size = batch_size, shuffle = False)
        
    # Create RNN
    input_dim = 28    # input dimension
    hidden_dim = 100  # hidden layer dimension
    layer_dim = 1     # number of hidden layers
    output_dim = 10   # output dimension
    
    model = RNNModel(input_dim, hidden_dim, layer_dim, output_dim)
    
    # Cross Entropy Loss 
    error = nn.CrossEntropyLoss()
    
    # SGD Optimizer
    learning_rate = 0.05
    optimizer = torch.optim.SGD(model.p
    arameters(), lr=learning_rate)

      第二部分:训练模型

    seq_dim = 28  
    loss_list = []
    iteration_list = []
    accuracy_list = []
    count = 0
    for epoch in range(num_epochs):
        for i, (images, labels) in enumerate(train_loader):
    
            train  = Variable(images.view(-1, seq_dim, input_dim))
            labels = Variable(labels )
                
            # Clear gradients
            optimizer.zero_grad()
            
            # Forward propagation
            outputs = model(train)
            
            # Calculate softmax and ross entropy loss
            loss = error(outputs, labels)
            
            # Calculating gradients
            loss.backward()
            
            # Update parameters
            optimizer.step()
            
            count += 1
            
            if count % 250 == 0:
                # Calculate Accuracy         
                correct = 0
                total = 0
                # Iterate through test dataset
                for images, labels in test_loader:
                    images = Variable(images.view(-1, seq_dim, input_dim))
                    
                    # Forward propagation
                    outputs = model(images)
                    
                    # Get predictions from the maximum value
                    predicted = torch.max(outputs.data, 1)[1]
                    
                    # Total number of labels
                    total += labels.size(0)
                    
                    correct += (predicted == labels).sum()
                
                accuracy = 100 * correct / float(total)
                
                # store loss and iteration
                loss_list.append(loss.data)
                iteration_list.append(count)
                accuracy_list.append(accuracy)
                if count % 500 == 0:
                    # Print Loss
                    print('Iteration: {}  Loss: {}  Accuracy: {} %'.format(count, loss.data[0], accuracy))
    

     结果:

    Iteration: 500  Loss: 1.4726558923721313  Accuracy: 42.726190476190474 %
    Iteration: 1000  Loss: 0.7108388543128967  Accuracy: 71.73809523809524 %
    Iteration: 1500  Loss: 0.43755194544792175  Accuracy: 85.22619047619048 %
    Iteration: 2000  Loss: 0.271086722612381  Accuracy: 90.25 %
    Iteration: 2500  Loss: 0.2235582023859024  Accuracy: 89.5 %
    Iteration: 3000  Loss: 0.09727417677640915  Accuracy: 92.66666666666667 %
    Iteration: 3500  Loss: 0.42934906482696533  Accuracy: 92.6547619047619 %
    Iteration: 4000  Loss: 0.09869173169136047  Accuracy: 94.19047619047619 %
    Iteration: 4500  Loss: 0.2372802197933197  Accuracy: 95.20238095238095 %
    Iteration: 5000  Loss: 0.10717732459306717  Accuracy: 95.19047619047619 %
    Iteration: 5500  Loss: 0.23859672248363495  Accuracy: 94.69047619047619 %
    Iteration: 6000  Loss: 0.15453924238681793  Accuracy: 96.05952380952381 %
    Iteration: 6500  Loss: 0.07914035022258759  Accuracy: 95.97619047619048 %
    Iteration: 7000  Loss: 0.12296199798583984  Accuracy: 96.27380952380952 %
    Iteration: 7500  Loss: 0.10664860904216766  Accuracy: 96.11904761904762 %
    

     第三部分:可视化展示

     
     
     

     

  • 相关阅读:
    Python之路第一课Day1--随堂笔记
    前端面试题汇总
    全国计算机二级python备考
    小程序体检评分优化
    自己配置webpack报错总结
    npm install 报错npm WARN tar ENOENT: no such file or directory和npm ERR! cb() never called!可能的原因
    vue 里面使用sass进行代码复用mixin简单用法
    用openlayers初始化地图碰到过的 地图不显示的问题 VUE
    element el-table表格树状图全选/取消 子节点无法选中问题
    element 树形结构自定义节点图标
  • 原文地址:https://www.cnblogs.com/zhuozige/p/14696747.html
Copyright © 2011-2022 走看看