Я получил старый проект на GitHub, и в коде есть часть, которая использует библиотеки Theano и Lasagne. Я хотел бы иметь тот же код, но с использованием Tensorflow. Кажется, что это просто создание класса LSTM, и я мог бы использовать tf.keras.layer.RNN
или tf.keras.layer.LSTM
, но я боюсь не принимать во внимание определенные параметры или неправильно понимать используемые функции. Можете ли вы помочь мне для преобразования, пожалуйста?
есть код:
import numpy as np
import theano
import theano.tensor as T
import lasagne
import sys
class RNN(object):
def __init__(self, seq_len, n_feature):
self.Input = lasagne.layers.InputLayer(shape=(None, seq_len, n_feature))
self.buildNetwork()
self.output = lasagne.layers.get_output(self.network)
self.params = lasagne.layers.get_all_params(self.network, trainable=True)
self.output_fn = theano.function([self.Input.input_var], self.output)
fx = T.fvector().astype("float64")
choices = T.ivector()
px = self.output[T.arange(self.output.shape[0]), choices]
log_px = T.log(px)
cost = -fx.dot(log_px)
updates = lasagne.updates.adagrad(cost, self.params, 0.0008)
Input = lasagne.layers.InputLayer(shape=(None, seq_len, n_feature))
self.train_fn = theano.function([self.Input.input_var, choices, fx], [cost, px, log_px], updates=updates)
def buildNetwork(self):
l_forward = lasagne.layers.RecurrentLayer(
self.Input, 20,
grad_clipping = 100,
W_in_to_hid=lasagne.init.HeUniform(),
W_hid_to_hid=lasagne.init.HeUniform(),
nonlinearity=lasagne.nonlinearities.tanh
#only_return_final=True)
)
self.network = lasagne.layers.DenseLayer(
l_forward, num_units=3, nonlinearity=lasagne.nonlinearities.softmax)
def predict(self, x):
x = np.array([x]).astype(theano.config.floatX)
prediction = self.output_fn(x)
return prediction[0]
def train(self, Input, choices, rewards):
if rewards.std() != 0:
rewards = (rewards - rewards.mean()) / rewards.std()
cost, px, log_px = self.train_fn(Input, choices, rewards)
if np.isnan(cost) or any(np.isnan(log_px)):
print (rewards, "\n", cost, px, log_px)
def save(self, path='model.npz'):
np.savez(path, *lasagne.layers.get_all_param_values(self.network))
def load(self, path='model.npz'):
with np.load(path) as f:
param_values = [f['arr_%d' % i] for i in range(len(f.files))]
lasagne.layers.set_all_param_values(network, param_values)
class LSTM(RNN):
def buildNetwork(self):
l_forward = lasagne.layers.LSTMLayer(self.Input, 20, grad_clipping = 10)
self.network = lasagne.layers.DenseLayer(
l_forward, num_units=3, nonlinearity=lasagne.nonlinearities.softmax)