o
    ॵi5                     @   s   d dl Z d dlmZ d dlmZmZmZ d dlZd dl	Z	d dl
mZ d dlmZ d dlmZmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlm Z  e  Z!ej"ej#dG dd deZ$dS )    N)OrderedDict)CallableDictOptional)confusion_matrix)
DataLoaderDataset)Trainers)Model)BaseTrainer)TRAINERS)get_optimizer)Config)Invoke)
get_logger)module_namec                       s`   e Zd Zdedededededef fddZd	d
 Z	dde	e de
eef fddZ  ZS )TEAMImgClsTrainercfg_filemodel	device_iddata_collatortrain_datasetval_datasetc              	      s   t  | t|| _tj|tjd}	|	j	j
j}
ttd|
fdtd| jjjfg}|| _	| j	 D ]\}}d|v r@d|_q5|| _| jjj| _| jjj| _| jjj| _| jjj| _|| _|| _|| _t  !| j| _"d S )N)
invoked_byencoder
classifieri   F)#super__init__r   	from_filecfgr
   from_pretrainedr   TRAINERr   image_modelvision_transformernn
Sequentialr   Lineardataset	class_numnamed_parametersrequires_gradr   trainepochtotal_epoch
batch_sizetrain_batch_size
evaluationval_batch_sizeckpt_dir
collate_fnr   r   CrossEntropyLossto	criterion)selfr   r   r   r   r   r   argskwargs
team_modelr"   classification_modelpnameparam	__class__ e/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/trainers/multi_modal/team/team_trainer.pyr      s2   
zTEAMImgClsTrainer.__init__c                 O   s.  | j   | j | j t| j }t| jD ]~}d| j| jdddd}t	| j
fi |}t|D ]I\}}|d |d }	}
|	j| jdd}	|
j| jdd}
|  |	}| ||
}|  |  |  |d dkrytd	||t||  q0tj| jdd
 t| j  d| j| |   qd S )NT   )
pin_memoryr3   r.   shuffle	drop_lastnum_workerspixel_valueslabelsnon_blocking
   r   z)epoch: {}, train batch {}/{}, loss={:.5f})exist_okz{}/epoch{}.pth)r   r+   r5   r   r   ranger-   r3   r/   r   r   	enumerater6   	zero_gradbackwardsteploggerinfoformatlenitemosmakedirsr2   torchsave
state_dictevaluate)r7   r8   r9   	optimizerr,   train_paramstrain_loader	batch_idxdata
img_tensorlabel_tensorpred_logitslossr@   r@   rA   r+   ;   sH   

	

zTEAMImgClsTrainer.trainNcheckpoint_pathreturnc                 O   s  |d urt |d}| j| | j  | j| j | j| jdddd}t	| j
fi |}d\}}g g }	}
t  b t|D ]U\}}|d |d }}|j| jdd	}|j| jdd	}| |}t j|d
dd
 }|t ||k 7 }||jd 7 }td||  |	|  |
|  qAW d    n1 sw   Y  t|
|	}t| |jd
d }td| d S )NcpuFrB   )r3   r.   rD   rE   rF   )r   r   rG   rH   TrI      )dimr   zAccuracy: {:.3f})axiszAccuracy mean per class: {:.3f})rY   loadr   load_state_dictevalr5   r   r3   r1   r   r   no_gradrN   maxsumrV   shaperR   rS   rT   extendtolistr   npmeandiagonal)r7   rf   r8   r9   checkpoint_params
val_params
val_loadertp_cntprocessed_cntall_pred_labelsall_gt_labelsr`   ra   rb   rc   rd   pred_labelsconf_matacc_mean_per_classr@   r@   rA   r\   d   sJ   






zTEAMImgClsTrainer.evaluate)N)__name__
__module____qualname__strintr   r   r   r+   r   r   floatr\   __classcell__r@   r@   r>   rA   r      s    *
r   )%rW   collectionsr   typingr   r   r   numpyru   rY   torch.nnr$   sklearn.metricsr   torch.utils.datar   r   modelscope.metainfor	   modelscope.models.baser
   modelscope.trainers.baser   modelscope.trainers.builderr   7modelscope.trainers.multi_modal.team.team_trainer_utilsr   modelscope.utils.configr   modelscope.utils.constantr   modelscope.utils.loggerr   rR   register_moduleimage_classification_teamr   r@   r@   r@   rA   <module>   s&   