U
    d_&                     @   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(   |   }||kr$|| t|  d S N)Nameaddr   	CreateNet)netZcreated_namesname r   C/tmp/pip-unpacked-wheel-ua33x9lu/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 5 Q R X 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   s      z$CharRNN.__init__.<locals>.<dictcomp>c                 S   s   i | ]\}}||qS r   r   r   r   r   r   r   2   s      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   )Zscope   )Zdim_inZdim_outaxissoftmax)r6   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=   rB   ZCopy)r,   rH   r0   r1   r2   r3   r4   Zhidden_output_allr9   outputr7   r8   r<   r=   r   r   r   CreateModel8   sd    
	       
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st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dtyper?   r1   r0   r4   zCharacters Per Second: {}zIterations Per Second: {}z{} Iteration {} {}z
----------g+?gMbP?  zLoss since last report: {}zSmooth loss: {})-rC   rD   r   Z
RunNetOncerH   Zparam_init_netnpr)   r   r(   r!   zerosr   int32r"   rangesumAssertionErrorFeedBlobrE   r   float32rF   r   rB   r
   nowarrayRunNetr   astyperM   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inputr4   eirL   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 r1   r?   rN   r   r0   )p)r   rG   rS   r   rV   rP   rY   r   rR   rZ   rB   r   rQ   r)   r[   rW   r&   r^   rI   r`   ra   r'   r*   )r,   Znum_charactersr   r!   Z_ird   ri   nextr   r   r   r_      s"    
 

zCharRNN.GenerateTextN)__name__
__module____qualname__r/   rK   rM   rg   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 5 Q R X 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)ro   rp   rq   z--batch_sizer?   zTraining batch sizez--iters_to_reportrO   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)actionrq   r   )argparseArgumentParseradd_argumentstrr\   
parse_argsr   ZDeviceOptionZgpur   ZGpuDeviceTyper   ZCPUZDeviceScoper   rK   rg   )parserr-   ZdevicerH   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	   rw   loggingZnumpyrP   r
   basicConfig	getLoggerrC   setLevelDEBUGr#   r   objectr   rD   r}   rk   Z
GlobalInitr   r   r   r   <module>   s$   
 P
