Создавая свой собственный tf.Estimator, как model_params перезаписал model_dir? Предупреждение о времени выполнения?

Недавно я построил настраиваемую модель глубокой нейронной сети с помощью TFLearn, которая утверждает, что привносит глубокое обучение в API оценки scikit-learn. Я мог обучать модели и делать прогнозы, но не мог заставить работать функцию подсчета (оценки), поэтому не мог выполнять перекрестную проверку. Я пытался задать вопросы о TFLearn в разных местах, но не получил ответов.

Похоже, что у самого TensorFlow есть класс оценки. Поэтому я откладываю TFLearn в сторону и пытаюсь следовать руководству по адресу https://www.tensorflow.org/extend/estimators. Каким-то образом мне удается получить переменные там, где они не принадлежат. Может ли кто-нибудь обнаружить мою проблему? Я опубликую код и вывод.

Примечание. Конечно, я вижу RuntimeWarning в верхней части вывода. Я нашел ссылки на это предупреждение в Интернете, но пока все утверждают, что оно безвредно. Может быть, это не...

КОД:

import tensorflow as tf
from my_library import Database, l2_angle_distance


def my_model_function(topology, params):

    # This function will eventually be a function factory.  This should
    # allow easy exploration of hyperparameters.  For now, this just
    # returns a single, fixed model_fn.

    def model_fn(features, labels, mode):

        # Input layer
        net = tf.layers.conv1d(features["x"], topology[0], 3, activation=tf.nn.relu)
        net = tf.layers.dropout(net, 0.25)
        # The core of the network is here (convolutional layers only for now).
        for nodes in topology[1:]:
            net = tf.layers.conv1d(net, nodes, 3, activation=tf.nn.relu)
            net = tf.layers.dropout(net, 0.25)
        sh = tf.shape(features["x"])
        net = tf.reshape(net, [sh[0], sh[1], 3, 2])
        predictions = tf.nn.l2_normalize(net, dim=3)

        # PREDICT EstimatorSpec
        if mode == tf.estimator.ModeKeys.PREDICT:
            return tf.estimator.EstimatorSpec(mode=mode,
                    predictions={"vectors": predictions})

        # TRAIN or EVAL EstimatorSpec
        loss = l2_angle_distance(labels, predictions)
        optimizer = tf.train.GradientDescentOptimizer(learning_rate=params["learning_rate"])
        train_op = optimizer.minimize(loss=loss, global_step=tf.train.get_global_step())
        return tf.estimator.EstimatorSpec(mode, predictions, loss, train_op)

    return model_fn

##===================================================================

window = "whole"
encoding = "one_hot"
db = Database("/home/bwllc/Documents/Files for ML/compact")

traindb, testdb = db.train_test_split()
train_features, train_labels = traindb.values(window, encoding)
test_features, test_labels = testdb.values(window, encoding)

# Create the model.
tf.logging.set_verbosity(tf.logging.INFO)
LEARNING_RATE = 0.01
topology = (60,40,20)
model_params = {"learning_rate": LEARNING_RATE}
model_fn = my_model_function(topology, model_params)
model = tf.estimator.Estimator(model_fn, model_params)
print("\nmodel_dir?  No?  Why not? ", model.model_dir, "\n")  # This documents the error

# Input function.
my_input_fn = tf.estimator.inputs.numpy_input_fn({"x" : train_features}, train_labels, shuffle=True)

# Train the model.
model.train(input_fn=my_input_fn, steps=20)

ВЫХОД

/usr/lib/python3.6/importlib/_bootstrap.py:219: RuntimeWarning: compiletime version 3.5 of module 'tensorflow.python.framework.fast_tensor_util' does not match runtime version 3.6
  return f(*args, **kwds)
INFO:tensorflow:Using default config.
INFO:tensorflow:Using config: {'_model_dir': {'learning_rate': 0.01}, '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': None, '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_service': None, '_cluster_spec': <tensorflow.python.training.server_lib.ClusterSpec object at 0x7f0b55279048>, '_task_type': 'worker', '_task_id': 0, '_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1}

model_dir?  No?  Why not?  {'learning_rate': 0.01} 

INFO:tensorflow:Create CheckpointSaverHook.
Traceback (most recent call last):
  File "minimal_estimator_bug_example.py", line 81, in <module>
    model.train(input_fn=my_input_fn, steps=20)
  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/estimator/estimator.py", line 302, in train
    loss = self._train_model(input_fn, hooks, saving_listeners)
  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/estimator/estimator.py", line 756, in _train_model
    scaffold=estimator_spec.scaffold)
  File "/usr/local/lib/python3.6/dist-packages/tensorflow/python/training/basic_session_run_hooks.py", line 411, in __init__
    self._save_path = os.path.join(checkpoint_dir, checkpoint_basename)
  File "/usr/lib/python3.6/posixpath.py", line 78, in join
    a = os.fspath(a)
TypeError: expected str, bytes or os.PathLike object, not dict

------------------
(program exited with code: 1)
Press return to continue

Я точно вижу, что пошло не так: model_dir (которую я оставил по умолчанию) каким-то образом привязан к значению, которое я предназначал для model_params. Как это произошло в моем коде? Я не вижу этого.

Если у кого-то есть советы или предложения, я был бы очень признателен им. Спасибо!


person John Ladasky    schedule 07.12.2017    source источник


Ответы (1)


Просто потому, что вы кормите свой model_param как model_dir, когда строите свой Estimator.

Из документации по тензорному потоку:

Функция оценки __init__:

__init__(
    model_fn,
    model_dir=None,
    config=None,
    params=None
)

Обратите внимание, что вторым аргументом является model_dir. Если вы хотите указать только params, вам нужно передать его в качестве аргумента ключевого слова.

model = tf.estimator.Estimator(model_fn, params=model_params)

Или укажите все предыдущие позиционные аргументы:

model = tf.estimator.Estimator(model_fn, None, None, model_params)
person Lescurel    schedule 07.12.2017
comment
Спасибо, Лескурель! Я внес изменения и исправил ошибку. TensorFlow ведет себя не как Python, должна была возникнуть ошибка TypeError. Кроме того, я считаю, что документация TensorFlow в настоящее время противоречит сама себе. Посмотрите на страницу, на которую я ссылался ранее, которую я просматривал, tensorflow.org/extend/estimators : Напротив, когда вы создаете свою собственную оценку с нуля, конструктор принимает только два высокоуровневых параметра для конфигурации модели, model_fn и params: nn = tf.estimator.Estimator(model_fn=model_fn, params=model_params) - person John Ladasky; 08.12.2017
comment
Я согласен с вами в отношении поведения, отличного от Python, и об этом можно было бы уведомить разработчиков Tensorflow. (Откройте проблему github, если хотите). Однако по предоставленной вами ссылке пример с аргументами ключевого слова, и есть примечание, которое завершает Как и предопределенные регрессоры и классификаторы tf.estimator, инициализатор Estimator также принимает общие аргументы конфигурации model_dir и config.. Согласен, что можно было бы сделать понятнее, но тем не менее информация здесь. - person Lescurel; 08.12.2017