簡體   English   中英

Tensorflow (Keras) 到 PyTorch Conv2D 轉換

[英]Tensorflow (Keras) to PyTorch Conv2D conversion

我正在嘗試將自定義 UNET 實現從 Tensorflow 轉換為 PyTorch。 我在使用 Conv2D 圖層時遇到了一些問題。

我知道填充可能會有一些問題,它嘗試了這個這個,但它沒有幫助。

我的轉換代碼如下所示:

from keras.layers import Conv2D
from torch import nn

import torch
import pandas as pd
import numpy as np

img = np.random.rand(1, 256, 256, 1)

## TF Init
conv_tf = Conv2D(
    64, 3, activation="relu", padding="same", kernel_initializer="he_normal", 
)

conv_tf(img)
conv_tf.bias = np.random.rand(64)

## PT Init + copy weights
conv_torch = nn.Conv2d(
    in_channels=1, out_channels=64, kernel_size=3, padding="same", bias=True
)
conv_torch.weight = nn.parameter.Parameter(
    torch.Tensor(conv_tf.weights[0].numpy().transpose(3, 2, 0, 1))
)
conv_torch.bias = nn.parameter.Parameter(torch.Tensor(conv_tf.bias))

conv_torch = nn.Sequential(
    conv_torch,
    nn.ReLU()
)

如果我嘗試通過模型運行張量,結果很接近但不一樣(幾個點之間存在巨大差異)

pred_tf = conv_tf(img).numpy()
pred_pt = conv_torch(torch.Tensor(img).reshape(1, 1, 256, 256)).detach().numpy().reshape(pred_tf.shape)

pred_tf.mean()
#0.7202551

pred_pt.mean()
#0.7202549
TF-PT
數數 4.1943e+06
意思是 -2.2992e-09
性病 0.969716
分鍾 -3.85477
25% -0.641259
50% 0
75% 0.641266
最大限度 3.8742

任何想法? 謝謝

你懷疑填充。 這可以很容易地驗證:僅在內部像素上比較pred_tfpred_pt :丟棄圖像周圍的一條帶(在您的情況下為 1 像素寬)。
如果內部像素相同 - 那么這是一個填充問題。

但是,鑒於您的差異值,我懷疑情況並非如此。

也許在兩種方法之間反射/轉置 kernel 權重存在問題? 嘗試使用非方形內核:例如,3x5 而不是 3x3。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM