【515】keras 张量操作

参考:keras-team / keras - github


  keras 的实质就是对于张量的操作,所以对于某些函数的理解,需要自己通过张量的实操来体会。同时每一个网络层的输入和输出也都是张量的操作,可以参见下面链接进行简单张量 Tensor 的操作。

  参考:【tensorflow】张量(tensor,数组)的定义和声明 —— 入门,简单了解

  参考:TensorFlow官方文档 —— 完善,不过内容繁杂

  参考:tensorflow学习笔记:张量介绍以及张量操作函数 —— 入门,简单了解

1. 环境配置

  大部分操作还是要基于 TensorFlow,由于某些函数依赖于更高版本的 TensorFlow,因此需要将其升级到最新版,简单的方法就是:(参考:tensorflow指定版本的安装及升级到最新版

# 升级到CPU最新版
# cmd输入如下代码
pip install--upgrade tensorflow

# 升级到GPU最新版
# cmd输入如下代码
pip install --upgrade tensorflow-gpu

# 查看当前TensorFlow版本
# python输入如下代码
import tensorflow as tf
tf.__version__

  升级的过程中可能可能遇到升级出错的以下错误“ERROR: Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问...”,可以将升级的代码改写如下:(参考:完美解决:ERROR: Could not install packages...

pip install--upgrade tensorflow --user

  

2. 具体类及函数

2.1 keras.layers.Multiply

class Multiply(_Merge):
  """Layer that multiplies (element-wise) a list of inputs.
  It takes as input a list of tensors, all of the same shape, and returns
  a single tensor (also of the same shape).
  >>> tf.keras.layers.Multiply()([np.arange(5).reshape(5, 1),
  ...                             np.arange(5, 10).reshape(5, 1)])
  <tf.Tensor: shape=(5, 1), dtype=int64, numpy=
  array([[ 0],
       [ 6],
       [14],
       [24],
       [36]])>
  >>> x1 = tf.keras.layers.Dense(8)(np.arange(10).reshape(5, 2))
  >>> x2 = tf.keras.layers.Dense(8)(np.arange(10, 20).reshape(5, 2))
  >>> multiplied = tf.keras.layers.Multiply()([x1, x2])
  >>> multiplied.shape
  TensorShape([5, 8])
  """

  def _merge_function(self, inputs):
    output = inputs[0]
    for i in range(1, len(inputs)):
      output *= inputs[i]
    return output

  ☀☀☀<< 举例 >>☀☀☀

>>> a = np.arange(20).reshape(5,4)
>>> a
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19]])
>>> b = np.arange(5).reshape(5,1)
>>> b
array([[0],
       [1],
       [2],
       [3],
       [4]])
>>> tf.keras.layers.Multiply()([a, b])
<tf.Tensor: shape=(5, 4), dtype=int32, numpy=
array([[ 0,  0,  0,  0],
       [ 4,  5,  6,  7],
       [16, 18, 20, 22],
       [36, 39, 42, 45],
       [64, 68, 72, 76]])>

  点乘,并且满足 numpy 的广播机制。

2.2 keras.layers.Softmax

class Softmax(Layer):
  """Softmax activation function.
  Example without mask:
  >>> inp = np.asarray([1., 2., 1.])
  >>> layer = tf.keras.layers.Softmax()
  >>> layer(inp).numpy()
  array([0.21194157, 0.5761169 , 0.21194157], dtype=float32)
  >>> mask = np.asarray([True, False, True], dtype=bool)
  >>> layer(inp, mask).numpy()
  array([0.5, 0. , 0.5], dtype=float32)
  Input shape:
    Arbitrary. Use the keyword argument `input_shape`
    (tuple of integers, does not include the samples axis)
    when using this layer as the first layer in a model.
  Output shape:
    Same shape as the input.
  Args:
    axis: Integer, or list of Integers, axis along which the softmax
      normalization is applied.
  Call arguments:
    inputs: The inputs, or logits to the softmax layer.
    mask: A boolean mask of the same shape as `inputs`. Defaults to `None`.
  Returns:
    softmaxed output with the same shape as `inputs`.
  """

  这个说明主要是针对 Attention 实现中的 Softmax 使用,对于输入为 (a, b, 1) 的张量,经过 Softmax 之后,并不会对第 2 维度做 softmax,而是对最后一维的一个数字进行操作,因此所有的结果都变成了 1。正确方法是先 squeeze 成二维,即 (a, b),然后进行 Softmax 操作,然后再 expand_dim 到三维,即 (a, b, 1),举例如下:

>>> a = np.arange(6.0).reshape(2, 3, 1)
>>> a
array([[[0.],
        [1.],
        [2.]],

       [[3.],
        [4.],
        [5.]]])

>>> b = a.squeeze()
>>> b
array([[0., 1., 2.],
       [3., 4., 5.]])

>>> c = tf.keras.layers.Softmax()(b)
>>> c
<tf.Tensor: shape=(2, 3), dtype=float32, numpy=
array([[0.09003057, 0.24472848, 0.66524094],
       [0.09003057, 0.24472848, 0.66524094]], dtype=float32)>

>>> d = np.expand_dims(c, axis=-1)
>>> d
array([[[0.09003057],
        [0.24472848],
        [0.66524094]],

       [[0.09003057],
        [0.24472848],
        [0.66524094]]], dtype=float32)

  

  

原文地址:https://www.cnblogs.com/alex-bn-lee/p/14219515.html