B
    «»ˆd  ã               @   sR   d Z ddlZddlm  mZ ddlmZ ddl	m
Z
 e
dƒG dd„ deƒƒZdS )zContains the Reshape layer.é    N)ÚLayer)Úkeras_exportzkeras.layers.Reshapec                   sD   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Z‡ fd
d„Z‡  Z	S )ÚReshapeaÛ  Layer that reshapes inputs into the given shape.

    Input shape:
      Arbitrary, although all dimensions in the input shape must be known/fixed.
      Use the keyword argument `input_shape` (tuple of integers, does not
      include the samples/batch size axis) when using this layer as the first
      layer in a model.

    Output shape:
      `(batch_size,) + target_shape`

    Example:

    >>> # as first layer in a Sequential model
    >>> model = tf.keras.Sequential()
    >>> model.add(tf.keras.layers.Reshape((3, 4), input_shape=(12,)))
    >>> # model.output_shape == (None, 3, 4), `None` is the batch size.
    >>> model.output_shape
    (None, 3, 4)

    >>> # as intermediate layer in a Sequential model
    >>> model.add(tf.keras.layers.Reshape((6, 2)))
    >>> model.output_shape
    (None, 6, 2)

    >>> # also supports shape inference using `-1` as dimension
    >>> model.add(tf.keras.layers.Reshape((-1, 2, 2)))
    >>> model.output_shape
    (None, 3, 2, 2)
    c                s   t ƒ jf |Ž t|ƒ| _dS )a  Creates a `tf.keras.layers.Reshape`  layer instance.

        Args:
          target_shape: Target shape. Tuple of integers, does not include the
            samples dimension (batch size).
          **kwargs: Any additional layer keyword arguments.
        N)ÚsuperÚ__init__ÚtupleÚtarget_shape)Úselfr   Úkwargs)Ú	__class__© úP/var/www/html/venv/lib/python3.7/site-packages/keras/layers/reshaping/reshape.pyr   <   s    zReshape.__init__c       	      C   s¶   t |ƒ}d ||¡}d\}}xDt|ƒD ]8\}}|dk rV|dkrD|}q^td|› dƒ‚q&||9 }q&W tj|td}|dk	r¢|dksŒ|| dkr”t|ƒ‚|| ||< n||kr²t|ƒ‚|S )aÕ  Find and replace a missing dimension in an output shape.

        This is a near direct port of the internal Numpy function
        `_fix_unknown_dimension` in `numpy/core/src/multiarray/shape.c`

        Args:
          input_shape: Shape of array being reshaped
          output_shape: Desired shape of the array with at most a single -1
            which indicates a dimension that should be derived from the input
            shape.

        Returns:
          The new output shape with a -1 replaced with its computed value.

        Raises:
          ValueError: If the total array size of the output_shape is
          different than the input_shape, or more than one unknown dimension
          is specified.
        zNtotal size of new array must be unchanged, input_shape = {}, output_shape = {})é   Nr   NzTThere must be at most one unknown dimension in output_shape. Received: output_shape=Ú.)Zdtype)ÚlistÚformatÚ	enumerateÚ
ValueErrorÚnpÚprodÚint)	r	   Úinput_shapeÚoutput_shapeÚmsgZknownÚunknownÚindexÚdimÚoriginalr   r   r   Ú_fix_unknown_dimensionG   s&    zReshape._fix_unknown_dimensionc             C   sp   t  |¡ ¡ }d |dd … krB|d g}|tdd„ | jD ƒƒ7 }n$|d g}||  |dd … | j¡7 }t  |¡S )Nr   r   c             s   s   | ]}|d kr|ndV  qdS )éÿÿÿÿNr   )Ú.0Úsr   r   r   ú	<genexpr>   s    z/Reshape.compute_output_shape.<locals>.<genexpr>)ÚtfZTensorShapeÚas_listr   r   r   )r	   r   r   r   r   r   Úcompute_output_shapey   s    

zReshape.compute_output_shapec             C   s<   t  |t  |¡d f| j ¡}t  ¡ s8| |  |j¡¡ |S )Nr   )r#   ZreshapeÚshaper   Zexecuting_eagerlyÚ	set_shaper%   )r	   ÚinputsÚresultr   r   r   Úcallˆ   s    zReshape.callc                s0   d| j i}tƒ  ¡ }tt| ¡ ƒt| ¡ ƒ ƒS )Nr   )r   r   Ú
get_configÚdictr   Úitems)r	   ÚconfigZbase_config)r   r   r   r+   ‘   s    

zReshape.get_config)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r%   r*   r+   Ú__classcell__r   r   )r   r   r      s   2	r   )r2   Únumpyr   Ztensorflow.compat.v2ÚcompatZv2r#   Zkeras.engine.base_layerr   Z tensorflow.python.util.tf_exportr   r   r   r   r   r   Ú<module>   s   