Во многих местах реализации 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
, мне совершенно неизвестно.