Почему я не могу добавить объект Dataframe в запрос Tensorflow: «Исходная ошибка: объекты DataFrame являются изменяемыми, поэтому их нельзя хэшировать» - PullRequest
0 голосов
/ 28 мая 2019

Я создаю класс 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...