tensorflow: a Implementation of rotation ops (旋转的函数实现方法)
tensorflow 旋转矩阵的函数实现方法
关键字: rot90, tensorflow
1. 背景
在做数据增强的操作过程中, 很多情况需要对图像旋转和平移等操作, 针对一些特殊的卷积(garbo conv)操作,还需要对卷积核进行旋转操作.
在tensorflow中似乎没有实现对4D tensor的旋转操作.
严格的说: tensorflow对tensor的翻转操作并未实现, 仅有针对3D tensor的tf.image.rot()
而在大多数的情况下使用的是4D形式的tensor, [B,W,H,C] 或者是3D的图像组成的batchs.
通过查看这篇文章的代码可以知道[1] 可以使用numpy的rot90()函数旋转, 但是rot90对象是ndarray, 针对tensorflow.tensor对象而言显然是无法使用的, 会抛出类似: 无法找到m.dim属性的异常.
也就是说无法使用numpy.rot90() 函数.
又知, tensorflow中提供有对矩阵的翻转, 转置,切片操作的函数,但是没有提供旋转90°, 180°,270°的操作.
因此可以参照numpy.rot90(m, k=1, axes=(0,1)) 的程序片段去自己动手实现.
rot90中的第一个参数m是操作对象, k是旋转的次数,k=1 代表逆时针旋转90度, k=2 代表逆时针旋转180度,以此类推
axes是代表旋转的操作在哪两个维度构成的平面上.
rot90的源代码如下:
def rot90(m, k=1, axes=(0,1)):
'''
......
'''
# 省略检测参数的操作
k %= 4
if k == 0:
return m[:]
if k == 2:
return flip(flip(m, axes[0]), axes[1])
axes_list = arange(0, m.ndim)
(axes_list[axes[0]], axes_list[axes[1]]) = (axes_list[axes[1]],
axes_list[axes[0]])
if k == 1:
return transpose(flip(m,axes[1]), axes_list)
else:
# k == 3
return flip(transpose(m, axes_list), axes[1])
PS: 通过阅读上述的代码,也可以发现在tensorflow中直接使用rot90所抛出的异常是在这里出现的
if axes[0] == axes[1] or absolute(axes[0] - axes[1]) == m.ndim
原因是: 程序把tensor对象当成np.ndarray操作了, 而tensor对象没有m.dim属性
2. 实现rot90操作
2.1 梳理程序流程
通过查看源代码可以梳理出程序流程图:

2.2 tensorflow 实现旋转操作
根据上述的流程图, 可以实现对tensorflow的rot90操作;
def rot90(tensor,k=1,axes=[1,2],name=None):
'''
autor:lizh
tensor: a tensor 4 or more dimensions
k: integer, Number of times the array is rotated by 90 degrees.
axes: (2,) array_like
The array is rotated in the plane defined by the axes.
Axes must be different.
-----
Returns
-------
tensor : tf.tensor
A rotated view of `tensor`.
See Also: https://www.tensorflow.org/api_docs/python/tf/image/rot90
'''
axes = tuple(axes)
if len(axes) != 2:
raise ValueError("len(axes) must be 2.")
tenor_shape = (tensor.get_shape().as_list())
dim = len(tenor_shape)
if axes[0] == axes[1] or np.absolute(axes[0] - axes[1]) == dim:
raise ValueError("Axes must be different.")
if (axes[0] >= dim or axes[0] < -dim
or axes[1] >= dim or axes[1] < -dim):
raise ValueError("Axes={} out of range for tensor of ndim={}."
.format(axes, dim))
k%=4
if k==0:
return tensor
if k==2:
img180 = tf.reverse(tf.reverse(tensor, axis=[axes[0]]),axis=[axes[1]],name=name)
return img180
axes_list = np.arange(0, dim)
(axes_list[axes[0]], axes_list[axes[1]]) = (axes_list[axes[1]],axes_list[axes[0]]) # 替换
print(axes_list)
if k==1:
img90=tf.transpose(tf.reverse(tensor,axis=[axes[1]]), perm=axes_list, name=name)
return img90
if k==3:
img270=tf.reverse( tf.transpose(tensor, perm=axes_list),axis=[axes[1]],name=name)
return img270
2.3 代码测试
# 加载库
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
# 手写体数据集 加载
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/home/lizhen/data/MNIST/", one_hot=True)
sess=tf.Session()
#选取数据 4D
images = mnist.train.images
img_raw = images[0,:] # [0,784]
img=tf.reshape(img_raw,[-1,28,28,1]) # img 现在是tensor
# 绘图
def fig_2D_tensor(tensor):# 绘图
#plt.matshow(tensor, cmap=plt.get_cmap('gray'))
plt.matshow(tensor) # 彩色图像
# plt.colorbar() # 颜色条
plt.show()
# 显 显示 待旋转的图片
fig_2D_tensor(sess.run(img)[0,:,:,0]) # 提取ndarray

简单的测试一下代码:
img11_rot=rot90(img,2) # 旋转两次90
fig_2D_tensor(sess.run(img11_rot)[0,:,:,0]) # 打印图像
img12_rot=rot90(img,1,[1,1]) # 抛出异常, 测试 Axes must be different.
img13_rot=rot90(img,1,[0,6]) # 抛出异常, 测试 Axes must be different.
img14_rot=rot90(img,axes=[1,5])# 抛出异常,测试out of range.
img14_rot=rot90(img,axes=[-1,2]) # -1的下标是倒数第二个,测试out of range.
测试结果:



