#python #tensorflow #pytorch
#python #тензорный поток #pytorch
Вопрос:
Я реализовал код, фильтрующий данные cifar10 с использованием функции gabor. Я не знаю, почему изображения после фильтрации и сложения неясны. Я сомневаюсь, что я не использую наилучшие значения для параметров фильтра gabor. Вот мой код ‘вы можете начать чтение с комментария ‘вычисление сигм ….’ до этого это просто рутинный материал
import torch
import torch.nn as nn
import torch.nn.functional as F
import torchvision
from torchvision import datasets, transforms
import tensorflow as tf
import tensorflow_io as tfio
import numpy as np
import math
from math import pi
from math import sqrt
import matplotlib.pyplot as plt
# Read config to figure out whether to use CUDA.
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# CUDA-related parameters. (Got this from pytorch's official tutorials.)
kwargs = {'num_workers': 1, 'pin_memory': True} if torch.cuda.is_available()else {}
# Load Cifar10 dataset using standard torchvision package.
data_transform = transforms.Compose([transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
cifar_trainset = torch.utils.data.DataLoader(datasets.CIFAR10(root='./data',
train=True, download=True,transform=data_transform),
batch_size= 10, shuffle=True, **kwargs)
cifar_valset = torch.utils.data.DataLoader(datasets.CIFAR10(root='./data',
train=True, download=True,transform=data_transform),
batch_size= 10, shuffle=True, **kwargs)
cifar_testset = torch.utils.data.DataLoader( datasets.CIFAR10(root='./data',
train=False, download=True, transform=data_transform),
batch_size= 10, shuffle=False, **kwargs)
# to show the images before and after gabor filter
def imshow(img):
img = img / 2 0.5 # unnormalize
npimg = img.numpy()
npimg = plt.imshow(np.transpose(npimg, (1, 2, 0)))
#calculating sigmas using the formula from the paper 'Adding biological constraints
#to CNNs makes image classification more human-like and robust'
lambdaa = 5
b = [1,1.4,1.8]
gamma = [0.5,1]
sigma_x1 = (lambdaa/pi)*(sqrt(np.log(2)/2))*((2**b[0] 1)/(2**b[0] - 1))
sigma_x2 = (lambdaa/pi)*(sqrt(np.log(2)/2))*((2**b[1] 1)/(2**b[1] - 1))
sigma_x3 = (lambdaa/pi)*(sqrt(np.log(2)/2))*((2**b[2] 1)/(2**b[2] - 1))
sigma_x4 = (lambdaa/pi)*(sqrt(np.log(2)/2))*((2**b[0] 1)/(2**b[0] - 1))
sigma_x5 = (lambdaa/pi)*(sqrt(np.log(2)/2))*((2**b[1] 1)/(2**b[1] - 1))
sigma_x6 = (lambdaa/pi)*(sqrt(np.log(2)/2))*((2**b[2] 1)/(2**b[2] - 1))
sigma_y1 = sigma_x1/gamma[1]
sigma_y2 = sigma_x2/gamma[1]
sigma_y3 = sigma_x3/gamma[1]
sigma_y4 = sigma_x1/gamma[0]
sigma_y5 = sigma_x2/gamma[0]
sigma_y6 = sigma_x3/gamma[0]
thetas = np.array([0, pi/8, pi/4, pi*3/8, pi/2, pi*5/8, pi*3/4, pi*7/8])
offsets = np.array([0, pi/2, pi, pi*3/2])
sigmas = np.array([[sigma_x1, sigma_y1], [sigma_x2, sigma_y2], [sigma_x3, sigma_y3],
[sigma_x4, sigma_y4], [sigma_x5, sigma_y5], [sigma_x6, sigma_y6]])
for batch_idx, (x, t) in enumerate(cifar_trainset):
current_batch_size = x.data.size()[0]
x, t = x.to(device), t.to(device)
#imshow(torchvision.utils.make_grid(x))
for theta in thetas:
for offset in offsets:
for sigma in sigmas:
x1 = tfio.experimental.filter.gabor(x, freq = 0.2,
sigma = sigma,theta = theta, nstds=31, offset = offset)
x1 = tf.add(x1, 1)
x1 = x1.numpy() # converting tensorflow tensor to numpy
x1 = np.array(x1) # done to becaue dtype = complex64 had to be converted
x1 = np.uint8(x1)
x2 = torch.from_numpy(x1) # converting numpy to pytorch tensor
np.add(x1, 1, out=x1)
imshow(torchvision.utils.make_grid(x2))
Кто-нибудь пробовал конкретные значения для параметров фильтра gabor с данными cifar10, и это сработало? или вы думаете, что проблема в самом коде?