Я пытаюсь реализовать очень простую 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