Как я могу сделать нейронную сеть, которая имеет несколько выходов, используя pytorch? - PullRequest
1 голос
/ 12 марта 2019

Прав ли мой вопрос? Я искал везде, но не мог найти ни одной вещи. Я почти уверен, что это было решено, когда я изучил keras, но как мне реализовать это в pytorch?

Ответы [ 3 ]

3 голосов
/ 14 марта 2019

Несколько выходов могут быть достигнуты с помощью pytorch.

Вот одна из таких сетей.

import torch.nn as nn

class NeuralNetwork(nn.Module):
  def __init__(self):
    super(NeuralNetwork, self).__init__()
    self.linear1 = nn.Linear(in_features = 3, out_features = 1)
    self.linear2 = nn.Linear(in_features = 3,out_features = 2)

  def forward(self, x):
    output1 = self.linear1(x)
    output2 = self.linear2(x)
    return output1, output2
3 голосов
/ 12 апреля 2019

Существует несколько способов построения нейронной сети с использованием PyTorch.

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

class Network(nn.Module):
    def __init__(self):
        super().__init__()
        # Inputs to hidden layer linear transformation
        self.hidden = nn.Linear(784, 256)
        # Output layer, 10 units - one for each digit
        self.output = nn.Linear(256, 10)

    def forward(self, x):
        # Hidden layer with sigmoid activation
        x = F.sigmoid(self.hidden(x))
        # Output layer with softmax activation
        x = F.softmax(self.output(x), dim=1)

        return x

Этот класс Network предназначен для обработки цифровых изображений. Последнее число для self.output равно 10, что означает, что у нас будет 10 выходов, по 1 выходу на каждую цифру. Мы помещаем функцию от output до softmax для вычисления вероятностей классов, т.е. чтобы увидеть, какая цифра имеет наибольшую вероятность для определенного изображения цифры.

Причина, по которой мы добавили опцию dim=1 для softmax, состоит в том, чтобы производить вычисления по столбцам, поэтому вероятностные суммы для каждой строки в сумме составят 1.

Пример:

>>> input = torch.tensor([[1., 2., 3.], [2., 1., 3.], [4., 2., 6.]])
>>> F.softmax(input, dim=1)
tensor([[0.0900, 0.2447, 0.6652],
    [0.2447, 0.0900, 0.6652],
    [0.1173, 0.0159, 0.8668]])
# dim=1, row sums add up to 1

>>> F.softmax(input, dim=0)
tensor([[0.0420, 0.4223, 0.0453],
    [0.1142, 0.1554, 0.0453],
    [0.8438, 0.4223, 0.9094]])
# dim=0, column sums add up to 1

Та же модель может быть построена с использованием nn.Sequential:

# Hyperparameters for our network
input_size = 784
hidden_sizes = [128, 64]
output_size = 10

# Build a feed-forward network
model = nn.Sequential(nn.Linear(input_size, hidden_sizes[0]),
                      nn.ReLU(),
                      nn.Linear(hidden_sizes[0], hidden_sizes[1]),
                      nn.ReLU(),
                      nn.Linear(hidden_sizes[1], output_size),
                      nn.Softmax(dim=1))

Вы можете проверить страницу Gitub Udacity для глубокого обучения с PyTorch для более подробного объяснения. Приведенные выше примеры взяты из Часть 2 - Нейронные сети в PyTorch . Часть их содержания Deep Learning Nanodegree также доступна в виде бесплатного курса , введение в глубокое обучение с PyTorch .

1 голос
/ 13 марта 2019

Если вы смотрите на мультиклассовую классификацию и для простой нейронной сети, вы можете сделать это несколькими способами, как новичок, пытаясь создать класс как подкласс nn.Module в PyTorch, чтобы начать с

class Network(nn.Module):
    def __init__(self):
        super().__init__()

        # Inputs to hidden layer linear transformation
        self.hidden = nn.Linear(784, 256)
        # Output layer, 10 units - one for each digit
        self.output = nn.Linear(256, 10)

        # Define sigmoid activation and softmax output 
        self.sigmoid = nn.Sigmoid()
        self.softmax = nn.Softmax(dim=1)

    def forward(self, x):
        # Pass the input tensor through each of our operations
        x = self.hidden(x)
        x = self.sigmoid(x)
        x = self.output(x)
        x = self.softmax(x)

        return x
model = Network()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...