o
    v~e                     @   s   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ejZej	Z	ej
Z
ejZdd Zdd Zd	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )    )absolute_import)division)print_functionNc                 C   s   t j| |dS )N)
batch_size)captcha_inputinputs)trainr    r	   6/home/hope/projects/captcha-recognize/captcha_model.pyr      s   r   c                 C   s   t jj| |g dddS )z7conv2d returns a 2d convolution layer with full stride.)   r   r   r   SAME)stridespadding)tfnnconv2d)valueweightr	   r	   r
   _conv2d   s   r   c                 C   s   t jj| g dg dd|dS )z-max_pool_2x2 downsamples a feature map by 2X.)r      r   r   r   )ksizer   r   name)r   r   max_pool)r   r   r	   r	   r
   _max_pool_2x2   s   
r   c                 C   sP   t d t jdd}t j| ||t jd}W d   |S 1 s!w   Y  |S )z=weight_variable generates a weight variable of a given shape./cpu:0皙?)stddevinitializerdtypeN)r   devicetruncated_normal_initializerget_variablefloat32r   shaper   varr	   r	   r
   _weight_variable   s   
r'   c                 C   sN   t d t d}t j| ||t jd}W d   |S 1 s w   Y  |S )z9bias_variable generates a bias variable of a given shape.r   r   r   N)r   r    constant_initializerr"   r#   r$   r	   r	   r
   _bias_variable%   s   

r)   c                 C   s  t | dttdg} t d)}tdg dd}tddg}t jt	| ||}t jj
||jd	}W d    n1 s;w   Y  t|d
d	}t d)}tdg dd}tddg}t jt	|||}t jj
||jd	}W d    n1 sww   Y  t|dd	}	t d)}tdg dd}tddg}t jt	|	||}t jj
||jd	}
W d    n1 sw   Y  t|
dd	}t d)}tdg dd}tddg}t jt	|||}t jj
||jd	}W d    n1 sw   Y  t|dd	}t d;}|  d j}t ||dg}| d j}td|dgd}tddg}t jj
t ||| |jd	}W d    n	1 s>w   Y  t j||}t d'}tddtt gd}tdtt g}t jt ||||jd	}W d    n	1 szw   Y  t |dttgS )Nr   conv1weights)   r-   r   @   )r%   biasesr.   r   pool1conv2)r-   r-   r.   r.   pool2conv3pool3conv4pool4local1r   i   softmax_linear)r   reshapeIMAGE_HEIGHTIMAGE_WIDTHvariable_scoper'   r)   r   bias_addr   relur   r   	get_shaper   matmuldropout	CHARS_NUMCLASSES_NUMadd)images	keep_probscopekernelr/   pre_activationr+   r1   r2   r3   r4   r5   r6   r7   r   r:   dimr,   r8   local1_dropr9   r	   r	   r
   	inference,   sX    rM   c                 C   s@   t jj|| dd}t j|dd}t d| t jt dddS )Ncorss_entropy_per_example)labelslogitsr   cross_entropyr0   losses
total_loss)r   r   !softmax_cross_entropy_with_logitsreduce_meanadd_to_collectionadd_nget_collection)rP   rO   rQ   cross_entropy_meanr	   r	   r
   lossa   s   rZ   c                 C   s   t jd}|| }|S )Ng-C6?)r   r   AdamOptimizerminimize)rZ   	optimizertrain_opr	   r	   r
   trainingi   s   
r_   c                 C   sF   t t | dt |d}t t |t jd}t t |t jS )Nr   r   )r   equalargmaxrU   castint32
reduce_sumr#   )rP   rO   correct_predictioncorrect_batchr	   r	   r
   
evaluationo   s   rg   c                 C   s   t | dS )Nr   )r   ra   )rP   r	   r	   r
   outputu   s   rh   )
__future__r   r   r   
tensorflowr   r   configr<   r;   rD   rC   r   r   r   r'   r)   rM   rZ   r_   rg   rh   r	   r	   r	   r
   <module>   s(    5