Линейный слой также называют полносвязным слоем. Этот слой помогает преобразовать размерность вывода предыдущего слоя.

В следующем коде мы импортируем модуль torch, из которого мы сможем преобразовать размерность вывода предыдущего слоя:

  • inp = torch.randn(15, 9) используется в качестве входного значения.
  • вес = torch.randn(7,9) используется для генерации веса.
  • torch.mm(inp,weght.t()) используется как умножение матриц.
  • lay=nn.Linear(in_features=9,out_features=7,bias=False) используется для создания сети прямой связи.
  • lay.weght=nn.Parameter(weght) используется для определения веса.
import torch
import torch.nn as nn
 
inp = torch.randn(15, 9)
weght = torch.randn(7,9)
 
torch.mm(inp,weght.t())
lay=nn.Linear(in_features=9,out_features=7,bias=False)
lay.weght=nn.Parameter(weght)
lay.weght
lay(inp)

Выход:

После запуска приведенного выше кода мы получаем следующий вывод, в котором видим, что на экране отображается полносвязный слой PyTorch.

Полносвязный слой PyTorch

Содержание

Инициализация полносвязного слоя

Линейный слой используется на последнем этапе нейронной сети. Линейный слой также называют полносвязным слоем.

Линейный слой инициализируется и помогает преобразовать размерность выходных данных предыдущего слоя.

Для этого модель может легко объяснить взаимосвязь между значениями данных.

В следующем коде мы импортируем модуль факела, из которого мы сможем инициализировать полносвязный слой:

  • nn.Conv2d() используется для применения 2d-свертки к входным данным.
  • nn.Dropout2d() используется для обеспечения независимости между картами объектов.
  • self.fc = nn.Linear(9218, 130) используется как первый полносвязный слой.
  • self.fc1 = nn.Linear(130, 12) используется как второй полносвязный слой.
  • print(nnmodel) используется для печати модели.
import torch as tor
import torch.nn as nn
import torch.nn.functional as fun
class model(nn.Module):
    def __init__(self):
      super(model, self).__init__()

      self.conv = nn.Conv2d(3, 34, 5, 3)
      self.conv1 = nn.Conv2d(34, 66, 5, 3)

      self.dropout = nn.Dropout2d(0.27)
      self.dropout1 = nn.Dropout2d(0.7)
      self.fc = nn.Linear(9218, 130)
      # Second fully connected layer that outputs our 10 labels
      self.fc1 = nn.Linear(130, 12)

nnmodel = model()
print(nnmodel)

Выход:

В следующем выводе мы видим, что полностью подключенный уровень успешно инициализируется.

Инициализация полносвязного слоя

Входные данные

«Полносвязный слой» умножает входные данные на матрицу весов и добавляет бай по весу. Входные данные нейронной сети представляют собой тип Batch_size*channel_number*Height*Weight.

В следующем коде мы импортируем модуль torch, из которого мы сможем получить входной размер:

  • nn.Conv2d() ожидает, что входные данные будут иметь форму pack_size, input_channels, input_height, input_width.
  • nn.Linear() используется в качестве нейронной сети прямого распространения.
  • print(fc) используется для печати полностью связанной нейронной сети.
import torch
import torch.nn as nn
import torch.nn.functional as fun
class fcmodel(nn.Module):
    def __init__(self):
        super(fcmodel, self).__init__()
        self.conv = nn.Conv2d(5, 8, 7)
        self.pool  = nn.MaxPool2d(2,2)
        self.conv1 = nn.Conv2d(8, 18, 7)
        self.fc  = nn.Linear(16*5*5, 120)
        self.fc1   = nn.Linear(140, 86)
        self.fc2  = nn.Linear(86, 12)

    def forward(self, y):
        y = self.pool(fun.relu(self.conv(y)))
        y = self.pool(fun.relu(self.conv1(y)))
        y = y.view(-1, 16*5*5)
        y = fun.relu(self.fc(y))
        y = fun.relu(self.fc1(y))
        y = self.fc2(y)
        return y

fc = fcmodel()
print(fc)

Выход:

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

Размер ввода полностью подключенного слоя PyTorch

Полносвязный слой CNN

CNN — самый популярный метод решения задач компьютерного зрения, например, обнаружения объектов. CNN ищет закономерности на изображении.

