首页 > 解决方案 > TensorFlow 版本的 Pytorch 变换

问题描述

模型中执行推理之前,我有以下代码用于准备图像:

def image_loader(transform, image_name):
    image = Image.open(image_name)
    #transform
    image = transform(image).float()
    image = torch.tensor(image)
    image = image.unsqueeze(0)
    return image

data_transforms = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])

我已经将模型转换为 Tensorflow 模型,但是,我不确定如何在推理之前对图像进行类似的转换,因为似乎没有等价物。有什么建议吗?

标签: pythontensorflowmachine-learningkeraspytorch

解决方案


这是一些指针,在中你有

from torchvision import transforms
from PIL import Image 
import torch 

def image_loader(transform, image_name):
    image = Image.open(image_name).convert('RGB')
    image = transform(image).float()
    image = torch.tensor(image)
    image = image.unsqueeze(0)
    return image

data_transforms = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])

# check: visualize 
i = image_loader(data_transforms, '/content/1.png')
i.shape

plt.figure(figsize=(25,10))
subplot(121); imshow(np.array(i[0]).transpose(1, 2, 0)); 

中,您可以按如下方式实现

def transform(image, mean, std):
    for channel in range(3):
        image[:,:,channel] = (image[:,:,channel] - mean[channel]) / std[channel]
    return image

def image_loader(image_name):
    image = Image.open(image_name).convert('RGB')
    image = transform(np.array(image)/255, 
                       mean=[0.485, 0.456, 0.406], 
                       std=[0.229, 0.224, 0.225])
    image = tf.cast(image, tf.float32)
    image = tf.expand_dims(image, 0)
    return image 

# check: visualize 
i = image_loader('/content/1.png')
i.shape 

plt.figure(figsize=(25,10))
subplot(121); imshow(i[0]); 

这应该输出相同。注意,在第二种情况下,我们transform从另一个 OP 定义函数,在这里,没关系,但是,您也可以检查tf. keras...Normalization,有关详细信息,请参阅此答案。仅供参考,我认为您在 pytorch 中对输入进行了两次标准化,transform.ToTensor其中从[0..255]to[0..1]和 next转换为transform.Normalize,我认为您应该考虑这一点。


推荐阅读