Как преобразовать модель тензорного потока в модель pytorch? - PullRequest
0 голосов
/ 09 мая 2020

Я новичок в pytorch. Вот архитектура модели тензорного потока, и я хотел бы преобразовать ее в модель pytorch. enter image description here

Я выполнил большинство кодов, но в некоторых местах меня смущает.

1) В тензорном потоке функция Conv2D принимает фильтр в качестве входных данных. Однако в pytorch функция принимает размер входных и выходных каналов в качестве входных данных. Итак, как мне найти эквивалентное количество входных и выходных каналов с учетом размера фильтра.

2) В тензорном потоке плотный слой имеет параметр, называемый «узлами». Однако в pytorch один и тот же слой имеет 2 разных входа (размер входных параметров и размер целевых параметров), как мне определить их на основе количества узлов.

Вот код тензорного потока .

from keras.utils import to_categorical
from keras.models import Sequential, load_model
from keras.layers import Conv2D, MaxPool2D, Dense, Flatten, Dropout

model = Sequential()
model.add(Conv2D(filters=32, kernel_size=(5,5), activation='relu', input_shape=X_train.shape[1:]))
model.add(Conv2D(filters=32, kernel_size=(5,5), activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(rate=0.25))
model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu'))
model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2)))
model.add(Dropout(rate=0.25))
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(rate=0.5))
model.add(Dense(43, activation='softmax'))

Вот мой код:

import torch.nn.functional as F
import torch



# The network should inherit from the nn.Module
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        # Define 2D convolution layers
        # 3: input channels, 32: output channels, 5: kernel size, 1: stride
        self.conv1 = nn.Conv2d(3, 32, 5, 1)   # The size of input channel is 3 because all images are coloured
        self.conv2 = nn.Conv2d(32, 64, 5, 1)
        self.conv3 = nn.Conv2d(64, 128, 3, 1)
        self.conv3 = nn.Conv2d(128, 256, 3, 1)
        # It will 'filter' out some of the input by the probability(assign zero)
        self.dropout1 = nn.Dropout2d(0.25)
        self.dropout2 = nn.Dropout2d(0.5)
        # Fully connected layer: input size, output size
        self.fc1 = nn.Linear(36864, 128)
        self.fc2 = nn.Linear(128, 10)

    # forward() link all layers together,
    def forward(self, x):
        x = self.conv1(x)
        x = F.relu(x)
        x = self.conv2(x)
        x = F.relu(x)
        x = F.max_pool2d(x, 2)
        x = self.dropout1(x)
        x = self.conv3(x)
        x = F.relu(x)
        x = self.conv4(x)
        x = F.relu(x)
        x = F.max_pool2d(x, 2)
        x = self.dropout1(x)
        x = torch.flatten(x, 1)
        x = self.fc1(x)
        x = F.relu(x)
        x = self.dropout2(x)
        x = self.fc2(x)
        output = F.log_softmax(x, dim=1)
        return output

Заранее спасибо!

1 Ответ

0 голосов
/ 09 мая 2020

1) В pytorch мы принимаем входные каналы и выходные каналы как входные. В вашем первом слое входными каналами будет количество цветовых каналов в вашем изображении. После этого он всегда будет таким же, как выходные каналы из вашего предыдущего слоя (выходные каналы задаются параметром фильтров в Tensorflow).

2). Pytorch немного раздражает тем фактом, что при выравнивании выходных данных conv вам придется вычислять форму самостоятельно. Вы можете использовать уравнение для вычисления этого (??? = (? − ? + 2?) / ? + 1) или создать функцию вычисления формы, чтобы получить форму фиктивного изображения после того, как оно было передано через conv-часть сети. . Этот параметр будет вашим размером входного аргумента; размер вашего выходного аргумента будет просто количеством узлов, которые вы хотите в следующем полностью подключенном слое.

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