преобразователь данных Keras для оценки тензорного потока - PullRequest
0 голосов
/ 28 июня 2018

Я хочу создать пользовательские пакеты, используя pandas dataframe df_train, в котором есть весь мой тренировочный набор данных, и массивный массив arr_train, в котором есть начальный и конечный индексы моих партий. Я хочу генерировать пакеты на основе начального и конечного индексов.

Например, мой df_train выглядит примерно так:

index col1 col2 col3
0     100   121  A
1     101   211  A
2     102   213  B

и мой arr_train похож на arr_train = [[0 1] [2 2]]

Что означает, что моя i-я партия будет df_train.loc[arr_train[i,0]:arr_train[i,1],:]

Я знаю, как это сделать, используя keras. Но я хочу преобразовать свою модель keras в tenorflow.estimator, поэтому мне нужно преобразовать мой batch_generator для tenorflow.estimator

Вот мой керас-генератор данных

import numpy as np
from tensorflow import keras

class DataGenerator(keras.utils.Sequence):
    'Generates data for Keras'
    def __init__(self, df,arr_df,predictors,response,weight=None, shuffle = False, training=False):
        'Initialization'
        self.arr_df = arr_df
        self.df = df
        self.shuffle = shuffle
        self.predictors = predictors
        self.response = response
        self.weight = weight
        self.traning = training
        self.on_epoch_end()

    def __len__(self):
        'Denotes the number of batches per epoch'
        return self.arr_df.shape[0]

    def __getitem__(self, index):
        'Generate one batch of data'
        # Generate indexes of batch
        # idx = self.indexes[self.arr_df[index,0]:self.arr_df[index,1]]

        # Generate data
        a1 = self.arr_df[index,0]
        a2 = self.arr_df[index, 1]
        X1 = self.df.loc[a1:a2,self.predictors].as_matrix().reshape((1,-1,len(self.predictors)))
        if (self.traning) & (self.weight !=None):
            y = self.df.loc[a1:a2,self.response].as_matrix().reshape((1,-1,1))
            w = self.df.loc[a1:a2, self.weight].unique()
            return X1,y,w
        elif (self.traning) & (self.weight ==None):
            y = self.df.loc[a1:a2, self.response].as_matrix().reshape((1,-1, 1))
            return X1,y
        return X1

    def on_epoch_end(self):
        'Updates indexes after each epoch'
        self.indexes = np.arange(self.arr_df.shape[0])
        if self.shuffle == True:
            np.random.shuffle(self.indexes)
...