Я создаю класс tenorflow 2.0 для автоматизации модели RNN Online для данных временных рядов.В этом вопросе я просто ищу решение внутри класса.Потому что я легко запускаю код, используя model.compile и model.fit.
Модель Rnn содержит 6 LSTM с тремя различными входами.Я предполагаю, что источник проблемы «Аргументы, предоставленные для defun
-генерированных функций, должны быть хэшируемыми. Первоначальная ошибка: объекты DataFrame являются изменяемыми, поэтому их нельзя хэшировать», это из-за использования фреймов данных внутри класса tenorflow, но яне могу решить эту проблему, даже я преобразовываю фрейм данных в формат массива.
На самом деле входные данные дерева - это фрейм данных, содержащий списки фреймов данных, каждый раз, когда я пытаюсь перебрать фрейм данных, чтобы взять его и протестировать, как в онлайн-случае.Форма ввода проста (1 | 1 | 12). Введите один, это означает одну партию, одну временную метку и 12 объектов.Вход 2 и Вход 3 (1 | 1 | 48).Данные являются числовыми, и y to pred также является серией двоичных данных.
import pandas as pd
import numpy as np
import tensorflow as tf
class RnnModel (tf.keras.Model):
def __init__(self, num_classes = 2, units = 64):
super(RnnModel, self).__init__()
#layer definition
self.lstm1 = tf.keras.layers.LSTM(units,
return_sequences=True)
self.lstm2 = tf.keras.layers.LSTM(units, return_sequences=True)
self.lstm3 = tf.keras.layers.LSTM(units, return_sequences=True)
self.lstm4 = tf.keras.layers.LSTM(units, return_sequences=True)
self.lstm5 = tf.keras.layers.LSTM(units, return_sequences=True)
self.lstm6 = tf.keras.layers.LSTM(units)
self.concate1 = tf.keras.layers.Concatenate()
self.concate2 = tf.keras.layers.Concatenate()
self.danse1 = tf.keras.layers.Dense(units, activation = "softmax")
self.loss_train = tf.keras.metrics.Mean(name='train_loss')
self.train_accuracy = tf.keras.metrics.CategoricalCrossentropy(name='train_accuracy')
self.optimizer = tf.keras.optimizers.SGD()
self.loss_object = tf.keras.losses.CategoricalCrossentropy()
def call(self,inputs):
x1, x2, x3 = inputs
x1 = self.lstm1(x1)
x1 = self.lstm2(x1)
x2 = self.concate1([x1,x2])
x2 = self.lstm3(x2)
x2 = self.lstm4(x2)
x3 = self.concate2([x2,x3])
x3 = self.lstm5(x3)
x3 = self.lstm6(x3)
return self.danse1(x3)
@tf.function
def checkpoint_callback (checkpoint_path):
checkpoint =
tf.keras.callbaks.ModelChekpoint(checkpoint_path,save_weights_only =
True,verbose = 1)
return checkpoint
@tf.function
def train_step(self, x_train1,x_train2,x_train3,y_train):
with tf.GradientTape() as tape:
predictions = self.call([x_train1,x_train2,x_train3])
loss = self.loss_object(y_train,predictions)
gradients = tape.gradient(loss , self.trainable_variables)
self.optimizer.apply_gradients(zip(gradients,
self.trainable_variables))
self.train_loss(loss)
self.train_accuracy(y_train,predictions)
@tf.function
def get_result(self,x_train1,x_train2,x_train3,y_train):
for x1_ , x2_ , x3_ , y1_ in
zip(x_train1,x_train2,x_train3,y_train):
x1_ = np.array(x1_.values)
x1_ = x1_.reshape(1,1,x1_.shape[1])
x2_ = np.array(x2_.values)
x2_ = x2_.reshape(1,1,x2_.shape[1])
x3_ = np.array(x3_.values)
x3_ = x3_.np.array(1,1,x3_.shape[1])
y1_ = np.array(y1_.values)
y1_ = y1_.array(1)
print("................")
self.train_step(x1_,x2_,x3_,y1_)
template = 'Loss: {}, Accuracy: {}'
print (template.format (self.train_loss.result (), self.train_accuracy.result () * 100))
источник кода, как показано: "TypeError:Аргументы, передаваемые в defun
-генерированные функции, должны быть хешируемыми. Исходная ошибка: объекты DataFrame являются изменяемыми, поэтому их нельзя хэшировать "
, а источником ошибки является" .... / anaconda3 /lib / python3.7 / site-packages / tenorflow / python / eager / def_function.py ", строка 426, в вызов self._initialize (args, kwds, add_initializers_to = initializer_map)