3总结
okey了,现在可以用了.
.....
额,,,,,最近才发现tensorflow的最新版本,大约就在前几天发布的新版本(14天前, 1.10.1 )上已经添加了对2D,3D图像的操作,支持[B,W,H,C]格式的tensor做出旋转[2]
星期五, 07. 九月 2018 02:49下午
参考文献
tensorflow: a Implementation of rotation ops (旋转的函数实现方法)的更多相关文章
- 【转】Unity3D Transform中有关旋转的属性和方法测试
Transform有关旋转个属性和方法测试 一,属性 1,var eulerAngles : Vector3 public float yRotation = 5.0F; void Update() ...
- 【微软100题】定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。 如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。
package test; /** * 定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部. 如把字符串abcdef左旋转2位得到字符串cdefab. 请实现字符串左旋转的函数. * ...
- TensorFlow之DNN(三):神经网络的正则化方法(Dropout、L2正则化、早停和数据增强)
这一篇博客整理用TensorFlow实现神经网络正则化的内容. 深层神经网络往往具有数十万乃至数百万的参数,可以进行非常复杂的特征变换,具有强大的学习能力,因此容易在训练集上过拟合.缓解神经网络的过拟 ...
- Android 解决setRequestedOrientation之后手机屏幕的旋转不触发onConfigurationChanged方法
最近在做播放器的时候遇到一个问题,在屏幕方向改变之后需要切换播放器全屏/非全屏的时候,在重写了onConfigurationChanged方法并在manifest.xml配置文件中添加 android ...
- tensorflow构建CNN模型时的常用接口函数
(1)tf.nn.max_pool()函数 解释: tf.nn.max_pool(value, ksize, strides, padding, data_format='NHWC', name=No ...
- Matrix控制平移、旋转和缩放的方法
1.setTranslate(float ds,float dy):控制Matrix进行平移.2.setSkew(float kx,float ky,float px,float py):控制Matr ...
- JMeter接口HTTP请求implementation不选java会报错解决方法
1.若不对c参数和d参数进行URL编码则需要选择implementation为java: 2.若想不设implementation值,则需进行c参数d参数URLEncoding import java ...
- TensorFlow 常用函数与方法
摘要:本文主要对tf的一些常用概念与方法进行描述. tf函数 TensorFlow 将图形定义转换成分布式执行的操作, 以充分利用可用的计算资源(如 CPU 或 GPU.一般你不需要显式指定使用 CP ...
- QT 实现图片旋转的两种方法
第一种方案 使用 QPixmap 的 transformed 函数来实现旋转,这个函数默认是以图片中心为旋转点,不能设置旋转的中心点,使用如下: QMatrix matrix; matrix.rota ...
随机推荐
- Codeforces - 914C 数位DP
题意有点难以描述,简略的就是给定一个二进制\(n\),每一步操作能使\(n\)的位为1的数的和转化为一个十进制,然后转化为该数的二进制再进行相同的操作 查询\([0,n]\)中操作数恰好为\(k\)的 ...
- 【中间件】Struts2系列漏洞POC小结
#Struts2-045 ''' CVE-2017-5638 影响范围:Struts 2.3.5 – Struts 2.3.31,Struts 2.5 – Struts 2.5.10 触发条件:基于J ...
- 阿里云redisA迁移redisB迁移
./redis-port restore --input=./xxx.rdb --target=r-2zedc7c8e0557dsf4.redis.rds.aliyuncs.com:6379 --au ...
- Hive优化-大表join大表优化
Hive优化-大表join大表优化 5.大表join大表优化 如果Hive优化实战2中mapjoin中小表dim_seller很大呢?比如超过了1GB大小?这种就是大表join大表的问题.首先引入一个 ...
- D3.js绘制平行坐标图
参照:https://syntagmatic.github.io/parallel-coordinates/ 和 https://github.com/syntagmatic/parallel-coo ...
- Java super和this小结
区别 this() / this. super() / super. 功能 调用本类构造.方法.属性 调用父类构造.方法.属性 操作方法 先查找本类是否有制定的调用结构,如果没有则调用父类 直接调用父 ...
- 怎么用代码弹回 UITableView 中左滑出来的删除按钮
点击取消,让删除按钮弹回去 [tableView setEditing:NO] 初学 ios 真是大菜鸟,这么简单的一个问题搞了 3 个小时
- 【CSS】 布局之浮动float和绝对定位absolute的选择
浮动float: 浮动的框可以向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止. 由于浮动框不在文档的普通流中,所以文档的普通流中的块框表现得就像浮动框不存在一样.(W3C) 绝对定位 ...
- java多线程开发,Executors、FutureTask、Callable
java多线程如何应用呢,几乎学java的同学都知道Thread类和Runable接口.继承Thread类或者实现Runable接口,调用thread的start方法即可启动线程. 然后是线程池,就是 ...
- 转 Unity企业级支持案例与分析
Unity大中华区技术支持总监张黎明以“Unity企业级支持案例与分析”为主题进行了分享. 以下为演讲实录: 张黎明:非常感谢大家来参加今年的Unite,其实我现在看到有的朋友已经不是第一次来参加Un ...