Линейный слой используется на последнем этапе сверточной нейронной сети. Линейный слой также называют полносвязным слоем.

В следующем коде мы импортируем модуль torch, из которого мы сможем создать полносвязный слой cnn:

  • def вперед(self, y) здесь y представляет наши данные.
  • y = self.conv(y) используется для передачи данных через conv.
  • y = func.relu(y) используется выпрямленная линейная функция активации по y.
  • y = func.max_pool2d(y, 2) используется для запуска максимального пула по y.
  • y = self.dropout(y) используется для передачи данных через исключение.
  • y = torch.flatten(y, 1) используется как сглаживание y с start_dim 1.
  • y = self.fc(y) используется для передачи данных через fc.
  • print(cnn) используется для печати слоя cnn.
import torch
import torch.nn as nn
import torch.nn.functional as func
class cnnfc(nn.Module):
    def __init__(self):
      super(cnnfc, self).__init__()
      self.conv = nn.Conv2d(3, 34, 5, 3)
      self.conv1 = nn.Conv2d(34, 66, 5, 3)
      self.dropout = nn.Dropout2d(0.30)
      self.dropout1 = nn.Dropout2d(0.10)
      self.fc = nn.Linear(9218, 130)
      self.fc1 = nn.Linear(130, 15)


    def forward(self, y):

      y = self.conv(y)
      y = func.relu(y)

      y = self.conv1(y)
      y = func.relu(y)

      y = func.max_pool2d(y, 2)

      y = self.dropout(y)

      y = torch.flatten(y, 1)

      y = self.fc(y)
      y = func.relu(y)
      y = self.dropout1(y)
      y = self.fc1(y)
 

cnn = cnnfc()
print(cnn)

Выход:

В следующем выводе мы видим, что полностью подключенный слой PyTorch cnn печатается на экране.

PyTorch cnn полносвязный слой

Полносвязный слой 2d

2-мерный полносвязный слой помогает изменить размерность вывода предыдущего слоя. Модель может легко определить взаимосвязь между значением данных.

В следующем коде мы импортируем модуль torch, из которого мы сможем инициализировать 2D полносвязный слой:

  • nn.Conv2d() используется для выполнения свертки 2D-данных.
  • nn.Linear() используется для создания нейронной сети прямого распространения.
  • modl = model() используется для запуска модели.
  • print(modl) используется для печати модели.
import torch
import torch.nn as nn
import torchvision
import torch.nn.functional as func
import torchvision.transforms as transforms
class model(nn.Module):
    def __init__(self):
        super(model, self).__init__()
        self.conv = nn.Conv2d(in_channels=3, out_channels=34, kernel_size= 7,stride = 3)
        self.conv1 = nn.Conv2d(34, 66, 7, 2)
        self.fc = nn.Linear(66*22*22, 49)
 
    def forward(self, y):
        y = func.relu(self.conv(y))
        y = func.relu(self.conv1(y))
        y = func.max_pool2d(y, 1)
        y = torch.flatten(y, 1)
        y = self.fc(y)
        out = func.log_softmax(y, dim=1)
        return out
# initiating the model
modl = model()
print(modl)

Выход:

После запуска приведенного выше кода мы получаем следующий вывод, в котором видим, что полносвязный слой PyTorch 2d печатается на экране.

2d полносвязный слой

Слой со 128 нейронами

Полностью подключенный уровень определяется как уровень, на котором все входы одного уровня подключены к каждому блоку активации следующего уровня.

В следующем коде мы импортируем модуль torch, из которого сможем создать полносвязный слой со 128 нейронами.

  • self.conv = nn.Conv2d(1, 35,(7, 7), дополнение = 0) используется в качестве свертки с 35 картами функций размером 7 x 7 с активацией ReLU.
  • self.fc = nn.Linear(20 * 7**4, 128) используется как полносвязный слой со 128 нейронами.
  • z = self.conv(y) используется для передачи данных через conv.
  • z = func.relu(z) используется как выпрямленно-линейная функция активации по z.
  • z = func.max_pool2d(z, 2) выполнить максимальное объединение по z.
  • z = self.dropout(z) данные могут передаваться через отсев.
  • z = torch.flatten(z, 1) сгладить z с start_dim = 1.
  • cnn = cnnwithneurons() используется для запуска модели.
