Как построить функцию ввода для оценщика, созданного из модели keras - PullRequest
1 голос
/ 25 марта 2019

Я создаю оценочную модель из модели keras, как показано ниже

estimator = tf.keras.estimator.model_to_estimator(keras_model=keras_model, model_dir=model_dir)

моя модель похожа на

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
main_input (InputLayer)      (None, 8)                 0         
_________________________________________________________________
dense1 (Dense)               (None, 50)                450       
_________________________________________________________________
dense2 (Dense)               (None, 40)                2040      
_________________________________________________________________
dense3 (Dense)               (None, 30)                1230      
_________________________________________________________________
dense4 (Dense)               (None, 20)                620       
_________________________________________________________________
dense5 (Dense)               (None, 10)                210       
_________________________________________________________________
main_output (Dense)          (None, 8)                 88        
=================================================================
Total params: 4,638
Trainable params: 4,638
Non-trainable params: 0

Затем я пытаюсь создать input_fn для оценки как

def train_input_fn():
    dataset = csv_input_fn(training_data_path)
    dataset = dataset.batch(128).repeat(-1)
    train_iterator = dataset.make_one_shot_iterator()
    features, labels = train_iterator.get_next()
    return features, labels
def csv_input_fn(csv_path, batch_size=None, buffer_size=None, repeat=None):
    dataset = tf.data.TextLineDataset(filenames).skip(0)
    dataset = dataset.map(_parse_line)

    if buffer_size is not None:
        dataset = dataset.shuffle(buffer_size=10000)

    if batch_size is not None:
        dataset = dataset.batch(batch_size)

    if buffer_size is not None:
        dataset = dataset.repeat(repeat)

    return dataset

def _parse_line(line):
    fields = tf.decode_csv(line, FIELD_DEFAULTS)
    features = dict(zip(COLUMNS, fields))
    features.pop("DATE")
    label = features.pop("LABEL")
    return features, label

Но есть ошибка

KeyError: "The dictionary passed into features does not have the expected inputs keys defined in the keras model.
Expected keys: {'main_input'}
features keys: {'TURNOVER', 'VOLUME', 'CLOSE', 'P_CHANGE', 'OPEN', 'PRICE_CHANGE', 'LOW', 'HIGH'}
Difference: {'VOLUME', 'CLOSE', 'LOW', 'P_CHANGE', 'main_input', 'OPEN', 'PRICE_CHANGE', 'TURNOVER', 'HIGH'}"

Похоже, {'main_input'} - это имя входа в модели keras {'TURNOVER', 'VOLUME', 'CLOSE', 'P_CHANGE', 'OPEN', 'PRICE_CHANGE', 'LOW', 'HIGH'} являются элементами из моего набора данных, поэтому они не сопоставлены друг с другом. Кто-нибудь знает, как конвертировать это?

Ответы [ 2 ]

1 голос
/ 26 марта 2019

Да, вы можете преобразовать столбцы объектов в массив numpy и передать его в модель следующим образом.

# Simulate csv data
x = np.random.randn(100,8)
df = pd.DataFrame(data=x, columns=['TURNOVER', 'VOLUME', 'CLOSE', 'P_CHANGE', 'OPEN', 'PRICE_CHANGE', 'LOW', 'HIGH'])

# Convert df to array
train_data = df.to_numpy() # requires pandas 0.24 else use df.values
train_labels = np.zeros((100,8))

train_input_fn = tf.estimator.inputs.numpy_input_fn(
x={model.input_names[0]: train_data},  # input_names[0] would be 'main_input'
y=train_labels,
batch_size=100,
num_epochs=None,
shuffle=True)  

estimator = tf.keras.estimator.model_to_estimator(model)
estimator.train(input_fn=train_input_fn, steps=1)

https://www.tensorflow.org/guide/estimators#creating_estimators_from_keras_models

0 голосов
/ 27 марта 2019

Попробуйте использовать tf.data.experimental.make_csv_dataset. Он принимает один CSV-файл или список файлов. Он также обрабатывает пакетирование и перемешивание, поэтому вам не нужно явно указывать их.

dataset = tf.data.experimental.make_csv_dataset('file.csv', batch, ...)

Это вернет пакет типа OrderedDict, поэтому вам нужно применить некоторую функцию разбора.

Другой способ - использовать CsvDataset класс

dataset = tf.data.experimental.CsvDataset('file.csv', [dtype]).batch(1)

Требуется параметр record_defaults, список типов значений в файле. Это стандартный объект набора данных, поэтому вам нужно применить shulle, batch и любую функцию анализа, которая подойдет вашим данным

https://www.tensorflow.org/api_docs/python/tf/data/experimental/CsvDataset https://www.tensorflow.org/versions/r1.13/api_docs/python/tf/data/experimental/make_csv_dataset

...