python - TensorFlow 版本的 Pytorch 变换
问题描述
在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 模型,但是,我不确定如何在推理之前对图像进行类似的转换,因为似乎没有tensorflow或keras等价物。有什么建议吗?
解决方案
这是一些指针,在pytorch中你有
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));
在tensorflow中,您可以按如下方式实现
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
,我认为您应该考虑这一点。