zoukankan      html  css  js  c++  java
  • tensorflow生成随机数的操作 tf.random_normal & tf.random_uniform & tf.truncated_normal & tf.random_shuffle

    tf.random_normal

    从正态分布输出随机值。

    random_normal(shape,mean=0.0,stddev=1.0,dtype=tf.float32,seed=None,name=None)  
    

    shape:一个一维整数张量或Python数组。代表张量的形状。
    mean:数据类型为dtype的张量值或Python值。是正态分布的均值。
    stddev:数据类型为dtype的张量值或Python值。是正态分布的标准差
    dtype: 输出的数据类型。
    seed:一个Python整数。是随机种子。
    name: 操作的名称(可选)

    官网api地址:https://www.tensorflow.org/versions/r1.3/api_docs/python/tf/random_normal

    tf.random_uniform

    从均匀分布中返回随机值。

    random_uniform(  
        shape,# 生成的张量的形状  
        minval=0,  
        maxval=None,  
        dtype=tf.float32,  
        seed=None,  
        name=None  
    )  
    

      

    返回值的范围默认是0到1的左闭右开区间,即[0,1)。minval为指定最小边界,默认为1。maxval为指定的最大边界,如果是数据浮点型则默认为1,如果数据为整形则必须指定。

    官网api地址:https://www.tensorflow.org/api_docs/python/tf/random_uniform

    tf.truncated_normal

    截断的正态分布函数。生成的值遵循一个正态分布,但不会大于平均值2个标准差。

    truncated_normal(  
        shape,#一个一维整数张量或Python数组。代表张量的形状。  
        mean=0.0,#数据类型为dtype的张量值或Python值。是正态分布的均值。  
        stddev=1.0,#数据类型为dtype的张量值或Python值。是正态分布的标准差  
        dtype=tf.float32,#输出的数据类型。  
        seed=None,#一个Python整数。是随机种子。  
        name=None#操作的名称(可选)  
    )  
    

      官网api地址:https://www.tensorflow.org/api_docs/python/tf/truncated_normal

    tf.random_shuffle

    沿着要被洗牌的张量的第一个维度,随机打乱。

    random_shuffle(  
        value,# 要被洗牌的张量  
        seed=None,  
        name=None  
    )  
    

      官网api地址: https://www.tensorflow.org/api_docs/python/tf/random_shuffle

    附录1:生成随机数的操作的源码random_ops.py

    truncated_normal(  
        shape,#一个一维整数张量或Python数组。代表张量的形状。  
        mean=0.0,#数据类型为dtype的张量值或Python值。是正态分布的均值。  
        stddev=1.0,#数据类型为dtype的张量值或Python值。是正态分布的标准差  
        dtype=tf.float32,#输出的数据类型。  
        seed=None,#一个Python整数。是随机种子。  
        name=None#操作的名称(可选)  
    )  
    
    官网api地址:https://www.tensorflow.org/api_docs/python/tf/truncated_normal
    
    
    
    
    tf.random_shuffle
    沿着要被洗牌的张量的第一个维度,随机打乱。
    
    [python] view plain copy
    random_shuffle(  
        value,# 要被洗牌的张量  
        seed=None,  
        name=None  
    )  
    即下面这种效果:
    [python] view plain copy
    [[1, 2],       [[5, 6],  
     [3, 4],  ==>   [1, 2],  
     [5, 6]]        [3, 4]]  
    
    官网api地址: https://www.tensorflow.org/api_docs/python/tf/random_shuffle
    
    
    
    
    附录1:生成随机数的操作的源码random_ops.py
    [python] view plain copy
    # Copyright 2015 The TensorFlow Authors. All Rights Reserved.  
    #  
    # Licensed under the Apache License, Version 2.0 (the "License");  
    # you may not use this file except in compliance with the License.  
    # You may obtain a copy of the License at  
    #  
    #     http://www.apache.org/licenses/LICENSE-2.0  
    #  
    # Unless required by applicable law or agreed to in writing, software  
    # distributed under the License is distributed on an "AS IS" BASIS,  
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
    # See the License for the specific language governing permissions and  
    # limitations under the License.  
    # ==============================================================================  
    """Operations for generating random numbers."""  
      
    from __future__ import absolute_import  
    from __future__ import division  
    from __future__ import print_function  
      
    import numpy as np  
    from tensorflow.python.framework import dtypes  
    from tensorflow.python.framework import ops  
    from tensorflow.python.framework import random_seed  
    from tensorflow.python.ops import array_ops  
    from tensorflow.python.ops import control_flow_ops  
    from tensorflow.python.ops import gen_random_ops  
    from tensorflow.python.ops import math_ops  
    # go/tf-wildcard-import  
    # pylint: disable=wildcard-import  
    from tensorflow.python.ops.gen_random_ops import *  
      
    # pylint: enable=wildcard-import  
      
      
    def _ShapeTensor(shape):  
      """Convert to an int32 or int64 tensor, defaulting to int32 if empty."""  
      if isinstance(shape, (tuple, list)) and not shape:  
        dtype = dtypes.int32  
      else:  
        dtype = None  
      return ops.convert_to_tensor(shape, dtype=dtype, name="shape")  
      
      
    # pylint: disable=protected-access  
    def random_normal(shape,  
                      mean=0.0,  
                      stddev=1.0,  
                      dtype=dtypes.float32,  
                      seed=None,  
                      name=None):  
      """Outputs random values from a normal distribution. 
     
      Args: 
        shape: A 1-D integer Tensor or Python array. The shape of the output tensor. 
        mean: A 0-D Tensor or Python value of type `dtype`. The mean of the normal 
          distribution. 
        stddev: A 0-D Tensor or Python value of type `dtype`. The standard deviation 
          of the normal distribution. 
        dtype: The type of the output. 
        seed: A Python integer. Used to create a random seed for the distribution. 
          See 
          @{tf.set_random_seed} 
          for behavior. 
        name: A name for the operation (optional). 
     
      Returns: 
        A tensor of the specified shape filled with random normal values. 
      """  
      with ops.name_scope(name, "random_normal", [shape, mean, stddev]) as name:  
        shape_tensor = _ShapeTensor(shape)  
        mean_tensor = ops.convert_to_tensor(mean, dtype=dtype, name="mean")  
        stddev_tensor = ops.convert_to_tensor(stddev, dtype=dtype, name="stddev")  
        seed1, seed2 = random_seed.get_seed(seed)  
        rnd = gen_random_ops._random_standard_normal(  
            shape_tensor, dtype, seed=seed1, seed2=seed2)  
        mul = rnd * stddev_tensor  
        value = math_ops.add(mul, mean_tensor, name=name)  
        return value  
      
      
    ops.NotDifferentiable("RandomStandardNormal")  
      
      
    def parameterized_truncated_normal(shape,  
                                       means=0.0,  
                                       stddevs=1.0,  
                                       minvals=-2.0,  
                                       maxvals=2.0,  
                                       dtype=dtypes.float32,  
                                       seed=None,  
                                       name=None):  
      """Outputs random values from a truncated normal distribution. 
     
      The generated values follow a normal distribution with specified mean and 
      standard deviation, except that values whose magnitude is more than 2 standard 
      deviations from the mean are dropped and re-picked. 
     
      Args: 
        shape: A 1-D integer Tensor or Python array. The shape of the output tensor. 
        means: A 0-D Tensor or Python value of type `dtype`. The mean of the 
          truncated normal distribution. 
        stddevs: A 0-D Tensor or Python value of type `dtype`. The standard 
          deviation of the truncated normal distribution. 
        minvals: A 0-D Tensor or Python value of type `dtype`. The minimum value of 
          the truncated normal distribution. 
        maxvals: A 0-D Tensor or Python value of type `dtype`. The maximum value of 
          the truncated normal distribution. 
        dtype: The type of the output. 
        seed: A Python integer. Used to create a random seed for the distribution. 
          See 
          @{tf.set_random_seed} 
          for behavior. 
        name: A name for the operation (optional). 
     
      Returns: 
        A tensor of the specified shape filled with random truncated normal values. 
      """  
      with ops.name_scope(name, "parameterized_truncated_normal",  
                          [shape, means, stddevs, minvals, maxvals]) as name:  
        shape_tensor = _ShapeTensor(shape)  
        means_tensor = ops.convert_to_tensor(means, dtype=dtype, name="means")  
        stddevs_tensor = ops.convert_to_tensor(stddevs, dtype=dtype, name="stddevs")  
        minvals_tensor = ops.convert_to_tensor(minvals, dtype=dtype, name="minvals")  
        maxvals_tensor = ops.convert_to_tensor(maxvals, dtype=dtype, name="maxvals")  
        seed1, seed2 = random_seed.get_seed(seed)  
        rnd = gen_random_ops._parameterized_truncated_normal(  
            shape_tensor,  
            means_tensor,  
            stddevs_tensor,  
            minvals_tensor,  
            maxvals_tensor,  
            seed=seed1,  
            seed2=seed2)  
        return rnd  
      
      
    def truncated_normal(shape,  
                         mean=0.0,  
                         stddev=1.0,  
                         dtype=dtypes.float32,  
                         seed=None,  
                         name=None):  
      """Outputs random values from a truncated normal distribution. 
     
      The generated values follow a normal distribution with specified mean and 
      standard deviation, except that values whose magnitude is more than 2 standard 
      deviations from the mean are dropped and re-picked. 
     
      Args: 
        shape: A 1-D integer Tensor or Python array. The shape of the output tensor. 
        mean: A 0-D Tensor or Python value of type `dtype`. The mean of the 
          truncated normal distribution. 
        stddev: A 0-D Tensor or Python value of type `dtype`. The standard deviation 
          of the truncated normal distribution. 
        dtype: The type of the output. 
        seed: A Python integer. Used to create a random seed for the distribution. 
          See 
          @{tf.set_random_seed} 
          for behavior. 
        name: A name for the operation (optional). 
     
      Returns: 
        A tensor of the specified shape filled with random truncated normal values. 
      """  
      with ops.name_scope(name, "truncated_normal", [shape, mean, stddev]) as name:  
        shape_tensor = _ShapeTensor(shape)  
        mean_tensor = ops.convert_to_tensor(mean, dtype=dtype, name="mean")  
        stddev_tensor = ops.convert_to_tensor(stddev, dtype=dtype, name="stddev")  
        seed1, seed2 = random_seed.get_seed(seed)  
        rnd = gen_random_ops._truncated_normal(  
            shape_tensor, dtype, seed=seed1, seed2=seed2)  
        mul = rnd * stddev_tensor  
        value = math_ops.add(mul, mean_tensor, name=name)  
        return value  
      
      
    ops.NotDifferentiable("ParameterizedTruncatedNormal")  
    ops.NotDifferentiable("TruncatedNormal")  
      
      
    def random_uniform(shape,  
                       minval=0,  
                       maxval=None,  
                       dtype=dtypes.float32,  
                       seed=None,  
                       name=None):  
      """Outputs random values from a uniform distribution. 
     
      The generated values follow a uniform distribution in the range 
      `[minval, maxval)`. The lower bound `minval` is included in the range, while 
      the upper bound `maxval` is excluded. 
     
      For floats, the default range is `[0, 1)`.  For ints, at least `maxval` must 
      be specified explicitly. 
     
      In the integer case, the random integers are slightly biased unless 
      `maxval - minval` is an exact power of two.  The bias is small for values of 
      `maxval - minval` significantly smaller than the range of the output (either 
      `2**32` or `2**64`). 
     
      Args: 
        shape: A 1-D integer Tensor or Python array. The shape of the output tensor. 
        minval: A 0-D Tensor or Python value of type `dtype`. The lower bound on the 
          range of random values to generate.  Defaults to 0. 
        maxval: A 0-D Tensor or Python value of type `dtype`. The upper bound on 
          the range of random values to generate.  Defaults to 1 if `dtype` is 
          floating point. 
        dtype: The type of the output: `float32`, `float64`, `int32`, or `int64`. 
        seed: A Python integer. Used to create a random seed for the distribution. 
          See @{tf.set_random_seed} 
          for behavior. 
        name: A name for the operation (optional). 
     
      Returns: 
        A tensor of the specified shape filled with random uniform values. 
     
      Raises: 
        ValueError: If `dtype` is integral and `maxval` is not specified. 
      """  
      dtype = dtypes.as_dtype(dtype)  
      if maxval is None:  
        if dtype.is_integer:  
          raise ValueError("Must specify maxval for integer dtype %r" % dtype)  
        maxval = 1  
      with ops.name_scope(name, "random_uniform", [shape, minval, maxval]) as name:  
        shape = _ShapeTensor(shape)  
        minval = ops.convert_to_tensor(minval, dtype=dtype, name="min")  
        maxval = ops.convert_to_tensor(maxval, dtype=dtype, name="max")  
        seed1, seed2 = random_seed.get_seed(seed)  
        if dtype.is_integer:  
          return gen_random_ops._random_uniform_int(  
              shape, minval, maxval, seed=seed1, seed2=seed2, name=name)  
        else:  
          rnd = gen_random_ops._random_uniform(  
              shape, dtype, seed=seed1, seed2=seed2)  
          return math_ops.add(rnd * (maxval - minval), minval, name=name)  
      
      
    ops.NotDifferentiable("RandomUniform")  
      
      
    def random_shuffle(value, seed=None, name=None):  
      """Randomly shuffles a tensor along its first dimension. 
     
      The tensor is shuffled along dimension 0, such that each `value[j]` is mapped 
      to one and only one `output[i]`. For example, a mapping that might occur for a 
      3x2 tensor is: 
     
      ```python 
      [[1, 2],       [[5, 6], 
       [3, 4],  ==>   [1, 2], 
       [5, 6]]        [3, 4]] 
      ``` 
     
      Args: 
        value: A Tensor to be shuffled. 
        seed: A Python integer. Used to create a random seed for the distribution. 
          See 
          @{tf.set_random_seed} 
          for behavior. 
        name: A name for the operation (optional). 
     
      Returns: 
        A tensor of same shape and type as `value`, shuffled along its first 
        dimension. 
      """  
      seed1, seed2 = random_seed.get_seed(seed)  
      return gen_random_ops._random_shuffle(  
          value, seed=seed1, seed2=seed2, name=name)  
      
      
    def random_crop(value, size, seed=None, name=None):  
      """Randomly crops a tensor to a given size. 
     
      Slices a shape `size` portion out of `value` at a uniformly chosen offset. 
      Requires `value.shape >= size`. 
     
      If a dimension should not be cropped, pass the full size of that dimension. 
      For example, RGB images can be cropped with 
      `size = [crop_height, crop_width, 3]`. 
     
      Args: 
        value: Input tensor to crop. 
        size: 1-D tensor with size the rank of `value`. 
        seed: Python integer. Used to create a random seed. See 
          @{tf.set_random_seed} 
          for behavior. 
        name: A name for this operation (optional). 
     
      Returns: 
        A cropped tensor of the same rank as `value` and shape `size`. 
      """  
      # TODO(shlens): Implement edge case to guarantee output size dimensions.  
      # If size > value.shape, zero pad the result so that it always has shape  
      # exactly size.  
      with ops.name_scope(name, "random_crop", [value, size]) as name:  
        value = ops.convert_to_tensor(value, name="value")  
        size = ops.convert_to_tensor(size, dtype=dtypes.int32, name="size")  
        shape = array_ops.shape(value)  
        check = control_flow_ops.Assert(  
            math_ops.reduce_all(shape >= size),  
            ["Need value.shape >= size, got ", shape, size],  
            summarize=1000)  
        shape = control_flow_ops.with_dependencies([check], shape)  
        limit = shape - size + 1  
        offset = random_uniform(  
            array_ops.shape(shape),  
            dtype=size.dtype,  
            maxval=size.dtype.max,  
            seed=seed) % limit  
        return array_ops.slice(value, offset, size, name=name)  
      
      
    def multinomial(logits, num_samples, seed=None, name=None):  
      """Draws samples from a multinomial distribution. 
     
      Example: 
     
      ```python 
      # samples has shape [1, 5], where each value is either 0 or 1 with equal 
      # probability. 
      samples = tf.multinomial(tf.log([[10., 10.]]), 5) 
      ``` 
     
      Args: 
        logits: 2-D Tensor with shape `[batch_size, num_classes]`.  Each slice 
          `[i, :]` represents the log-odds for all classes. 
        num_samples: 0-D.  Number of independent samples to draw for each row slice. 
        seed: A Python integer. Used to create a random seed for the distribution. 
          See 
          @{tf.set_random_seed} 
          for behavior. 
        name: Optional name for the operation. 
     
      Returns: 
        The drawn samples of shape `[batch_size, num_samples]`. 
      """  
      with ops.name_scope(name, "multinomial", [logits]):  
        logits = ops.convert_to_tensor(logits, name="logits")  
        seed1, seed2 = random_seed.get_seed(seed)  
        return gen_random_ops.multinomial(  
            logits, num_samples, seed=seed1, seed2=seed2)  
      
      
    ops.NotDifferentiable("Multinomial")  
      
      
    def random_gamma(shape,  
                     alpha,  
                     beta=None,  
                     dtype=dtypes.float32,  
                     seed=None,  
                     name=None):  
      """Draws `shape` samples from each of the given Gamma distribution(s). 
     
      `alpha` is the shape parameter describing the distribution(s), and `beta` is 
      the inverse scale parameter(s). 
     
      Example: 
     
        samples = tf.random_gamma([10], [0.5, 1.5]) 
        # samples has shape [10, 2], where each slice [:, 0] and [:, 1] represents 
        # the samples drawn from each distribution 
     
        samples = tf.random_gamma([7, 5], [0.5, 1.5]) 
        # samples has shape [7, 5, 2], where each slice [:, :, 0] and [:, :, 1] 
        # represents the 7x5 samples drawn from each of the two distributions 
     
        samples = tf.random_gamma([30], [[1.],[3.],[5.]], beta=[[3., 4.]]) 
        # samples has shape [30, 3, 2], with 30 samples each of 3x2 distributions. 
     
        Note: Because internal calculations are done using `float64` and casting has 
        `floor` semantics, we must manually map zero outcomes to the smallest 
        possible positive floating-point value, i.e., `np.finfo(dtype).tiny`.  This 
        means that `np.finfo(dtype).tiny` occurs more frequently than it otherwise 
        should.  This bias can only happen for small values of `alpha`, i.e., 
        `alpha << 1` or large values of `beta`, i.e., `beta >> 1`. 
     
      Args: 
        shape: A 1-D integer Tensor or Python array. The shape of the output samples 
          to be drawn per alpha/beta-parameterized distribution. 
        alpha: A Tensor or Python value or N-D array of type `dtype`. `alpha` 
          provides the shape parameter(s) describing the gamma distribution(s) to 
          sample. Must be broadcastable with `beta`. 
        beta: A Tensor or Python value or N-D array of type `dtype`. Defaults to 1. 
          `beta` provides the inverse scale parameter(s) of the gamma 
          distribution(s) to sample. Must be broadcastable with `alpha`. 
        dtype: The type of alpha, beta, and the output: `float16`, `float32`, or 
          `float64`. 
        seed: A Python integer. Used to create a random seed for the distributions. 
          See 
          @{tf.set_random_seed} 
          for behavior. 
        name: Optional name for the operation. 
     
      Returns: 
        samples: a `Tensor` of shape `tf.concat(shape, tf.shape(alpha + beta))` 
          with values of type `dtype`. 
      """  
      with ops.name_scope(name, "random_gamma", [shape, alpha, beta]):  
        shape = ops.convert_to_tensor(shape, name="shape", dtype=dtypes.int32)  
        alpha = ops.convert_to_tensor(alpha, name="alpha", dtype=dtype)  
        beta = ops.convert_to_tensor(  
            beta if beta is not None else 1, name="beta", dtype=dtype)  
        alpha_broadcast = alpha + array_ops.zeros_like(beta)  
        seed1, seed2 = random_seed.get_seed(seed)  
        return math_ops.maximum(  
            np.finfo(dtype.as_numpy_dtype).tiny,  
            gen_random_ops._random_gamma(  
                shape, alpha_broadcast, seed=seed1, seed2=seed2) / beta)  
      
    ops.NotDifferentiable("RandomGamma")  
      
      
    def random_poisson(lam, shape, dtype=dtypes.float32, seed=None, name=None):  
      """Draws `shape` samples from each of the given Poisson distribution(s). 
     
      `lam` is the rate parameter describing the distribution(s). 
     
      Example: 
     
        samples = tf.random_poisson([0.5, 1.5], [10]) 
        # samples has shape [10, 2], where each slice [:, 0] and [:, 1] represents 
        # the samples drawn from each distribution 
     
        samples = tf.random_poisson([12.2, 3.3], [7, 5]) 
        # samples has shape [7, 5, 2], where each slice [:, :, 0] and [:, :, 1] 
        # represents the 7x5 samples drawn from each of the two distributions 
     
      Args: 
        lam: A Tensor or Python value or N-D array of type `dtype`. 
          `lam` provides the rate parameter(s) describing the poisson 
          distribution(s) to sample. 
        shape: A 1-D integer Tensor or Python array. The shape of the output samples 
          to be drawn per "rate"-parameterized distribution. 
        dtype: The type of `lam` and the output: `float16`, `float32`, or 
          `float64`. 
        seed: A Python integer. Used to create a random seed for the distributions. 
          See 
          @{tf.set_random_seed} 
          for behavior. 
        name: Optional name for the operation. 
     
      Returns: 
        samples: a `Tensor` of shape `tf.concat(shape, tf.shape(lam))` with 
          values of type `dtype`. 
      """  
      with ops.name_scope(name, "random_poisson", [lam, shape]):  
        lam = ops.convert_to_tensor(lam, name="lam", dtype=dtype)  
        shape = ops.convert_to_tensor(shape, name="shape", dtype=dtypes.int32)  
        seed1, seed2 = random_seed.get_seed(seed)  
        return gen_random_ops._random_poisson(shape, lam, seed=seed1, seed2=seed2) 

     原文链接:https://blog.csdn.net/tz_zs/article/details/75948350

     官方文档api 不知道为啥不能访问(已翻墙)

    中文官方文档:http://www.tensorfly.cn/tfdoc/api_docs/python/constant_op.html

  • 相关阅读:
    半年时间
    deep learning书的阅读
    wgan pytorch,pyvision, py-faster-rcnn等的安装使用
    caffe新版本的各种软件
    你会允许自己家孩子一直不停跟人要东西吗?
    sup inf max min
    leangoo大讲堂—北京站
    使用Leangoo玩转故事地图
    Leangoo:用敏捷开发管理思维做团队协作的SaaS软件
    张江男的逆袭,我如何使用leangoo提升团队效率
  • 原文地址:https://www.cnblogs.com/cbugs/p/9072819.html
Copyright © 2011-2022 走看看