python - 在 def init PyTorch 中获取 CNN 层输出大小
问题描述
在 PyTorch 中定义我们的模型架构时,我们需要指定 CNN 输出层的大小以馈入该nn.Linear
层。我们如何在def __init__
函数中找到这一层的大小(不是在def forward()
)
class model(nn.Module):
def __init__(self,word_count,img_channel,n_out):
super(multimodal,self).__init__()
# CNN image encoding hyperparameters
conv1_channel_out = 8
conv1_kernel = 5
pool1_size = 2
conv2_channel_out = 16
conv2_kernel = 16
pool2_size = 2
conv3_channel_out = 32
conv3_kernel = 4
dropout_rate = 0.1
cnn_fc_out = 512
comb_fc1_out = 512
comb_fc2_out = 128
# FNN text encoding hyperparameters
text_fc1_out = 4096
text_fc2_out = 512
# Text encoding
self.text_fc1 = nn.Linear(word_count, text_fc1_out)
self.text_fc2 = nn.Linear(text_fc1_out, text_fc2_out)
# Image encoding
self.conv1 = nn.Conv2d(img_channel, conv1_channel_out, conv1_kernel)
self.max_pool1 = nn.MaxPool2d(pool1_size)
self.conv2 = nn.Conv2d(conv1_channel_out, conv2_channel_out, conv2_kernel)
self.max_pool2 = nn.MaxPool2d(pool2_size)
self.conv3 = nn.Conv2d(conv2_channel_out, conv3_channel_out, conv3_kernel)
self.cnn_dropout = nn.Dropout(dropout_rate)
self.cnn_fc = nn.Linear(32*24*12, cnn_fc_out)
#Concat layer
concat_feat = cnn_fc_out + text_fc2_out
self.combined_fc1 = nn.Linear(concat_feat, comb_fc1_out)
self.combined_fc2 = nn.Linear(comb_fc1_out, comb_fc2_out)
self.output_fc = nn.Linear(comb_fc2_out, n_out)
def forward(self, text, img):
# Image Encoding
x = F.relu(self.conv1(img))
x = self.max_pool1(x)
x = F.relu(self.conv2(x))
x = self.max_pool2(x)
x = F.relu(self.conv3(x))
x = x.view(-1, 32*24*12)
x = self.cnn_dropout(x)
img = F.relu(self.cnn_fc(x))
# Text Encoding
text = F.relu(self.text_fc1(text))
text = F.relu(self.text_fc2(text))
# Concat the features
concat_inp = torch.cat((text, img), 1)
out = F.relu(self.combined_fc1(concat_inp))
out = F.relu(self.combined_fc2(out))
return torch.sigmoid(self.output_fc(out))
如果你看到上面,我手动
定义了 CNN 输出层的大小为 32 24 12self.cnn_fc = nn.Linear(32*24*12, cnn_fc_out)
我怎样才能避免这种情况?我知道我们也许可以打电话[model_name].[layer_name].in_features
,def forward()
但不能def __init__()
解决方案
我认为没有特定的方法可以做到这一点。您必须运行一个示例(您可以仅x = torch.rand((1, C, W, H))
用于测试),然后在线性层之前打印出 conv 层的形状,然后记住该数字并将其硬编码到init中。或者您可以使用公式根据输入的尺寸、内核大小、填充等来计算卷积层的形状。这是关于这些公式的线程。
推荐阅读
- html - 无法将徽标调整到特定高度
- java - 如何在 Hazelcast 的 IMap 中选择多个键?
- ios - what could "unrecognized selector sent to instance 0x7fe81c721d20" 0x0000600000e3c580" mean?
- kubernetes - Use of containerPort in kubernetes POD definition
- r - using the "For" loop to estimate ARIMA models of different order
- pdf - Is there a way to set a file name when jspdf output()
- python - ERROE using Auto Py to Exe
- python - When I swap out return for print, I don' t get all the same values back
- regex - How to check a date value according to yyyy-mm-dd pattern in bash?
- python - AttributeError: 'NoneType' object has no attribute 'find_all' Python Web Scraping w/ Beautiful Soup