U
    d                     @   s8   d dl mZmZ d dlmZ d dlZG dd deZdS )    )coreschema)
ModelLayerNc                       s6   e Zd Zd fdd	Zdd Zd	d
 Zdd Z  ZS )BatchSoftmaxLossbatch_softmax_lossNF      ?c           	   
      s   t t| j|||f| ttdt fdt f|s@t|| _|| _	|| _
|| _| jd k	rj|   tdt|j | dfdttj| df| _d S )Nlabel
predictionZsoftmaxZloss)superr   __init__r   Zis_schema_subsetStructZScalarAssertionError
label_probscaleaverage_by_batch_sizelabel_smoothing_matrix$initialize_label_smoothing_constantsr	   
field_typeZget_next_blob_referencenpfloat32output_schema)	selfmodelinput_recordnamer   r   r   r   kwargs	__class__ K/tmp/pip-unpacked-wheel-ua33x9lu/caffe2/python/layers/batch_softmax_loss.pyr      sD    
  


   zBatchSoftmaxLoss.__init__c                 C   s   | j d k	stt| j tj| _ t| j jdks8t| j jd }|| j jd ksXt| jj	d| j
 | j ttjd| _ | jj	d| j
 |ttjd| _d| _d S )N   r      z%s_label_smoothing_matrix)arraydtypez%s_label_dimT)r   r   r   r"   Zastyper   lenshaper   Zadd_global_constantr   r#   int64	label_dimr   )r   r'   r   r   r   r   <   s(    

z5BatchSoftmaxLoss.initialize_label_smoothing_constantsc                 C   s   | j d k	st| j }| jj }|jtjkrT|d}|j	|g|gt
jjd n|}|d}|d}||| jg|g ||| j g| |S )Nint64_labeltoone_hot_labelsmoothed_label)r   r   r   r   r   baser   r&   NextScopedBlobCastr   DataTypeZINT64ZOneHotr'   ZMatMul)r   netr   Zoriginal_label_typer(   r+   r,   r   r   r   compute_smoothed_labelR   s    



z'BatchSoftmaxLoss.compute_smoothed_labelc                 C   s   | j j }| jd k	r$| |g}n:| js^| j j d jtj	kr^|j
||dtjjdg}| j j | }d| j kr| j  }| j j jtjkr|j
||d tjjd}||g7 }|j|| j | j| j| jd d S )Nr   Zint32_labelr)   weightZ_float32)r   r   r   )r   r   Zfield_blobsr   r2   r   Zfield_typesr-   r   Zint32r/   r.   r   r0   ZINT32r	   r3   r   r   FLOATZSoftmaxWithLossr   r   r   )r   r1   r   Zsoftmax_inputZweight_blobr   r   r   add_opsa   s6    



zBatchSoftmaxLoss.add_ops)r   NFr   F)__name__
__module____qualname__r   r   r2   r5   __classcell__r   r   r   r   r      s        .r   )Zcaffe2.pythonr   r   Zcaffe2.python.layers.layersr   Znumpyr   r   r   r   r   r   <module>   s   