1.把vgg16用在单通道灰度图上,具体做法就是直接将第一个卷积层的输入通道改为1
附完整代码:
import torch
from torch import nn
from torchvision.models.vgg import vgg16
from PIL import Image
import torchvision.transforms as transforms
img_to_tensor = transforms.ToTensor()
from torch.autograd import Variable
import numpy as np
vgg = vgg16(pretrained=True)
#更改vgg网络的input为单通道
vgg.features[0]=nn.Conv2d(1, 64, kernel_size=3, padding=1)
def inference(model, imgpath):
model.eval() # 必需,否则预测结果是错误的
img = Image.open(imgpath)
img = img.resize((224, 224))
tensor = img_to_tensor(img)
tensor = tensor.resize_(1, 1, 224, 224)
result = model(Variable(tensor))
result_npy = result.data.cpu().numpy() # 将结果传到CPU,并转换为numpy格式
max_index = np.argmax(result_npy[0])
return max_index
imgpath = 'F:\pycharmProject\SRGAN-master\grey.png'
print(inference(vgg, imgpath))
2.vgg16模型减半,以pre_trained vgg16权重作为初始权重,重新训练vgg16(思路是这样,我还没运行过,因为还没下载ImageNet数据集,大家借鉴思路就行了)
附完整代码:
import torch
from torch import nn
from torchvision.models.vgg import vgg16
from PIL import Image
import torchvision.transforms as transforms
import torchvision.datasets as dsets
img_to_tensor = transforms.ToTensor()
from torch.autograd import Variable
import numpy as np
import torch.optim as optim
EPOCH=50
BATCH=4
LEARNING_RATE = 0.01
#process data
transform = transforms.Compose([
transforms.RandomSizedCrop(224),
transforms.RandomHorizontalFlip(),
transforms.ToTensor(),
transforms.Normalize(mean = [ 0.485, 0.456, 0.406 ],
std = [ 0.229, 0.224, 0.225 ]),