python - Tensorflow vs PyTorch:卷积不起作用
问题描述
我正在尝试测试 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 上一切正常。请帮忙。
解决方案
你可以尝试x2 = torch.tensor(np.transpose(npo, [0, 3, 2, 1])).double()
而不是x2 = torch.tensor(np.transpose(npo, [0, 3, 1, 2])).double()
推荐阅读
- html - 根据 API 中的未知内容调整 Angular 中弹性项目的高度
- r - 基于来自数据帧的组 id 的标准差
- powershell - 从参数 powershell 调用函数
- python - 如何使用换行符作为分隔符?
- kubernetes - GitOps:跨多个命名空间推出对 k8s 资源的更改
- python - 简化一系列 if 语句
- r - 将经度和纬度与 R 中的国家/地区匹配
- tensorflow - 如何将 LSTM 自动编码器向前推进 n 个时间步?
- android - RecyclerView只在重启Activity后显示数据
- javascript - chai、自定义断言覆盖和否定