Класс 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)