Я написал лямбда-слой Keras, предназначенный для обертывания пользовательской функции предварительной обработки, которая использует pandas функциональность фрейма данных. Он предназначен для приема массива входных данных numpy, который оборачивается в фрейм данных и передается через пользовательскую функцию.
Рассмотрим следующую функцию, prepare_data () , которая принимает входные данные:
def prepare_data(df):
df = df[['userId', 'dataDate','x1', 'x2','x3', 'x4', 'x5','x6', 'x7', 'x8','x9','x10','x11']]
df['date'] = pd.to_datetime(df["dataDate"])
df.sort_values(by=['userId', 'date'], inplace=True, ascending=True)
df.rename(columns={'x11': 'x12'}, inplace=True)
df.drop(['dataDate', 'date'], axis=1, inplace=True)
df['x6'].fillna(method='ffill', inplace=True)
df['x7'].fillna(0, inplace=True)
df['x8'].fillna(0, inplace=True)
df['x9'].fillna(0, inplace=True)
df['x10'].fillna(0, inplace=True)
return df
Я учел слои keras, работающие исключительно с тензорами, возвращая результат, который преобразуется из фрейма данных pd в numpy, а затем преобразуется в тензор, используя tf.numpy_function , а также создает tf.enable_eager_execution () в начале моей программы для поддержка numpy операций в смежности с Keras.
Когда я выполняю модель, я сталкиваюсь с RuntimeError: tf.placeholder () не совместим с нетерпеливым выполнением. , когда я не использовал tf.placeholder где угодно. Любая помощь в преодолении этого смутного шага была бы очень признательна.
def preprocessing(x):
prepared_data = prepare_data(pd.DataFrame(data=x, index=new_raw_data.index, columns=new_raw_data.columns))
return prepared_data.values
def preprocessing_tf(x):
return tf.numpy_function(func=preprocessing, inp=[x], Tout=tf.Tensor)
def create_model():
model = Sequential()
model.add(Lambda(preprocessing_tf, input_shape=new_raw_data.shape, output_shape=processed_data.shape))
return model
model = create_model()
model.compile(optimizer='adam', metrics=['accuracy'])
model.summary