Пользовательский RNN с Innsorflow 2 (Python) - PullRequest
0 голосов
/ 29 сентября 2019

Я пытаюсь реализовать очень простую RNN, используя класс модели keras в тензорном потоке 2 (Python 3.7), который предсказывает выходные данные с учетом последовательности входных данных.Моя цель здесь в основном дидактическая, поскольку реализовать эти модели с использованием слоев keras, очевидно, довольно тривиально.

Используя написанный мной код, я могу вызвать экземпляр модели с входными данными и получить выходные данные.(Данные здесь, очевидно, просто шум)

т.е.

x_train = np.random.normal(size=[20,1000,1])
y_train = np.random.normal(size=1000)
batch_size = 5
rnn = simpleRNN(20,batch_size)
rnn.compile(optimizer='adam', loss='mae')
rnn(x_train[:,:5])

отлично работает

однако, когда я пытаюсь подогнать параметры модели, запустив что-то вроде

epochs= 1
N = 50
rnn.fit(tf.cast(x_train[:,:N],dtype=tf.float64),
        tf.cast(y_train[:N].reshape(1,-1),dtype=tf.float64),
        batch_size=batch_size, epochs=epochs, verbose=1)

Я получаю всевозможные ошибки.Я пробовал кучу разных вещей и всегда, кажется, получаю разные ошибки, что заставляет меня думать, что есть кое-что, чего я не понял.

Текущая ошибка, которую я получаю,

 ValueError: Dimensions must be equal, but are 5 and 50 for 'add_2' (op: 'AddV2') with input shapes: [5,13], [50,13].

Класс модели и импорт ниже.

import numpy as np
import tensorflow as tf
import tensorflow.keras as keras

class simpleRNN(keras.Model):

    def __init__(self, units,batch_size):
        super(simpleRNN, self).__init__()
        self.batch_size = batch_size
        self.init_state = tf.random.normal(shape=(batch_size,units),dtype=tf.float64)

        self.inW = tf.Variable(np.random.rand(1,units))
        self.inb = tf.Variable(np.random.rand(1,units))

        self.W = tf.Variable(np.random.rand(units, units), dtype=tf.float64)
        self.b = tf.Variable(np.zeros((1,units)), dtype=tf.float64)

        self.W2 = tf.Variable(np.random.rand(units,1),dtype=tf.float64)
        self.b2 = tf.Variable(np.zeros((1)), dtype=tf.float64)


    def call(self, inputs):
        inputs = tf.cast(inputs,tf.float64)
        current_state = self.init_state
        #print(cur)

        all_pred = []
        out = tf.zeros([self.batch_size,1],tf.float64)
        for x in inputs:
            print(x.shape)
            intoRec = tf.matmul(x,self.inW) + self.inb

            current_state = tf.tanh(tf.matmul(current_state, self.W)+self.b +intoRec) 
            print(current_state.shape,intoRec.shape)
            logits = tf.matmul(current_state,self.W2) + self.b2
            out = tf.nn.tanh(logits)

        return out
...