def recurrent(network, mask_in, num_rec_units, num_layers, dropout,
bidirectional, nonlinearity):
if nonlinearity != 'LSTM':
nl = getattr(lnn.nonlinearities, nonlinearity)
def add_layer(prev_layer, **kwargs):
return lnn.layers.RecurrentLayer(
prev_layer, num_units=num_rec_units, mask_input=mask_in,
nonlinearity=nl,
W_in_to_hid=lnn.init.GlorotUniform(),
W_hid_to_hid=lnn.init.Orthogonal(gain=np.sqrt(2) / 2),
**kwargs)
else:
def add_layer(prev_layer, **kwargs):
return lnn.layers.LSTMLayer(
prev_layer, num_units=num_rec_units, mask_input=mask_in,
**kwargs
)
fwd = network
for i in range(num_layers):
fwd = add_layer(fwd, name='rec_fwd_{}'.format(i))
if dropout > 0.:
fwd = lnn.layers.DropoutLayer(fwd, p=dropout)
if not bidirectional:
return network
bck = network
for i in range(num_layers):
bck = add_layer(bck, name='rec_bck_{}'.format(i), backwards=True)
if dropout > 0:
bck = lnn.layers.DropoutLayer(bck, p=dropout)
# combine the forward and backward recurrent layers...
network = lnn.layers.ConcatLayer([fwd, bck], name='fwd + bck', axis=-1)
return network
评论列表
文章目录