import torch 
import torch.nn.functional as func
from torch import nn


class cnnwithneurons(nn.Module):
    def __init__(self):
        super(cnnwithneurons, self).__init__()
        self.conv = nn.Conv2d(1, 35,(7, 7), padding=0)
        self.conv1 = nn.Conv2d(35, 20,(5, 5), padding=0)
        self.fc = nn.Linear(20 * 7**4, 128)
        self.fc1 = nn.Linear(128, 52)
        self.fc2 = nn.Linear(52, 12)

    def forward(self, z):

      z = self.conv(y)

      z = func.relu(z)

      z = self.conv1(z)
      z = func.relu(z)


      z = func.max_pool2d(z, 2)

      z = self.dropout(z)

      z = torch.flatten(z, 1)

      z = self.fc(z)
      z = func.relu(z)
      z = self.dropout1(z)
      z = self.fc1(z)
cnn = cnnwithneurons()
print(cnn)

Выход:

В следующем выводе мы видим, что на экране напечатан полносвязный слой со 128 нейронами.

Полносвязный слой со 128 нейронами

Отсев полносвязного слоя

Техника отсева используется для удаления нейронной сети для имитации одновременного обучения большого количества архитектур.

В следующем коде мы импортируем модуль torch, из которого мы сможем получить полностью связанный слой с выпадением.

  • self.conv = nn.Conv2d(5, 34, 5) ожидает ввода в форме pack_size, input_channels, input_height, input_width.
  • nn.Linear() используется для создания нейронной сети прямого распространения.
  • self.dropout = nn.Dropout(0,27) используется для определения доли выпадающих нейронов.
  • model =dropoutmodel() используется для запуска модели.
  • print(model) используется для печати модели.
import torch
from torch import nn
import torch.nn.functional as func
from torch import nn
class dropoutmodel(nn.Module):
  def __init__(self, input_shape=(3,32,32)):
    super(dropoutmodel, self).__init__()
    
    self.conv = nn.Conv2d(5, 34, 5)
    self.conv1 = nn.Conv2d(34, 66, 5)
    self.conv2 = nn.Conv2d(66, 130, 5)
    
    self.pool = nn.MaxPool2d(2,2)

    
    self.fc = nn.Linear(20 * 9**4, 218)
    self.fc1 = nn.Linear(218, 10)

    # Define proportion or neurons to dropout
    self.dropout = nn.Dropout(0.27)
      
  def forward(self, z):
    z = self._forward_features(z)
    z = z.view(z.size(0), -1)
    z = self.dropout(z)
    z = func.relu(self.fc1(z))
    # Apply dropout
    z = self.dropout(z)
    z = self.fc2(z)
    return z
model =dropoutmodel()
print(model)

Выход:

После запуска приведенного выше кода мы получаем следующий вывод, в котором мы видим, что полносвязный отсев PyTorch печатается на экране.

полносвязный отсев PyTorch печатается на экране

Relu

Прежде чем двигаться дальше, нам нужно иметь некоторые знания о relu. ReLu означает выпрямленную линейную функцию активации. Она также известна как нелинейная функция активации, которая используется в многолинейной нейронной сети.

В следующем коде мы импортируем модуль факела, из которого мы сможем создать полносвязный слой relu.

  • class fcrmodel(nn.Module) используется для определения класса сети.
  • super().__init__() используется для вызова конструктора из суперкласса.
  • nn.Linear() используется для создания нейронной сети прямого распространения.
  • func.relu(self.fc1(z)) используется для определения прямого прохода.
  • rmodl = fcrmodel() используется для запуска модели.
  • print(rmodl) используется для печати архитектуры модели.
import torch
import torch.nn.functional as func
from torch import nn


class fcrmodel(nn.Module):
    def __init__(self):

        super().__init__()
        

        self.fc = nn.Linear(18, 14)
        self.fc1 = nn.Linear(14, 12)
        self.fc2 = nn.Linear(12, 3)
        
    def forward(self, z):

        z = func.relu(self.fc1(z))
        z = func.relu(self.fc2(z))
        z = torch.sigmoid(self.fc3(z))
        return z

rmodl = fcrmodel()

print(rmodl)

Выход:

В следующем выводе мы видим, что активация relu полностью подключенного слоя PyTorch печатается на экране.

relu

Добавить комментарий