zoukankan      html  css  js  c++  java
  • tensorflow的reshape操作tf.reshape()

    在处理图像数据的时候总会遇到输入图像的维数不符合的情况,此时tensorflow中reshape()就很好的解决了这个问题。 
    更为详细的可以参考官方文档说明: 
    numpy.reshape


    reshape()的括号中所包含的参数有哪些呢?常见的写法有tf.reshape((28,28)):

    tf.reshape(tensor,shape,name=None)

    函数的作用是将tensor变换为参数shape形式,其中的shape为一个列表形式,特殊的是列表可以实现逆序的遍历,即list(-1).-1所代表的含义是我们不用亲自去指定这一维的大小,函数会自动进行计算,但是列表中只能存在一个-1。(如果存在多个-1,就是一个存在多解的方程) 
    下面就说一下reshape是如何进行矩阵的变换的,其简单的流程就是: 

    将矩阵t变换为一维矩阵,然后再对矩阵的形式进行更改就好了,具体的流程如下:

    reshape(t,shape) =>reshape(t,[-1]) =>reshape(t,shape)

    实际操作中,有如下效果:我创建了一个一维的数组

    >>>import numpy as np
    >>>a= np.array([1,2,3,4,5,6,7,8])
    >>>a
    array([1,2,3,4,5,6,7,8])
    >>>

    使用reshape()方法来更改数组的形状,使得数组成为一个二维的数组:(数组中元素的个数是2×4=8)

    >>>d = a.reshape((2,4))
    >>>d
    array([[1, 2, 3, 4],
           [5, 6, 7, 8]])

    进一步提升,可以得到一个三维的数组f:(注意数组中元素的个数时2×2×2=8)

    >>>f = a.reshape((2,2,2))
    >>>f
    array([[[1, 2],
            [3, 4]],
    
           [[5, 6],
            [7, 8]]])

    注意:形状发生变化的原则时数组元素的个数是不能发生改变的,比如像下面这样的写法就会报错: 

    (元素的个数是2×2=4,所以会报错)

    >>> e = a.shape((2,2))
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'tuple' object is not callable

    -1 的应用:-1 表示不知道该填什么数字合适的情况下,可以选择,由python通过a和其他的值3推测出来,比如,这里的a 是二维的数组,数组中共有6个元素,当使用reshape()时,6/3=2,所以形成的是3行2列的二维数组,可以看出,利用reshape进行数组形状的转换时,一定要满足(x,y)中x×y=数组的个数。

    >>>a = np.array([[1,2,3],[4,5,6]])
    >>>np.reshape(a,(3,-1)) 
    array([[1, 2],
           [3, 4],
           [5, 6]])
    >>> np.reshape(a,(1,-1))
    array([[1, 2, 3, 4, 5, 6]])
    >>> np.reshape(a,(6,-1))
    array([[1],
           [2],
           [3],
           [4],
           [5],
           [6]])
    >>> np.reshape(a,(-1,1))
    array([[1],
           [2],
           [3],
           [4],
           [5],
           [6]])

    下面是两张2×3大小的图片(不知道有几张图片可以用-1代替),如何把所有二维照片给转换成一维的,请看以下三维的数组:

    >>>image = np.array([[[1,2,3], [4,5,6]], [[1,1,1], [1,1,1]]])
    >>>image.shape
    (2,2,3)
    >>>image.reshape((-1,6))
    array([[1, 2, 3, 4, 5, 6],
           [1, 1, 1, 1, 1, 1]])
    >>> a = image.reshape((-1,6))
    >>> a.reshape((-1,12))
    array([[1, 2, 3, 4, 5, 6, 1, 1, 1, 1, 1, 1]])
    a.reshape((12,-1))
    array([[1],
           [2],
           [3],
           [4],
           [5],
           [6],
           [1],
           [1],
           [1],
           [1],
           [1],
           [1]])
    >>> a.reshape([-1])
    array([1, 2, 3, 4, 5, 6, 1, 1, 1, 1, 1, 1])

    通过reshape生成的新的形状的数组和原始数组共用一个内存,所以一旦更改一个数组的元素,另一个数组也将会发生改变。

    >>>a[1] = 100
    >>>a
    array([  1, 100,   3,   4,   5,   6,   7,   8])
    >>> d
    array([[  1, 100,   3,   4],
           [  5,   6,   7,   8]])

    最后再给大家呈现一下官方给出的例子:

    # tensor 't' is [1, 2, 3, 4, 5, 6, 7, 8, 9]
    # tensor 't' has shape [9]
    reshape(t, [3, 3]) ==> [[1, 2, 3],
                            [4, 5, 6],
                            [7, 8, 9]]
    
    # tensor 't' is [[[1, 1], [2, 2]],
    #                [[3, 3], [4, 4]]]
    # tensor 't' has shape [2, 2, 2]
    reshape(t, [2, 4]) ==> [[1, 1, 2, 2],
                            [3, 3, 4, 4]]
    
    # tensor 't' is [[[1, 1, 1],
    #                 [2, 2, 2]],
    #                [[3, 3, 3],
    #                 [4, 4, 4]],
    #                [[5, 5, 5],
    #                 [6, 6, 6]]]
    # tensor 't' has shape [3, 2, 3]
    # pass '[-1]' to flatten 't'
    reshape(t, [-1]) ==> [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6]
    
    # -1 can also be used to infer the shape
    
    # -1 is inferred to be 9:
    reshape(t, [2, -1]) ==> [[1, 1, 1, 2, 2, 2, 3, 3, 3],
                             [4, 4, 4, 5, 5, 5, 6, 6, 6]]
    # -1 is inferred to be 2:
    reshape(t, [-1, 9]) ==> [[1, 1, 1, 2, 2, 2, 3, 3, 3],
                             [4, 4, 4, 5, 5, 5, 6, 6, 6]]
    # -1 is inferred to be 3:
    reshape(t, [ 2, -1, 3]) ==> [[[1, 1, 1],
                                  [2, 2, 2],
                                  [3, 3, 3]],
                                 [[4, 4, 4],
                                  [5, 5, 5],
                                  [6, 6, 6]]]
    
    # tensor 't' is [7]
    # shape `[]` reshapes to a scalar
    reshape(t, []) ==> 7

  • 相关阅读:
    idea 的搭建 maven spark开发环境
    自己的简单数据分析流程
    自己对golang中各个文件的理解
    通用android studio gradle 文件(电商商家版,两个gradle不同)
    android与golang的http请求
    Leetcode 98 验证二叉搜索树
    leetcode 830较大分组的位置
    Leetcode 种花问题
    leetcode 86 分割链表
    Leetcode 509 斐波那契数
  • 原文地址:https://www.cnblogs.com/gmhappy/p/9472408.html
Copyright © 2011-2022 走看看