我是pytorch的新手。这是张量流模型的架构,我想将其转换为pytorch模型。
我已经完成了大多数代码,但对一些地方感到困惑。
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
谢谢!
答案 0 :(得分:0)
1)在pytorch中,我们将输入通道和输出通道作为输入。在第一层中,输入通道将是图像中颜色通道的数量。之后,它总是与上一层的输出通道相同(输出通道由Tensorflow中的滤镜参数指定)。
2)。 Pytorch有点令人讨厌,因为在平移转换输出时,您必须自己计算形状。您可以使用方程式来计算该值(???=(?−? +2?)/?+ 1),也可以使用形状计算功能来获取虚拟图像通过网络的conv部分后的形状。此参数将是您输入参数的大小;输出参数的大小将仅是您在下一个完全连接的层中所需的节点数。