Класс TensorFlowDNNClassifier устарел, но замена не работает?

Используя следующее с TF .9.0rc0 для 60 000 (поезд) и 26 000 (тест) для или около того записей с 145 кодированными столбцами (1,0), пытаясь предсказать 1 или 0 для идентификации класса.

classifier_TensorFlow = learn.TensorFlowDNNClassifier(hidden_units=[10, 20, 10],n_classes=2, steps=100)
classifier_TensorFlow.fit(X_train, y_train.ravel())

Я получил:

WARNING:tensorflow:TensorFlowDNNClassifier class is deprecated. Please consider using DNNClassifier as an alternative.
Out[34]:TensorFlowDNNClassifier(steps=100, batch_size=32)

И тогда хорошие результаты довольно быстро:

score = metrics.accuracy_score(y_test,   classifier_TensorFlow.predict(X_test))
print('Accuracy: {0:f}'.format(score))
Accuracy: 0.923121

А также:

print (metrics.confusion_matrix(y_test, X_pred_class))
[[23996   103]
[ 1992    15]]

Но когда я пытаюсь использовать новый предложенный метод:

classifier_TensorFlow = learn.DNNClassifier(hidden_units=[10, 20, 10],n_classes=2)

это висит без завершения? это не будет принимать параметр "шаги"? Я не получаю сообщения об ошибках или вывод, так что не так много, чтобы продолжить... Есть идеи или советы? Документация немного "легкая?"

2 ответа

Решение

Я не думаю, что это ошибка, из исходного кода DNNClassifier, я могу сказать, что его использование отличается от TensorFlowDNNClassifier. Конструктор DNNClassifier не имеет параметра steps:

def __init__(self,
           hidden_units,
           feature_columns=None,
           model_dir=None,
           n_classes=2,
           weight_column_name=None,
           optimizer=None,
           activation_fn=nn.relu,
           dropout=None,
           config=None)

Как вы могли видеть здесь. Вместо этого метод fit(), который DNNClassifier унаследовал от BaseEstimator, теперь имеет параметр steps, обратите внимание, что то же самое происходит с batch_size:

  def fit(self, x=None, y=None, input_fn=None, steps=None, batch_size=None,
          monitors=None):

Для "он зависает без завершения?", В документе метода fit() BaseEstimator объясняется, что если шаги None (в качестве значения по умолчанию) модель будет тренироваться вечно.

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

Как вы могли видеть, DNNClassifier не дает никакой обратной связи как устаревший TensorFlowDNNClassifier, предполагается, что обратная связь может быть настроена с параметром 'config', который присутствует в конструкторе DNNClassifier. Таким образом, вы должны передать объект RunConfig как config, и в параметрах этого объекта вы должны установить подробный параметр, к сожалению, я попытался установить его, чтобы я мог видеть прогресс потери, но мне не повезло.

Я рекомендую вам взглянуть на последний пост Юаня Тана в его блоге здесь, одного из создателей skflow, он же учиться.

У меня просто была похожая проблема @Ismael ответ правильный. Я просто хотел добавить к информации, что теперь classifier.fit() имеет параметр steps, который ведет себя по-разному. Это не прерывается раньше. Есть еще один параметр, который называется max_steps. Это ведет себя как исходный параметр шагов TensorFlowDNNClassifier.

Короче, просто используйте параметр max_steps для fit () следующим образом:

classifier = skflow.DNNClassifier(...)
classifier.fit(X_train, y_train, max_steps=3000)
Другие вопросы по тегам