<s> import numpy <EOL> from chainer import cuda <EOL> from chainer import function <EOL> from chainer . utils import type_check <EOL> if cuda . cudnn_enabled : <EOL> cudnn = cuda . cudnn <EOL> libcudnn = cudnn . cudnn <EOL> _mode = libcudnn . CUDNN_ACTIVATION_TANH <EOL> class Tanh ( function . Function ) : <EOL> """<STR_LIT>""" <EOL> def __init__ ( self , use_cudnn = True ) : <EOL> self . use_cudnn = use_cudnn <EOL> def check_type_forward ( self , in_types ) : <EOL> type_check . expect ( in_types . size ( ) == <NUM_LIT:1> ) <EOL> type_check . expect ( in_types [ <NUM_LIT:0> ] . dtype == numpy . float32 ) <EOL> def forward_cpu ( self , x ) : <EOL> self . y = numpy . tanh ( x [ <NUM_LIT:0> ] ) <EOL> return self . y , <EOL> def forward_gpu ( self , x ) : <EOL> self . y = cuda . cupy . empty_like ( x [ <NUM_LIT:0> ] ) <EOL> if cuda . cudnn_enabled and self . use_cudnn : <EOL> dtype = x [ <NUM_LIT:0> ] . dtype <EOL> one = numpy . array ( <NUM_LIT:1> , dtype = dtype ) . ctypes <EOL> zero = numpy . array ( <NUM_LIT:0> , dtype = dtype ) . ctypes <EOL> handle = cudnn . get_handle ( ) <EOL> x_mat = x [ <NUM_LIT:0> ] . reshape ( x [ <NUM_LIT:0> ] . shape [ <NUM_LIT:0> ] , - <NUM_LIT:1> , <NUM_LIT:1> , <NUM_LIT:1> ) <EOL> desc = cudnn . create_tensor_descriptor ( x_mat ) <EOL> libcudnn . activationForward_v3 ( <EOL> handle , _mode , one . data , desc . value , x_mat . data . ptr , <EOL> zero . data , desc . value , self . y . data . ptr ) <EOL> else : <EOL> cuda . cupy . tanh ( x [ <NUM_LIT:0> ] , out = self . y ) <EOL> return self . y , <EOL> def backward_cpu ( self , x , gy ) : <EOL> return gy [ <NUM_LIT:0> ] * ( <NUM_LIT:1> - self . y * self . y ) , <EOL> def backward_gpu ( self , x , gy ) : <EOL> if cuda . cudnn_enabled and self . use_cudnn : <EOL> gx = cuda . cupy . empty_like ( self . y ) <EOL> dtype = x [ <NUM_LIT:0> ] . dtype <EOL> one = numpy . array ( <NUM_LIT:1> , dtype = dtype ) . ctypes <EOL> zero = numpy . array ( <NUM_LIT:0> , dtype = dtype ) . ctypes <EOL> handle = cudnn . get_handle ( ) <EOL> y_mat = self . y . reshape ( self . y . shape [ <NUM_LIT:0> ] , - <NUM_LIT:1> , <NUM_LIT:1> , <NUM_LIT:1> ) <EOL> desc = cudnn . create_tensor_descriptor ( y_mat ) <EOL> libcudnn . activationBackward_v3 ( <EOL> handle , _mode , one . data , desc . value , y_mat . data . ptr , <EOL> desc . value , gy [ <NUM_LIT:0> ] . data . ptr , desc . value , x [ <NUM_LIT:0> ] . data . ptr , <EOL> zero . data , desc . value , gx . data . ptr ) <EOL> else : <EOL> gx = cuda . elementwise ( <EOL> '<STR_LIT>' , '<STR_LIT>' , <EOL> '<STR_LIT>' , <EOL> '<STR_LIT>' ) ( self . y , gy [ <NUM_LIT:0> ] ) <EOL> return gx , <EOL> def tanh ( x , use_cudnn = True ) : <EOL> """<STR_LIT>""" <EOL> return Tanh ( use_cudnn ) ( x ) </s>
