Tensorflow против PyTorch: свертка не работает - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь проверить, соответствует ли вывод свертки Tensorflow выводу свертки PyTorch с теми же весами.

Вот мой код, в котором я копирую веса из Tensorflow в Torch, сворачиваю и сравниваю выходные данные:

import tensorflow as tf
import numpy as np
import math
from math import floor, ceil
import os
import math
import datetime
from scipy import misc
from PIL import Image
import model
import torch
from torch import nn
import common
import torch.nn.functional as F


sess = tf.Session()
np.random.seed(1)
tf.set_random_seed(1)

#parameters
kernel_size = 3
input_feat = 4
output_feat = 4

#inputs
npo = np.random.random((1,5,5, input_feat))
x = tf.convert_to_tensor(npo, tf.float32)
x2 = torch.tensor(np.transpose(npo, [0, 3, 1, 2])).double()

#the same weights
weights = np.random.random((kernel_size,kernel_size,input_feat,output_feat))
weights_torch = np.transpose(weights, [3, 2, 1, 0])

#convolving with tensorflow
w = tf.Variable(weights, name="testconv_W", dtype=tf.float32)
res = tf.nn.conv2d(x, w, strides=[1, 1, 1, 1], padding="VALID")

sess.run(tf.global_variables_initializer())


#convolving with torch
torchres = F.conv2d(x2, torch.tensor(weights_torch), padding=0, bias=torch.zeros((output_feat)).double())

#comparing the results
print(np.mean(np.transpose(sess.run(res), [0, 3, 1, 2])) - torch.mean(torchres).detach().numpy())

выводит

0.15440369065716908

Почему? Почему такая большая разница? Является ли реализация Tensorflow conv2d неверной? Почему это не соответствует PyTorch? Я делаю что-то неправильно? На размере ядра 1 все работает нормально. Пожалуйста, помогите.

1 Ответ

0 голосов
/ 10 сентября 2018

Вы можете попробовать x2 = torch.tensor(np.transpose(npo, [0, 3, 2, 1])).double() вместо x2 = torch.tensor(np.transpose(npo, [0, 3, 1, 2])).double()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...