【发布时间】:2020-04-13 20:26:34
【问题描述】:
当我注意到 tensorflow 和 pytorch 对于 2d cnns 具有不同大小的权重张量时,我正在将用 tensorflow v1.13 编写的旧项目转换为 pytorch v1.4.0。
这是我的张量流代码
cnn = tf.layers.conv2d(img_tensor, 16, (3, 3), (1, 1), padding='SAME', name='cnn_1')
cnn = tf.layers.conv2d(cnn, 32, (3, 3), (1, 1), padding='SAME', name='cnn_2')
init = tf.global_varaibles_initializer()
with tf.Session() as sess:
sess.run(init)
vars = {v.name:v for v in tf.trainable_variables()}
print(sess.run(vars['cnn_2/kernel:0']).shape)
结果
(3, 3, 1, 32)
这是我的 pytorch 代码
class Net(Module):
def __init__(self):
super(Net, self).__init__()
self.create_cnn()
def create_cnn(self):
self.cnn_layers = Sequential(
Conv2d(1,16,3,padding=1)
Conv2d(16,32,3,padding=1)
)
def forward(self, x):
return self.cnn_layers(x)
def weights_init(m):
if type(m) == Conv2d:
if(m.bias.shape[0] == 32):
print(m.weight.data.shape)
model = Net()
model.apply(weights_init)
结果
torch.Size([32,16,3,3])
出现这种情况的原因是因为我的 pytorch 模型不起作用,所以我开始一次一层地比较 tensorflow 和 pytorch 之间的输出。为了使它起作用,我必须将两个模型的权重设置为相同的值。好吧,我得到了第二个 cnn 层,当它因为尺寸错误而无法设置权重时感到很困惑。稍微摸索了一下,我发现了这种差异。
我看起来 tensorflow 在所有通道中都使用相同的内核,而 pytorch 的每个通道都有一个唯一的内核。如果是这种情况,我如何在 pytorch 中复制它?
【问题讨论】:
标签: python tensorflow deep-learning pytorch conv-neural-network