a
    ==ic_&                     @   s   d dl mZmZmZmZmZ d dlmZ d dlm	Z	 d dl
mZ d dlZd dlZd dlZd dlmZ e  edZeej e fdd	ZG d
d deZejdd Zedkreddg e  dS )    )core	workspacemodel_helperutilsbrew)LSTM)
caffe2_pb2)	build_sgdN)datetimechar_rnnc                 C   s(   |   }||vr$|| t|  d S N)Nameaddr   	CreateNet)netZcreated_namesname r   p/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/caffe2/python/examples/char_rnn.pyCreateNetOnce   s    
r   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )CharRNNc                 C   s   |j | _ |j| _|j| _|j| _t|j}| | _W d    n1 sJ0    Y  tt	| j| _
dd t| j
D | _dd t| j
D | _t| j| _tdt| j
t| j d S )Nc                 S   s   i | ]\}}||qS r   r   .0idxchr   r   r   
<dictcomp>1       z$CharRNN.__init__.<locals>.<dictcomp>c                 S   s   i | ]\}}||qS r   r   r   r   r   r   r   2   r   z-Input has {} characters. Total input size: {})
seq_length
batch_sizeiters_to_reporthidden_sizeopenZ
train_datareadtextlistsetvocab	enumeratechar_to_idxidx_to_charlenDprintformat)selfargsfr   r   r   __init__'   s    (zCharRNN.__init__c              	   C   sB  t d tjdd}|jddddd\}}}}}t|||||f| j| jd	d
\}| _	}| _
tj||d | j| jdd}	|jj|	ddd}
|jj|
ddgd| jgd\}}t|j | _|j||gd}|j|d}||g t|d| j dddd || _|
| _|| _td| _| j| j	| | j| j
| d S )NzStart trainingr   )r   
input_blobseq_lengthshidden_init	cell_inittargetr   )scope   )Zdim_inZdim_outaxissoftmax)r8   softmax_reshaped_)shapexentlossg?step   gH.?)Zbase_learning_ratepolicyZstepsizegammaprepare_state)logdebugr   ZModelHelperr   ZAddExternalInputsr   r*   r   hidden_output
cell_stater   ZfcZSoftmaxZReshaper   ZNetZProtoforward_netZLabelCrossEntropyZAveragedLossZAddGradientOperatorsr	   r   modelpredictionsr?   rD   ZCopy)r-   rJ   r1   r2   r3   r4   r5   Zhidden_output_allr;   outputr9   r:   r>   r?   r   r   r   CreateModel8   sV    
	

zCharRNN.CreateModelc                 C   s   | j | j|  S r   )r'   r"   )r-   posr   r   r   _idx_at_poss   s    zCharRNN._idx_at_posc                 C   s:  t d t| jj t d| j  | j }d}d}d}t	| j
}tj| jtjd}|| j }ttd||}|g| j }	|	| jd   || j 7  < t|	|ksJ t| jtjd| j| jgtjd t| jtjd| j| jgtjd t| j t }
d}tdtj| jg| j tjd t| j  t| j| j| jgtj}t| j| j gtj}t| jD ]~}t| jD ]l}|| ||  }d|| | | |< | |d | ||| j | < || d |	|  ||< |d7 }qqtd| td	| t| jj  t| jj   |d7 }|d7 }|| j! dkrt }t"d
#t$|||
 %   t"d#t$| j!||
 %   |}
d}t"d#d|d t&| j'| j }d| d|  }||7 }|| j! dkr
| (dtj)*| j+ t d#||  t d#| d}d}q
d S )NzTraining modelg      ?r   g        ZdtyperA   r2   r1   r5   zCharacters Per Second: {}zIterations Per Second: {}z{} Iteration {} {}z
----------g+?gMbP?  zLoss since last report: {}zSmooth loss: {}),rE   rF   r   Z
RunNetOncerJ   Zparam_init_netnpr*   r   r)   r"   zerosr   int32r#   rangesumFeedBlobrG   r   float32rH   r   rD   r
   nowarrayRunNetr   astyperO   r   r   r   r+   r,   inttotal_seconds	FetchBlobr?   GenerateTextrandomchoicer%   )r-   Zsmooth_lossZlast_n_iterZlast_n_lossZnum_iterNZtext_block_positionsZtext_block_sizeZtext_block_startsZtext_block_sizesZ	last_timeprogressinputr5   eirN   Znew_timer?   r   r   r   
TrainModelv   s    



zCharRNN.TrainModelc                 C   s   t | j d| }t|D ]}tdtjdg| j tjd t	| j
  td| j| jgtj}d|d d | j| < td| t	| j  t| j}tjj| j|d d d}| j| }||7 }qt| d S )N r2   rA   rP   r   r1   )p)r   rI   rU   r   rW   rR   rZ   r   rT   r[   rD   r   rS   r*   r\   rX   r'   r_   rK   ra   rb   r(   r+   )r-   Znum_charactersr   r"   Z_ire   rj   nextr   r   r   r`      s     


zCharRNN.GenerateTextN)__name__
__module____qualname__r0   rM   rO   rh   r`   r   r   r   r   r   &   s
   ;cr   c                  C   s   t jdd} | jdtd ddd | jdtdd	d
 | jdtddd
 | jdtddd
 | jdtddd
 | jdddd |  }t|jrt	j
ntjd}t|( t|}|  |  W d    n1 s0    Y  d S )NzCaffe2: Char RNN Training)descriptionz--train_dataz+Path to training data in a text file formatT)typedefaulthelprequiredz--seq_length   z$One training example sequence length)rp   rq   rr   z--batch_sizerA   zTraining batch sizez--iters_to_reportrQ   z*How often to report loss and generate textz--hidden_sized   z&Dimension of the hidden representationz--gpu
store_truez&If set, training is going to use GPU 0)actionrr   r   )argparseArgumentParseradd_argumentstrr]   
parse_argsr   ZDeviceOptionZgpur   ZGpuDeviceTyper   ZCPUZDeviceScoper   rM   rh   )parserr.   ZdevicerJ   r   r   r   main   s<    




r~   __main__Zcaffe2z--caffe2_log_level=2)Zcaffe2.pythonr   r   r   r   r   Zcaffe2.python.rnn_cellr   Zcaffe2.protor   Zcaffe2.python.optimizerr	   rx   loggingnumpyrR   r
   basicConfig	getLoggerrE   setLevelDEBUGr$   r   objectr   rF   r~   rl   Z
GlobalInitr   r   r   r   <module>   s$   
 P
