API Tensorflow Estimator: как передать параметр из входной функции

Я пытаюсь добавить веса классов в качестве гиперпараметра для своей модели, но для расчета веса мне нужно прочитать входные данные, это происходит внутри input_fn, который затем передается в estimator.fit(). Результатом input_fn являются только функции, метки которых должны иметь одинаковую форму num_examples * num_features. Мои вопросы - есть ли способ передать данные из input_fn в карту гиперпараметров model_fn? Или в качестве альтернативы - может быть, есть оболочка для набора данных input_fn, которая позволяет передискретизировать меньшинство/недостаточно выборки большинства вместе с пакетной обработкой - в этом случае мне не понадобится какой-либо параметр для распространения.


person Stanislav Levental    schedule 21.01.2018    source источник
comment
может быть важно указать, используете ли вы tf.estimator.Estimator или tf.contrib.learn.Estimator. Я думаю, что между ними есть небольшие различия   -  person Ciprian Tomoiagă    schedule 23.01.2018
comment
Вес разный для каждой партии? Разве вы не можете передать его как вывод вместе с функциями и метками?   -  person Olivier Moindrot    schedule 25.01.2018
comment
tensorflow.org/api_docs/python/tf/estimator/inputs/ который я использую, требует, чтобы все выходные данные были равны по размеру, я, вероятно, могу изменить веса, чтобы сделать их того же размера, что и функции. Но мне было интересно, есть ли более чистый способ передачи параметров, сгенерированных набором данных, которые не являются функциями и метками.   -  person Stanislav Levental    schedule 25.01.2018


Ответы (1)


И функции, и метки могут быть словарем тензоров (а не только одним тензором). Тензоры могут быть любой формы, которую вы хотите, хотя обычно это num_examples * ...

Если вы не используете какие-либо из предопределенных оценок, самым простым способом было бы добавить еще одну функцию с тем, что вам нужно для вычисления весов, вычислить веса в модели, а затем использовать их (умножить потерю или передать ее как параметр) .

У вас также есть доступ к гиперпараметрам внутри input_fn, поэтому вы можете вычислить там вес и добавить его в виде отдельного столбца.

Если вы используете стандартную оценку, проверьте документацию. Я вижу, что большинство из них поддерживают weight_column_name. В этом случае просто дайте ему имя, которое вы использовали в словаре функций для значений веса.

В качестве альтернативы, если ничего не помогает, вы можете сэмплировать данные так, как хотите, прежде чем передавать их в тензорный поток.

person Sorin    schedule 26.01.2018
comment
Спасибо за ваш ответ, но я не думаю, что функции, предоставляемые TF, позволяют тензорам в функции dict быть любой формы - (например, numpy_input_fn), я всегда могу написать свою собственную функцию или собственную логику выборки. Но мне было интересно, есть ли какой-нибудь предпочтительный способ сделать это. Потому что похоже, что несбалансированные классы, предоставляемые Estimator API, вообще не поддерживаются. Я намеревался использовать отдельный столбец функций размера набора данных, дублируя веса для каждой записи. - person Stanislav Levental; 27.01.2018
comment
Несбалансированные классы трудно обрабатывать в общем случае. Если дисбаланс небольшой, вы можете использовать примерные веса. Если дисбаланс больше, то большие веса создадут много шума в ваших градиентах, поэтому может быть лучше, если вы воспроизведете примеры, чтобы средний вес партии был более или менее одинаковым для всех партий. Если дисбаланс еще больше, вам, возможно, придется передискретизировать малый класс или недооценить большой. Как всегда, вам нужно попробовать их и посмотреть, что работает для вашей проблемы. - person Sorin; 29.01.2018