tensorflow 1.12 与 pytorch 1.0 互相迁移 操作符

版权声明:本文为博主的文章,未经博主禁止可以随意转载。 https://blog.csdn.net/ONE_SIX_MIX/article/details/86318057

估计距离 tensorflow 2.0 要出还有几个月,要升级到动态图了,不过要弄动态图的话,直接玩pytorch不是更好?所以直接学了点pytorch
tensorflow 的 eager execute 效率不怎么好,虽然defun可以优化不少,但是对于复杂的网络,defun需要的时间太长了,而且defun之后就没法进入内部调试了,调试时间漫长。而pytorch直接运行,效率仍然非常高
记录一下部分将 tf op 转移到 pytorch op 的办法

import torch
import torch.nn as nn
import torch.nn.functional as F
import tensorflow as tf
import numpy as np

# 让 tf 动态使用内存
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
config.allow_soft_placement = True
tf.enable_eager_execution(config)

v = np.random.random([1, 6, 5, 3])

# 定义变量
a = tf.Variable(v, dtype=tf.float32)
b: torch.Tensor = torch.Tensor(v).float()

# 在维度2上求平均
a2 = tf.reduce_mean(a, 2)
b2 = b.mean(2)

# 交换维度2和维度3,注意torch 的 transpose 每次只能交换两个维度位置,如果要交换更多维度
# 那就要使用 permute,这个就是 tf.transpose 的 torch 版本
a3 = tf.transpose(a, [0, 1, 3, 2])
b3 = b.transpose(2, 3)
b3_1 = b.permute(0, 1, 3, 2)

# reshape,torch还可以使用view
a4 = tf.reshape(a, [-1, 15])
b4 = b.reshape(-1, 15)
b4_1 = b.view(-1, 15)

# 压缩指定维度上到最大值,注意torch的max返回一个二元组,第一个元素是需要的,第二个元素是最大值的位置
# 另外,torch的max一次只能压缩一个维度
a5 = tf.reduce_max(a, 2)
b5 = b.max(2)[0]
a5_1 = tf.reduce_max(a, [2, 3])
b5_1 = b.max(3)[0].max(2)[0]

# split,注意 tf.split 指定分段数量时,每个分段大小需要相等,而torch没有这个要求
# tf.split 指定每个分段大小时,可以使用-1来自动预测通道数量,而torch必须每个通道都指定为明确数量
a6_1, a6_2, a6_3 = tf.split(a, [3, 1, 1], 2)
b6_1, b6_2, b6_3 = b.split([3, 1, 1], 2)
a6_4, a6_5 = tf.split(a, 2, 1)
b6_4, b6_5 = b.chunk(2, 1)

# same 和 valid 的卷积操作,torch没有直接的same和valid填充操作
kernel_size = (3, 3)
filters = 16
strides = (1, 1)
# same
padding = np.int32(np.array(kernel_size)//2).tolist()
a7_1 = tf.layers.Conv2D(filters, kernel_size, strides, 'same', data_format='channels_first')
b7_1 = nn.Conv2d(6, filters, kernel_size, strides, padding)
a7_1_o = a7_1(tf.convert_to_tensor(a))
b7_1_o = b7_1(b)
# valid
padding = 0
a7_2 = tf.layers.Conv2D(filters, kernel_size, strides, 'valid', data_format='channels_first')
b7_2 = nn.Conv2d(6, filters, kernel_size, strides, padding)
a7_2_o = a7_2(tf.convert_to_tensor(a))
b7_2_o = b7_2(b)

# 对指定维度重复复制
a8 = tf.tile(a, [2, 3, 4, 5])
b8 = b.repeat(2, 3, 4, 5)

猜你喜欢

转载自blog.csdn.net/ONE_SIX_MIX/article/details/86318057
今日推荐