def __init__(self, ob_space, ac_space):
self.x = x = tf.placeholder(tf.float32, [None] + list(ob_space))
for i in range(4):
x = tf.nn.elu(conv2d(x, 32, "l{}".format(i + 1), [3, 3], [2, 2]))
# introduce a "fake" batch dimension of 1 after flatten so that we can do LSTM over time dim
x = tf.expand_dims(flatten(x), [0])
size = 256
lstm = rnn.BasicLSTMCell(size, state_is_tuple=True)
self.state_size = lstm.state_size
step_size = tf.shape(self.x)[:1]
c_init = np.zeros((1, lstm.state_size.c), np.float32)
h_init = np.zeros((1, lstm.state_size.h), np.float32)
self.state_init = [c_init, h_init]
c_in = tf.placeholder(tf.float32, [1, lstm.state_size.c])
h_in = tf.placeholder(tf.float32, [1, lstm.state_size.h])
self.state_in = [c_in, h_in]
state_in = rnn.LSTMStateTuple(c_in, h_in)
lstm_outputs, lstm_state = tf.nn.dynamic_rnn(
lstm, x, initial_state=state_in, sequence_length=step_size,
time_major=False)
lstm_c, lstm_h = lstm_state
x = tf.reshape(lstm_outputs, [-1, size])
self.logits = linear(x, ac_space, "action", normalized_columns_initializer(0.01))
self.vf = tf.reshape(linear(x, 1, "value", normalized_columns_initializer(1.0)), [-1])
self.state_out = [lstm_c[:1, :], lstm_h[:1, :]]
self.sample = categorical_sample(self.logits, ac_space)[0, :]
self.var_list = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, tf.get_variable_scope().name)
python类LSTMStateTuple()的实例源码
md_lstm.py 文件源码
项目:tensorflow-multi-dimensional-lstm
作者: philipperemy
项目源码
文件源码
阅读 18
收藏 0
点赞 0
评论 0
def state_size(self):
return LSTMStateTuple(self._num_units, self._num_units)
def decoder_hidden_units(self):
# @TODO: is this correct for LSTMStateTuple?
return self.decoder_cell.output_size
def _init_bidirectional_encoder(self):
'''
??LSTM encoder
'''
with tf.variable_scope("BidirectionalEncoder") as scope:
((encoder_fw_outputs,
encoder_bw_outputs),
(encoder_fw_state,
encoder_bw_state)) = (
tf.nn.bidirectional_dynamic_rnn(cell_fw=self.encoder_cell,
cell_bw=self.encoder_cell,
inputs=self.encoder_inputs_embedded,
sequence_length=self.encoder_inputs_length,
time_major=self.time_major,
dtype=tf.float32)
)
self.encoder_outputs = tf.concat((encoder_fw_outputs, encoder_bw_outputs), 2)
if isinstance(encoder_fw_state, LSTMStateTuple):
encoder_state_c = tf.concat(
(encoder_fw_state.c, encoder_bw_state.c), 1, name='bidirectional_concat_c')
encoder_state_h = tf.concat(
(encoder_fw_state.h, encoder_bw_state.h), 1, name='bidirectional_concat_h')
self.encoder_state = LSTMStateTuple(c=encoder_state_c, h=encoder_state_h)
elif isinstance(encoder_fw_state, tf.Tensor):
self.encoder_state = tf.concat((encoder_fw_state, encoder_bw_state), 1, name='bidirectional_concat')
def reset_state(self):
state_c = np.zeros([1, self.recurrent_cells.state_size.c], dtype=np.float32)
state_h = np.zeros([1, self.recurrent_cells.state_size.h], dtype=np.float32)
self.network_state = LSTMStateTuple(state_c, state_h)
def reset_state(self):
state_c = np.zeros([1, self.recurrent_cells.state_size.c], dtype=np.float32)
state_h = np.zeros([1, self.recurrent_cells.state_size.h], dtype=np.float32)
self.network_state = LSTMStateTuple(state_c, state_h)
def reset_state(self):
state_c = np.zeros([1, self.recurrent_cells.state_size.c], dtype=np.float32)
state_h = np.zeros([1, self.recurrent_cells.state_size.h], dtype=np.float32)
self.network_state = LSTMStateTuple(state_c, state_h)
def fast_dlstm(s_t, state_in):
def dilate_one_time_step(one_h, switcher, num_chunks):
h_slices = []
h_size = 256
chunk_step_size = h_size // num_chunks
for switch_step, h_step in zip(range(num_chunks), range(0, h_size, chunk_step_size)):
one_switch = switcher[switch_step]
h_s = conditional_backprop(one_switch, one_h[h_step: h_step + chunk_step_size])
h_slices.append(h_s)
dh = tf.stack(h_slices)
dh = tf.reshape(dh, [-1, 256])
return dh
lstm = rnn.LSTMCell(256, state_is_tuple=True)
chunks = 8
def dlstm_scan_fn(previous_output, current_input):
out, state_out = lstm(current_input, previous_output[1])
i = previous_output[2]
basis_i = tf.one_hot(i, depth=chunks)
state_out_dilated = dilate_one_time_step(tf.squeeze(state_out[0]), basis_i, chunks)
state_out = rnn.LSTMStateTuple(state_out_dilated, state_out[1])
i += tf.constant(1)
new_i = tf.mod(i, chunks)
return out, state_out, new_i
rnn_outputs, final_states, mod_idxs = tf.scan(dlstm_scan_fn,
tf.transpose(s_t, [1, 0, 2]),
initializer=(
state_in[1], rnn.LSTMStateTuple(*state_in), tf.constant(0)))
state_out = [final_states[0][-1, 0, :], final_states[1][-1, 0, :]]
cell_states = final_states[0][:, 0, :]
out_states = final_states[1][:, 0, :]
return out_states, cell_states, state_out
def state_size(self):
return LSTMStateTuple(self._num_units, self._num_units)
def __call__(self, input, state, scope=None):
with tf.variable_scope(scope or type(self).__name__):
# computation
c_prev, h_prev = state # TODO test
with tf.variable_scope("new_h"):
rec_input = _linear(h_prev, self._num_units, True)
new_h = tf.nn.tanh(rec_input + input)
# new_c, new_h
new_c = new_h
new_h = new_h
new_state = (LSTMStateTuple(new_c, new_h))
return new_h, new_state
def state_size(self):
return LSTMStateTuple(self._num_units, self._num_units)
def state_size(self):
return LSTMStateTuple(self._num_units, self._num_units)
def state_size(self):
return LSTMStateTuple(self._num_units, self._num_units)
def __call__(self, input, state, scope=None):
with tf.variable_scope(scope or type(self).__name__):
inputs1, inputs2 = tf.split(value=input, num_or_size_splits=2, axis=1)
inner_function_output = self._inner_function(inputs1, state)
new_h = self._outer_function(inner_function_output, inputs2, state)
# new_c, new_h
new_c = new_h
new_h = new_h
new_state = (LSTMStateTuple(new_c, new_h))
return new_h, new_state
def __init__(self, cell, zoneout_prob, is_training=True):
if not isinstance(cell, RNNCell):
raise TypeError("The parameter cell is not an RNNCell.")
if isinstance(cell, BasicLSTMCell):
self._tuple = lambda x: LSTMStateTuple(*x)
else:
self._tuple = lambda x: tuple(x)
if (isinstance(zoneout_prob, float) and
not (zoneout_prob >= 0.0 and zoneout_prob <= 1.0)):
raise ValueError("Parameter zoneout_prob must be between 0 and 1: %d"
% zoneout_prob)
self._cell = cell
self._zoneout_prob = zoneout_prob
self.is_training = is_training
def __init__(self, ob_space, ac_space):
self.x = x = tf.placeholder(tf.float32, [None] + list(ob_space))
for i in range(1):
x = tf.nn.elu(conv2d(x, 32, "l{}".format(i + 1), [3, 3], [2, 2]))
# introduce a "fake" batch dimension of 1 after flatten so that we can do LSTM over time dim
x = tf.expand_dims(flatten(x), [0])
size = 256
if use_tf100_api:
lstm = rnn.BasicLSTMCell(size, state_is_tuple=True)
else:
lstm = rnn.rnn_cell.BasicLSTMCell(size, state_is_tuple=True)
self.state_size = lstm.state_size
step_size = tf.shape(self.x)[:1]
c_init = np.zeros((1, lstm.state_size.c), np.float32)
h_init = np.zeros((1, lstm.state_size.h), np.float32)
self.state_init = [c_init, h_init]
c_in = tf.placeholder(tf.float32, [1, lstm.state_size.c])
h_in = tf.placeholder(tf.float32, [1, lstm.state_size.h])
self.state_in = [c_in, h_in]
if use_tf100_api:
state_in = rnn.LSTMStateTuple(c_in, h_in)
else:
state_in = rnn.rnn_cell.LSTMStateTuple(c_in, h_in)
lstm_outputs, lstm_state = tf.nn.dynamic_rnn(
lstm, x, initial_state=state_in, sequence_length=step_size,
time_major=False)
lstm_c, lstm_h = lstm_state
x = tf.reshape(lstm_outputs, [-1, size])
self.logits = linear(x, ac_space, "action", normalized_columns_initializer(0.01))
self.vf = tf.reshape(linear(x, 1, "value", normalized_columns_initializer(1.0)), [-1])
self.state_out = [lstm_c[:1, :], lstm_h[:1, :]]
self.sample = categorical_sample(self.logits, ac_space)[0, :]
self.var_list = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, tf.get_variable_scope().name)
def __call__(self, x, state_prev, scope=None):
with tf.variable_scope(scope or type(self).__name__):
h_prev, c_prev = state_prev
# Check if the input size exist.
input_size = x.shape.with_rank(2)[1].value
if input_size is None:
raise ValueError("Expecting input_size to be set.")
### get weights for concated tensor.
W_shape = (input_size, self.output_size)
U_shape = (self.output_size, self.output_size)
b_shape = (self.output_size,)
Wi = tf.get_variable(name='Wi', shape=W_shape)
Wj = tf.get_variable(name='Wj', shape=W_shape)
Wf = tf.get_variable(name='Wf', shape=W_shape)
Wo = tf.get_variable(name='Wo', shape=W_shape)
Ui = tf.get_variable(name='Ui', shape=U_shape,
initializer=TFCommon.Initializer.random_orthogonal_initializer())
Uj = tf.get_variable(name='Uj', shape=U_shape,
initializer=TFCommon.Initializer.random_orthogonal_initializer())
Uf = tf.get_variable(name='Uf', shape=U_shape,
initializer=TFCommon.Initializer.random_orthogonal_initializer())
Uo = tf.get_variable(name='Uo', shape=U_shape,
initializer=TFCommon.Initializer.random_orthogonal_initializer())
bi = tf.get_variable(name='bi', shape=b_shape,
initializer=tf.constant_initializer(0.0))
bj = tf.get_variable(name='bj', shape=b_shape,
initializer=tf.constant_initializer(0.0))
bf = tf.get_variable(name='bf', shape=b_shape,
initializer=tf.constant_initializer(self.__forget_bias)) # forget gate bias := 1
bo = tf.get_variable(name='bo', shape=b_shape,
initializer=tf.constant_initializer(0.0))
### calculate gates and input's info
i = tf.tanh(tf.matmul(x, Wi) + tf.matmul(h_prev, Ui) + bi)
j = self.__gate_activation(tf.matmul(x, Wj) + tf.matmul(h_prev, Uj) + bj)
f = self.__gate_activation(tf.matmul(x, Wf) + tf.matmul(h_prev, Uf) + bf)
o = tf.tanh(tf.matmul(x, Wo) + tf.matmul(h_prev, Uo) + bo)
### calculate candidate
new_c = f * c_prev + i * j
### final cal
new_h = o * tf.tanh(new_c)
return new_h, LSTMStateTuple(new_h, new_c)
def _init_encoder(self):
"""
Creates the encoder attributes
Attributes:
- encoder_outputs is shaped [max_sequence_length, batch_size, seq_width]
(since time-major == True)
- encoder_final_state is shaped [batch_size, encoder_cell.state_size]
"""
if not self.bidirectional:
with tf.variable_scope('Encoder') as scope:
self.encoder_outputs, self.encoder_final_state = tf.nn.dynamic_rnn(
cell=self.encoder_cell,
dtype=tf.float32,
sequence_length=self.encoder_inputs_length,
inputs=self.encoder_inputs,
time_major=False)
else:
((encoder_fw_outputs,
encoder_bw_outputs),
(encoder_fw_final_state,
encoder_bw_final_state)) = (
tf.nn.bidirectional_dynamic_rnn(cell_fw=self.encoder_cell,
cell_bw=self.encoder_cell,
inputs=self.encoder_inputs,
sequence_length=self.encoder_inputs_length,
dtype=tf.float32, time_major=False)
)
self.encoder_outputs = tf.concat((encoder_fw_outputs, encoder_bw_outputs), 2)
if isinstance(encoder_fw_final_state, LSTMStateTuple):
encoder_final_state_c = tf.concat(
(encoder_fw_final_state.c, encoder_bw_final_state.c), 1)
encoder_final_state_h = tf.concat(
(encoder_fw_final_state.h, encoder_bw_final_state.h), 1)
self.encoder_final_state = LSTMStateTuple(
c=encoder_final_state_c,
h=encoder_final_state_h
)
else:
self.encoder_final_state = tf.concat(
(encoder_fw_final_state, encoder_bw_final_state), 1)
model_components.py 文件源码
项目:hierarchical-attention-networks
作者: ematvey
项目源码
文件源码
阅读 19
收藏 0
点赞 0
评论 0
def bidirectional_rnn(cell_fw, cell_bw, inputs_embedded, input_lengths,
scope=None):
"""Bidirecional RNN with concatenated outputs and states"""
with tf.variable_scope(scope or "birnn") as scope:
((fw_outputs,
bw_outputs),
(fw_state,
bw_state)) = (
tf.nn.bidirectional_dynamic_rnn(cell_fw=cell_fw,
cell_bw=cell_bw,
inputs=inputs_embedded,
sequence_length=input_lengths,
dtype=tf.float32,
swap_memory=True,
scope=scope))
outputs = tf.concat((fw_outputs, bw_outputs), 2)
def concatenate_state(fw_state, bw_state):
if isinstance(fw_state, LSTMStateTuple):
state_c = tf.concat(
(fw_state.c, bw_state.c), 1, name='bidirectional_concat_c')
state_h = tf.concat(
(fw_state.h, bw_state.h), 1, name='bidirectional_concat_h')
state = LSTMStateTuple(c=state_c, h=state_h)
return state
elif isinstance(fw_state, tf.Tensor):
state = tf.concat((fw_state, bw_state), 1,
name='bidirectional_concat')
return state
elif (isinstance(fw_state, tuple) and
isinstance(bw_state, tuple) and
len(fw_state) == len(bw_state)):
# multilayer
state = tuple(concatenate_state(fw, bw)
for fw, bw in zip(fw_state, bw_state))
return state
else:
raise ValueError(
'unknown state type: {}'.format((fw_state, bw_state)))
state = concatenate_state(fw_state, bw_state)
return outputs, state
def __init__(self, ob_space, ac_space, meta_ac_space):
with tf.variable_scope('conv'):
self.x = x = tf.placeholder(tf.float32, [None] + list(ob_space))
x = tf.nn.relu( conv2d(x, 16, "l1", [8, 8], [4, 4]) )
x = tf.nn.relu( conv2d(x, 32, "l2", [4, 4], [2, 2]) )
# x is [?, 11, 11, 32]
self.conv_feature = tf.reduce_mean(x, axis=[1,2])
x = tf.nn.relu(linear(flatten(x), 256, "hidden", normalized_columns_initializer(1.0)))
self.prev_action = prev_action = tf.placeholder(tf.float32, [None, ac_space], "prev_a")
self.prev_reward = prev_reward = tf.placeholder(tf.float32, [None, 1], "prev_r")
# concat previous action and reward
x = tf.concat([x, prev_action], axis=1)
x = tf.concat([x, prev_reward], axis=1)
self.meta_action = meta_action = tf.placeholder(tf.float32, [None, meta_ac_space], "meta_action")
# concat
x = tf.concat([x, meta_action], axis=1)
# introduce a "fake" batch dimension of 1 after flatten so that we can do LSTM over time dim
x = tf.expand_dims(x, [0])
with tf.variable_scope('lstm'):
size = 256
lstm = rnn.BasicLSTMCell(size, state_is_tuple=True)
self.state_size = lstm.state_size
step_size = tf.shape(self.x)[:1]
c_init = np.zeros((1, lstm.state_size.c), np.float32)
h_init = np.zeros((1, lstm.state_size.h), np.float32)
self.state_init = [c_init, h_init]
c_in = tf.placeholder(tf.float32, [1, lstm.state_size.c])
h_in = tf.placeholder(tf.float32, [1, lstm.state_size.h])
self.state_in = [c_in, h_in]
if use_tf100_api:
state_in = rnn.LSTMStateTuple(c_in, h_in)
else:
state_in = rnn.rnn_cell.LSTMStateTuple(c_in, h_in)
lstm_outputs, lstm_state = tf.nn.dynamic_rnn(
lstm, x, initial_state=state_in, sequence_length=step_size,
time_major=False)
lstm_c, lstm_h = lstm_state
x = tf.reshape(lstm_outputs, [-1, size])
self.logits = linear(x, ac_space, "action", normalized_columns_initializer(0.01))
self.vf = tf.reshape(linear(x, 1, "value", normalized_columns_initializer(1.0)), [-1])
self.state_out = [lstm_c[:1, :], lstm_h[:1, :]]
self.sample = categorical_sample(self.logits, ac_space)[0, :]
# Note: need to be on scope of the class
self.var_list = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, tf.get_variable_scope().name)