o
    ϯiC                     @   s|   d dl Z d dlmZ d dlZd dlm  mZ d dlmZ d dl	m
Z
 ddlmZmZ dd Zdd
dZdd Zdd ZdS )    N)suppress)tqdm)tokenize   )imagenet_classnamesopenai_imagenet_templatec                    s   t  V g }t|D ];  fdd|D }t||j}|jr+|js+| j	|}n| 	|}t
j|ddjdd}||  }|| qt j|dd|j}W d    |S 1 s]w   Y  |S )Nc                    s   g | ]}| qS  r   ).0template	classnamer   Q/home/ubuntu/.local/lib/python3.10/site-packages/laion_clap/training/zero_shot.py
<listcomp>   s    z(zero_shot_classifier.<locals>.<listcomp>dimr   r   )torchno_gradr   r   todevicedistributedhorovodmoduleencode_textF	normalizemeannormappendstack)model
classnames	templatesargszeroshot_weightstextsclass_embeddingsclass_embeddingr   r   r   zero_shot_classifier   s    


r(   r   c                    sF   |  t|dddd  }||dd|  fdd|D S )Nr   Tr   c                    s8   g | ]}t  d | d  jddd  qS )Nr   r   T)keepdim)floatreshapesumcpunumpy)r	   kcorrectr   r   r   !   s   8 zaccuracy.<locals>.<listcomp>)topkmaxteqview	expand_as)outputtargetr3   predr   r1   r   accuracy   s   r<   c              
   C   s&  |j dkr
tjjjnt}t o d\}}}t||jdD ]Z\}}	|	|j
}|		|j
}	| ' |jr>|js>| j|}
n| |}
tj|
dd}
d|
 | }W d    n1 sZw   Y  t||	dd\}}||7 }||7 }||d	7 }qW d    n1 sw   Y  || }|| }||fS )
Namp)        r>   r>   )
unit_scaler   r   g      Y@)r      )r3   r   )	precisionr   cudar=   autocastr   r   r   
batch_sizer   r   r   r   r   encode_imager   r   r<   size)r    
classifier
dataloaderr#   rC   top1top5nimagesr:   image_featureslogitsacc1acc5r   r   r   run$   s,   



rQ   c                 C   s   d|vr
d|vr
i S |j dkri S ||j  dkr||jkri S td td t| tt|}td i }d|v rOt| ||d j|\}}||d< ||d< d|v rgt| ||d j|\}}||d	< ||d
< td |S )Nzimagenet-valzimagenet-v2r   zStarting zero-shot imagenet.zBuilding zero-shot classifierzUsing classifierzimagenet-zeroshot-val-top1zimagenet-zeroshot-val-top5zimagenetv2-zeroshot-val-top1zimagenetv2-zeroshot-val-top5zFinished zero-shot imagenet.)	zeroshot_frequencyepochslogginginfor(   r   r   rQ   rH   )r    dataepochr#   rG   resultsrI   rJ   r   r   r   zero_shot_eval@   s*   




rY   )r)   )rT   
contextlibr   r   torch.nn.functionalnn
functionalr   r   clap_moduler   imagenet_zeroshot_datar   r   r(   r<   rQ   rY   r   r   r   r   <module>   s   
