Преобразование из анано-лазаньи в тензор-2 - PullRequest
0 голосов
/ 01 мая 2020

Я получил старый проект на 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)
...