zoukankan      html  css  js  c++  java
  • PyTorch(一)Basics

    import torch 
    import torchvision
    import torch.nn as nn
    import numpy as np
    import torchvision.transforms as transforms
    
    
    # ================================================================== #
    #                         Table of Contents                          #
    # ================================================================== #
    
    # 1. Basic autograd example 1               (Line 25 to 39)
    # 2. Basic autograd example 2               (Line 46 to 83)
    # 3. Loading data from numpy                (Line 90 to 97)
    # 4. Input pipline                          (Line 104 to 129)
    # 5. Input pipline for custom dataset       (Line 136 to 156)
    # 6. Pretrained model                       (Line 163 to 176)
    # 7. Save and load model                    (Line 183 to 189) 
    
    
    # ================================================================== #
    #                     1. Basic autograd example 1                    #
    # ================================================================== #
    
    # Create tensors.
    x = torch.tensor(1., requires_grad=True)
    w = torch.tensor(2., requires_grad=True)
    b = torch.tensor(3., requires_grad=True)
    
    # Build a computational graph.
    y = w * x + b    # y = 2 * x + 3
    
    # Compute gradients.
    y.backward()
    
    # Print out the gradients.
    print(x.grad)    # x.grad = 2 
    print(w.grad)    # w.grad = 1 
    print(b.grad)    # b.grad = 1 
    
    
    # ================================================================== #
    #                    2. Basic autograd example 2                     #
    # ================================================================== #
    
    # Create tensors of shape (10, 3) and (10, 2).
    x = torch.randn(10, 3)
    y = torch.randn(10, 2)
    
    # Build a fully connected layer.
    linear = nn.Linear(3, 2) # x*weight^T + bias <--> y
    print('w: ', linear.weight) # (out_features, in_features)
    print('b: ', linear.bias)   # out_features
    
    # Build loss function and optimizer.
    criterion = nn.MSELoss(reduction='elementwise_mean') # mean square error
    optimizer = torch.optim.SGD(linear.parameters(), lr=0.01)
    
    # Forward pass.
    pred = linear(x)
    
    # Compute loss.
    loss = criterion(pred, y)
    print('loss: ', loss.item())
    
    # Backward pass.
    loss.backward()
    
    # Print out the gradients.
    print('dL/dw: ', linear.weight.grad)
    print('dL/db: ', linear.bias.grad)
    
    # 1-step gradient descent(one forward and backward).
    optimizer.step()
    
    # You can also perform gradient descent at the low level.
    # linear.weight.data.sub_(0.01 * linear.weight.grad.data)
    # linear.bias.data.sub_(0.01 * linear.bias.grad.data)
    
    # Print out the loss after 1-step gradient descent.
    pred = linear(x)
    loss = criterion(pred, y)
    print('loss after 1 step optimization: ', loss.item())
    
    
    # ================================================================== #
    #                     3. Loading data from numpy                     #
    # ================================================================== #
    
    # Create a numpy array.
    x = np.array([[1, 2], [3, 4]])
    
    # Convert the numpy array to a torch tensor.
    y = torch.from_numpy(x)
    
    # Convert the torch tensor to a numpy array.
    z = y.numpy()
    
    
    # ================================================================== #
    #                         4. Input pipline                           #
    # ================================================================== #
    
    # Download and construct CIFAR-10 dataset.
    train_dataset = torchvision.datasets.CIFAR10(root='../../data/',
                                                 train=True, 
                                                 transform=transforms.ToTensor(),
                                                 download=True)
    
    # Fetch one data pair (read data from disk).
    image, label = train_dataset[0]
    print (image.size())
    print (label)
    
    # Data loader (this provides queues and threads in a very simple way).
    train_loader = torch.utils.data.DataLoader(dataset = train_dataset,
                                               batch_size = 64,
                                               shuffle = True)
    
    # When iteration starts, queue and thread start to load data from files.
    data_iter = iter(train_loader)
    
    # Mini-batch images and labels.
    images, labels = data_iter.next()
    
    # Actual usage of the data loader is as below.
    for batch_idx, (image, labels) in enumerate(train_loader, 0):
        # Training code should be written here.
        pass
    
    
    # ================================================================== #
    #                5. Input pipline for custom dataset                 #
    # ================================================================== #
    
    # You should your build your custom dataset as below.
    class CustomDataset(torch.utils.data.Dataset):
        def __init__(self):
            # TODO
            # 1. Initialize file paths or a list of file names.
            pass
            # xy = np.loadtxt('../../data/diabets.csv.gz')
            # self.len = xy.shape[0]
            # self.x_data = torch.from_numpy(xy[:, 0:-1])
            # self.y_data = torch.from_numpy(xy[:, [-1]])
    
        def __getitem__(self, index):
            # TODO
            # 1. Read one data from file (e.g. using numpy.fromfile, PIL.Image.open).
            # 2. Preprocess the data (e.g. torchvision.Transform).
            # 3. Return a data pair (e.g. image and label).
            pass
            # return self.x_data[index], self.y_data[index]
    
        def __len__(self):
            # You should change 0 to the total size of your dataset.
            return 0
            # return self.len
    
    # You can then use the prebuilt data loader. 
    custom_dataset = CustomDataset()
    train_loader = torch.utils.data.DataLoader(dataset=custom_dataset,
                                               batch_size=32,
                                               shuffle=True)
    
    
    # ================================================================== #
    #                        6. Pretrained model                         #
    # ================================================================== #
    
    # Download and load the pretrained ResNet-18.
    resnet = torchvision.models.resnet18(pretrained=True)
    
    # If you want to finetune only the top layer of the model, set as below.
    for param in resnet.parameters():
        param.requires_grad = False
    
    # Replace the top layer for finetuning.
    resnet.fc = nn.Linear(resnet.fc.in_features, 100)  # 100 is an example.
    
    # Forward pass.
    images = torch.randn(64, 3, 224, 224)
    outputs = resnet(images)
    print (outputs.size())     # (64, 100)
    
    
    # ================================================================== #
    #                      7. Save and load the model                    #
    # ================================================================== #
    
    # Save and load the entire model.
    torch.save(resnet, 'model.ckpt')
    model = torch.load('model.ckpt')
    
    # Save and load only the model parameters (recommended).
    torch.save(resnet.state_dict(), 'params.ckpt')
    resnet.load_state_dict(torch.load('params.ckpt'))
    import torch
    import torch.nn as nn
    import numpy as np
    import matplotlib.pyplot as plt
    
    
    # Hyper-parameters
    input_size = 1
    output_size = 1
    num_epochs = 60
    learning_rate = 0.001
    
    # Toy dataset
    x_train = np.array([[3.3], [4.4], [5.5], [6.71], [6.93], [4.168], 
                        [9.779], [6.182], [7.59], [2.167], [7.042], 
                        [10.791], [5.313], [7.997], [3.1]], dtype=np.float32)
    
    y_train = np.array([[1.7], [2.76], [2.09], [3.19], [1.694], [1.573], 
                        [3.366], [2.596], [2.53], [1.221], [2.827], 
                        [3.465], [1.65], [2.904], [1.3]], dtype=np.float32)
    
    # Linear regression model
    model = nn.Linear(input_size, output_size)
    
    # Loss and optimizer
    criterion = nn.MSELoss()
    optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)  
    
    # Train the model
    for epoch in range(num_epochs):
        # Convert numpy arrays to torch tensors
        inputs = torch.from_numpy(x_train)
        targets = torch.from_numpy(y_train)
    
        # Forward pass
        outputs = model(inputs)
        loss = criterion(outputs, targets)
        
        # Backward and optimize
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        
        if (epoch+1) % 5 == 0:
            print ('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item()))
    
    # Plot the graph
    predicted = model(torch.from_numpy(x_train)).detach().numpy()
    plt.plot(x_train, y_train, 'ro', label='Original data')
    plt.plot(x_train, predicted, label='Fitted line')
    plt.legend()
    plt.show()
    
    # Save the model checkpoint
    torch.save(model.state_dict(), 'model.ckpt')
    import torch
    import torch.nn as nn
    import torchvision
    import torchvision.transforms as transforms
    
    
    # Hyper-parameters 
    input_size = 784
    num_classes = 10
    num_epochs = 5
    batch_size = 100
    learning_rate = 0.001
    
    # MNIST dataset (images and labels)
    train_dataset = torchvision.datasets.MNIST(root='../../data', 
                                               train=True, 
                                               transform=transforms.ToTensor(),
                                               download=True)
    
    test_dataset = torchvision.datasets.MNIST(root='../../data', 
                                              train=False, 
                                              transform=transforms.ToTensor())
    
    # Data loader (input pipeline)
    train_loader = torch.utils.data.DataLoader(dataset=train_dataset, 
                                               batch_size=batch_size, 
                                               shuffle=True)
    
    test_loader = torch.utils.data.DataLoader(dataset=test_dataset, 
                                              batch_size=batch_size, 
                                              shuffle=False)
    
    # Logistic regression model
    model = nn.Linear(input_size, num_classes)
    
    # Loss and optimizer
    # nn.CrossEntropyLoss() computes softmax internally
    criterion = nn.CrossEntropyLoss()  
    optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)  
    
    # Train the model
    total_step = len(train_loader)
    for epoch in range(num_epochs):
        for i, (images, labels) in enumerate(train_loader):
            # Reshape images to (batch_size, input_size)
            images = images.reshape(-1, 28*28)
            
            # Forward pass
            outputs = model(images)
            loss = criterion(outputs, labels)
            
            # Backward and optimize
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
            
            if (i+1) % 100 == 0:
                print ('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}' 
                       .format(epoch+1, num_epochs, i+1, total_step, loss.item()))
    
    # Test the model
    # In test phase, we don't need to compute gradients (for memory efficiency)
    with torch.no_grad():
        correct = 0
        total = 0
        for images, labels in test_loader:
            images = images.reshape(-1, 28*28)
            outputs = model(images)
            _, predicted = torch.max(outputs.data, 1)
            total += labels.size(0)
            correct += (predicted == labels).sum()
    
        print('Accuracy of the model on the 10000 test images: {} %'.format(100 * correct / total))
    
    # Save the model checkpoint
    torch.save(model.state_dict(), 'model.ckpt')
    import torch
    import torch.nn as nn
    import torchvision
    import torchvision.transforms as transforms
    
    
    # Device configuration
    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    
    # Hyper-parameters 
    input_size = 784
    hidden_size = 500
    num_classes = 10
    num_epochs = 5
    batch_size = 100
    learning_rate = 0.001
    
    # MNIST dataset 
    train_dataset = torchvision.datasets.MNIST(root='../../data', 
                                               train=True, 
                                               transform=transforms.ToTensor(),  
                                               download=True)
    
    test_dataset = torchvision.datasets.MNIST(root='../../data', 
                                              train=False, 
                                              transform=transforms.ToTensor())
    
    # Data loader
    train_loader = torch.utils.data.DataLoader(dataset=train_dataset, 
                                               batch_size=batch_size, 
                                               shuffle=True)
    
    test_loader = torch.utils.data.DataLoader(dataset=test_dataset, 
                                              batch_size=batch_size, 
                                              shuffle=False)
    
    # Fully connected neural network with one hidden layer
    class NeuralNet(nn.Module):
        def __init__(self, input_size, hidden_size, num_classes):
            super(NeuralNet, self).__init__()
            self.fc1 = nn.Linear(input_size, hidden_size) 
            self.relu = nn.ReLU()
            self.fc2 = nn.Linear(hidden_size, num_classes)  
        
        def forward(self, x):
            out = self.fc1(x)
            out = self.relu(out)
            out = self.fc2(out)
            return out
    
    model = NeuralNet(input_size, hidden_size, num_classes).to(device)
    
    # Loss and optimizer
    criterion = nn.CrossEntropyLoss()
    optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)  
    
    # Train the model
    total_step = len(train_loader)
    for epoch in range(num_epochs):
        for i, (images, labels) in enumerate(train_loader):  
            # Move tensors to the configured device
            images = images.reshape(-1, 28*28).to(device)
            labels = labels.to(device)
            
            # Forward pass
            outputs = model(images)
            loss = criterion(outputs, labels)
            
            # Backward and optimize
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
            
            if (i+1) % 100 == 0:
                print ('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}' 
                       .format(epoch+1, num_epochs, i+1, total_step, loss.item()))
    
    # Test the model
    # In test phase, we don't need to compute gradients (for memory efficiency)
    with torch.no_grad():
        correct = 0
        total = 0
        for images, labels in test_loader:
            images = images.reshape(-1, 28*28).to(device)
            labels = labels.to(device)
            outputs = model(images)
            _, predicted = torch.max(outputs.data, 1)
            total += labels.size(0)
            correct += (predicted == labels).sum().item()
    
        print('Accuracy of the network on the 10000 test images: {} %'.format(100 * correct / total))
    
    # Save the model checkpoint
    torch.save(model.state_dict(), 'model.ckpt')
  • 相关阅读:
    rand()和srand()关系很简单——一看就明白(通过一个可移植的源码)
    opencart配置mail服务
    dedecms mysql连接错误:#1040
    自动获取访客QQ
    apache虚拟目录设置
    在XAMPP上建立多个域名的站点
    QQ互联不能使用的通用解决方法
    织梦系统与discuz论坛整合方法
    DEDECMS整站复制
    DEDECMS模板中dede标签使用php和if判断语句的方法
  • 原文地址:https://www.cnblogs.com/xuanyuyt/p/9693849.html
Copyright © 2011-2022 走看看