Какую роль играет «tf.contrib.rnn.OutputProjectionWrapper» над «tf.contrib.rnn.BasicRNNCell» - PullRequest
1 голос
/ 03 мая 2019

Во многих местах реализации BasicRNNCell обнаруживается, что код использует:

tf.contrib.rnn.OutputProjectionWrapper(
    tf.contrib.rnn.BasicRNNCell(num_units= num_neurons , activation=tf.nn.relu), 
    output_size=num_outputs)

Что делает "OutputProjectionWrapper" над "BasicRNNCell"

Согласно коду, показанному для реализации "tf.contrib.rnn.BasicRNNCell" функции вызова, она возвращает вывод RNN. Мы можем напрямую продолжить, используя функцию вызова.

# Creating the Model

num_inputs = 1
num_neurons = 100
num_outputs = 1
learning_rate = 0.005
num_train_iterations = 2000
batch_size = 1


tf.reset_default_graph()
x = tf.placeholder(tf.float32, [None, num_time_steps, num_inputs])
y = tf.placeholder(tf.float32, [None, num_time_steps, num_outputs])

# Using Basic RNN Model

cell= tf.contrib.rnn.OutputProjectionWrapper(tf.contrib.rnn.BasicRNNCell(num_units=num_neurons,activation=tf.nn.relu),output_size=num_outputs)

outputs, states = tf.nn.dynamic_rnn(cell, x, dtype=tf.float32)

# MEAN SQUARED ERROR
loss = tf.reduce_mean(tf.square(outputs - y))
optimizer = tf.train.AdagradOptimizer(learning_rate = learning_rate)
train = optimizer.minimize(loss)

Я ожидал, что мы можем напрямую передать BasicRNNCell на tf.nn.dynamic_rnn, но до этого шага, что делает OutputProjectionWrapper, мне совершенно неизвестно.

1 Ответ

0 голосов
/ 15 июля 2019

Да, вы можете передать BasicRNNCell напрямую в tf.nn.dynamic_rnn или добавить проекционный слой в BasicRNNCell, прежде чем поместить его в tf.nn.dynamic_rnn.Что делает OutputProjectionWrapper, так это то, что он добавляет плотный слой после вывода RNN.

...