pytorchで3Dresnetの中間層の特徴量(batch, 2048)を取り出したいのですがうまく行きません。
kerasでは慣れていたので簡単にできたのですが、resnetの最終出力層の前の特徴量shape(batch, 2048)を取り出すにはどうしたら良いでしょうか?ご教授お願いします。
普通の2Dのresnetではうまくいきました
ネットワーク
python
1print(model) 2>>> 3〜中略〜 4 (bn3): BatchNorm3d(2048, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True) 5 (relu): ReLU(inplace) 6 ) 7 ) 8 (avgpool): AdaptiveAvgPool3d(output_size=(1, 1, 1)) 9 (fc): Linear(in_features=2048, out_features=101, bias=True) 10 ) 11)
コード
python
1device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") 2class Identity(nn.Module): 3 def __init__(self): 4 super(Identity, self).__init__() 5 6 def forward(self, x): 7 return x 8 9def ToNumpy(tensor): 10 return tensor.to('cpu').detach().numpy().copy() 11 12tmp_model = model 13tmp_model.fc = Identity() 14inputs_ = inputs.to(device) 15output_ = tmp_model(inputs_) 16outputs_ = ToNumpy(output_) 17print('numpy output', type(outputs_), outputs_.shape) 18 19#>>>> 20#outputting..... 21#numpy output <class 'numpy.ndarray'> (16, 101)
普通のresnetで試したとき
python
1import cv2 2import numpy as np 3from torchvision import models 4import torch 5from torch import nn 6 7path = 't.jpeg' 8model = models.resnet50(pretrained=True) 9img = cv2.imread(path, 1) 10img = np.float32(cv2.resize(img, (224, 224))) / 255 11input = preprocess_image(img) 12device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") 13# extract feature 14model.fc = Identity() 15inputs = input.to(device) 16output = model(inputs) 17 18# convert numpy and save 19outputs = ToNumpy(output) 20>>>> 21# shape==(1, 2048)
回答1件
あなたの回答
tips
プレビュー