
    $!h                        S r SSKrSSKJr  SSKJs  Jr  SSKrSSK	J
r
Jr  SSKJr   " S S\R                  5      rSS
 jr    SS jr    SS jr\S:X  ai  \" S5        \" S5        \" S5        \" S	SS/S9r\" S\R,                  R.                   35        \" \SSSSS9  \" \SSSS9r\" S5        \" S\S S35        gg) z
Few-Shot Learning with Prototypical Networks
Learn new classes from just N examples per class (N-shot learning)
Paper: "Prototypical Networks for Few-shot Learning" (2017)
    N)ListTuple)FeatureExtractorc                   Z   ^  \ rS rSrSrSS/4S\S\\   4U 4S jjjrS rS	 r	S
 r
SrU =r$ )PrototypicalNetwork   z
Prototypical Networks for Few-Shot Learning
Learns to map examples to an embedding space where classification
is performed by finding the nearest class prototype
   @   
input_sizefeature_sizesc                 B   > [         TU ]  5         [        X5      U l        g )N)super__init__r   feature_extractor)selfr   r   	__class__s      [/home/james-whalen/eden-agi-project/real_capabilities/learning/transfer/few_shot_learner.pyr   PrototypicalNetwork.__init__   s    !1*!L    c                 $    U R                  U5      $ )zExtract features/embeddingsr   )r   xs     r   forwardPrototypicalNetwork.forward   s    %%a((r   c                     / n[        U5       H*  nXU:H     nUR                  SS9nUR                  U5        M,     [        R                  " U5      $ )zt
Compute prototype (mean) for each class
support_embeddings: [n_support, embedding_dim]
support_labels: [n_support]
r   dim)rangemeanappendtorchstack)r   support_embeddingssupport_labelsn_way
prototypescclass_embeddings	prototypes           r   compute_prototypes&PrototypicalNetwork.compute_prototypes   sW     
uA1A2EF(--!-4Ii(  {{:&&r   c                 |    [         R                  " X5      R                  S5      * n[        R                  " USS9nU$ )zf
Classify queries by finding nearest prototype
Uses negative squared Euclidean distance as similarity
      r   )r!   cdistpowFlog_softmax)r   query_embeddingsr&   	distances	log_probss        r   classify_queries$PrototypicalNetwork.classify_queries-   s9     [[!1>BB1EE	 MM)3	r   r   )__name__
__module____qualname____firstlineno____doc__intr   r   r   r*   r6   __static_attributes____classcell__)r   s   @r   r   r      sG     EH9 M3 MtCy M M)'" r   r            c                    [         R                  R                  U 5        / n/ n/ n/ n[        U5       H  n	[         R                  R	                  U5      S-  n
[         R                  R	                  X$5      U
-   nUR                  U5        UR                  U	/U-  5        [         R                  R	                  X45      U
-   nUR                  U5        UR                  U	/U-  5        M     [         R                  " U5      n[         R                  " U5      n[         R                  R                  [        U5      5      n[         R                  R                  [        U5      5      n[        R                  " X]   5      [        R                  " [         R                  " U5      U   5      [        R                  " X~   5      [        R                  " [         R                  " U5      U   5      4$ )z
Create an episode for few-shot learning
n_way: number of classes
n_shot: examples per class in support set
n_query: examples per class in query set
r-   )nprandomseedr   randnr    extendvstackpermutationlenr!   FloatTensor
LongTensorarray)task_idr%   n_shotn_queryr   	support_X	support_yquery_Xquery_yclass_id
class_meansupport_examplesquery_examplessupport_idx	query_idxs                  r   create_episoder\   :   sy    IINN7IIGG%LYY__Z014
 99??6>K)*(f,- =
J~&zG+, ! 		)$Iii G ))''I7K		%%c'l3I 	)01),[9:',-'*956	 r     c                 
   [        S5        [        S5        [        SU SU SU S35        [        S5        [        R                  R                  U R	                  5       SS	9n[        U5       GH  n[        XbX45      u  pxpU " U5      nU " U	5      nU R                  XU5      nU R                  X5      n[        R                  " X5      nUR                  5         UR                  5         UR                  5         UR                  S
S9nUU
:H  R                  5       R!                  5       R#                  5       nUS
-   S-  S:X  d  M  [        SUS
-    SU SUR#                  5       S SUS-  S S3	5        GM	     [        S5        g)z8
Train prototypical network on distribution of episodes
G
======================================================================z1TRAINING PROTOTYPICAL NETWORK (FEW-SHOT LEARNING)z
Episodes: z | -way -shotF======================================================================gMbP?)lrr.   r      r   zEpisode /z	 - Loss: z.4fz - Acc: d   .2f%u   
✅ Training complete!N)printr!   optimAdam
parametersr   r\   r*   r6   r1   nll_loss	zero_gradbackwardstepargmaxfloatr   item)model
n_episodesr%   rP   rQ   	optimizerepisoderR   rS   rT   rU   r#   r3   r&   r5   losspredaccuracys                     r   train_prototypical_networkr{   d   s    
-	
=>	Jzl#eWE&
?@	&M  !1!1!3 >I$1?F2
.	g
 #9- > --.@US
 **+;H	 zz)- 	 A&GO**,11388:aK3!#HWQYKq 599;s+8HSL3EQH I; %@ 

$%r   rf   c                    [        S5        [        SU S35        [        U SU S35        [        S5        U R                  5         Sn[        R                  " 5          [	        U5       H  n[        SU-   X#U5      u  pxpU " U5      nU " U	5      nU R                  XU5      nU R                  X5      nUR                  S	S
9nX:H  R                  5       R                  5       R                  5       nUU-  nM     SSS5        XQ-  S-  n[        SS 35        [        SUS S35        [        S 5        US:  a  [        SU SU S35        U$ [        SUS S35        U$ ! , (       d  f       Nk= f)z
Evaluate on new episodes
r_   zEVALUATING ON z NEW EPISODESr`   z-shot classificationrb   r   i'  r.   r   Nrf   
zAverage Accuracy: rg   rh   P   u   
🎯 GOAL ACHIEVED! >80% on ra   u   
📊 Current: z% (goal: 80%))ri   evalr!   no_gradr   r\   r*   r6   rq   rr   r   rs   )rt   n_test_episodesr%   rP   rQ   total_accuracyrw   rR   rS   rT   rU   r#   r3   r&   r5   ry   rz   avg_accuracys                     r   evaluate_few_shotr      s    
-	N?+=
9:	UG5 4
56	&M	JJLN	_-G5C62I'
 "'y!1$W~ 112DQVWJ ../?LI ###*D..0557<<>Hh&N' . 
, #4;L	Bvh-	|C0
23	VHr.ugU6(%HI  	 c 2-@AC 
s   BE
E,__main__r_   z,FEW-SHOT LEARNING WITH PROTOTYPICAL NETWORKSrb   r	   r
   )r   r   z 
Model created - Embedding dim: )ru   r%   rP   rQ   )r   r%   rP   u(   
✅ Few-shot learning capability ready!z   5-way 5-shot accuracy: z.1frh   )r@   r@   rA   rB   )r]   r@   r@   rA   )rf   r@   r@   rA   )r<   r!   torch.nnnntorch.nn.functional
functionalr1   numpyrD   typingr   r   transfer_learnerr   Moduler   r\   r{   r   r8   ri   rt   r   feature_dimrz    r   r   <module>r      s   
       -+")) +Z(X 
1&j 
3j z	-	
89	&M  2c2YGE	-e.E.E.Q.Q-R
ST  !1QOH	
56	&xnA
67- r   