U
    d                     @   s4   d dl mZ d dlmZ d dlZG dd deZdS )    )schema)
ModelLayerNc                       s@   e Zd Zd fdd	Zddd	Zd
d Zdd Zdd Z  ZS )BatchNormalizationbatch_normalizationN?NCHW      ?c	                    s@  t t| j|||f|	 t|tjs,td| j| _	t
| j	dkrx|dkrZ| j	d }
q|dkrn| j	d }
qtdn t
| j	dkstd	| j	d }
ttj| j	f| d
| _|| _|| _| jd|
gdd|if|d| _| jd|
gdddif|d| _| jd|
gdddif|jd| _| jd|
gdddif|jd| _d S )NzIncorrect input type   r   r   ZNHWC   zPlease specify a correct order   z)This layer supports only 4D or 2D tensorsoutputscaleZConstantFillvalue)
param_nameshapeZinitializerZ	optimizerbiasg        Zrunning_meanZrunning_inv_varr   )superr   __init__
isinstancer   ZScalarAssertionErrorZ
field_typer   input_shapelen
ValueErrornpZfloat32Zget_next_blob_referenceoutput_schemamomentumorderZcreate_paramr   r   ZNoOptimrmriv)selfmodelinput_recordnameZscale_optimZ
bias_optimr   r   Zscale_init_valuekwargsZ
input_dims	__class__ L/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/layers/batch_normalization.pyr      sZ    
  






zBatchNormalization.__init__c                 C   s   | j  }|d}t| jdkr6|j|ddgd}n|d }|d krR| j }n|}|r`|}n || j| j|d|dg }|j	|| j
| j| j| jg|| j|| jd	 t| jdkr|j||ddgd d S )
NZexpand_inputr   r
   r	   )Zdimsr   Zbn_saved_meanZbn_saved_iv)r   is_testr   )r!   Zfield_blobsZNextScopedBlobr   r   Z
ExpandDimsr   r   r   Z	SpatialBNr   r   r   r   ZSqueeze)r   netr(   Zout_blobZoriginal_input_blobZ
input_blobZ	bn_outputZoutput_blobsr&   r&   r'   _add_opsE   s>    



  zBatchNormalization._add_opsc                 C   s   | j |dd d S )NFr(   r*   r   r)   r&   r&   r'   add_train_opse   s    z BatchNormalization.add_train_opsc                 C   s   | j |dd d S )NTr+   r,   r-   r&   r&   r'   add_eval_opsh   s    zBatchNormalization.add_eval_opsc                 C   s   |  | d S )N)r/   r-   r&   r&   r'   add_opsk   s    zBatchNormalization.add_ops)r   NNr   r   r   )N)	__name__
__module____qualname__r   r*   r.   r/   r0   __classcell__r&   r&   r$   r'   r      s         8
 r   )Zcaffe2.pythonr   Zcaffe2.python.layers.layersr   Znumpyr   r   r&   r&   r&   r'   <module>   s   