• 跟 Google 学 machineLearning [2] -- 关于 classifier.fit 的 warning


    tensorfllow 的进化有点快。学习的很多例子已经很快的过时了,这里记录一些久的例子里被淘汰的方法,供后面参考。

    我系统现在安装的是 tensorflow 1.4.1。

    主要是使用了下面的代码后,出现 warning:

    from tensorflow.contrib import learn
    
    myclassifier = learn.DNNClassifier(hidden_units=[10, 20, 10], n_classes=3)
    
    myclassifier.fit(x_train_array, y_train_array)

    warning:

    calling fit whith x is deprecated and will be removed after 2016...

    解决方法,按照 warning 里的提示,搜了一下,发现,引入 SKCompat,并通过它来调用 classifier,即可使用原来的 fit 函数:

    from tensorflow.contrib.learn.python import SKCompat
    
    feature_columns = [tf.contrib.layers.real_valued_column("", dimension=4)]
    
    classifier = SKCompat( learn.DNNClassifier(feature_columns=feature_columns,
            hidden_units=[10, 20, 10],
            n_classes=3) )

    但是,使用 SKCompat 并没有真正的让 classifier 变成原来那个,只是改变了数据输入方式而已。从 pydoc 看到 SKCompat 共重写了三个函数:

    1. fit,可以像原来一样,使用两个 array list 来进行数据填充。

    2. predict,并不是原来的 predict,而是新 tensorflow.contrib.learn.Estimator 中的 predict,同样是使用 array 来喂数据。它的返回值也不是一个 array,反正我还没看懂到底它是个啥。

    3. score,事实上就是新的 ensorflow.contrib.learn.Evaluable 中的 evaluate,同上,使用 array 来喂数据。

    所以,即使使用过 SKCompat 之后,也还是没法用原来 predict 取得 y_test_prediction, 然后与 y_test 做比较。但是,你可以调用 score 得到一个 dic,其中 ["accuracy"]就是准确度评分。

    accuracy_score = classifier.score(x_test, y_test)["accuracy"]

     使用 predict ,要用下面的方法打印出可以看懂的结果(最新的手册上说 predict 的返回值是个 intertor,要用下面的方式取结果;我实验的结果是,我这里的返回值是个 dict, key 为 'classes'的就是我们要的内容了,具体的见最后的代码,这是我今天实验的最终代码;所以,tensor 又进化了):

    y=classifier.predict(x_test)
    predictions = list(p["predictions"] for p in itertools.islice(y, 6))
    print("Predictions: {}".format(str(predictions)))

    上面的 6 是 x_test 元素的个数。

    ===================================================

    分割线

    ===================================================

    新的 classifer 中,输入全部用的是 input_func 。这是上面报错的根本原因。

    为什么要用 input_func 呢?官方给出的说法大概是,array 只适合小数据量时候使用。。。毕竟 array 的大小是有限的。这看起来完全没什么毛病。

    官方给出的最新的方法(2017-12-25)是:

    import numpy as np
    
    training_set = tf.contrib.learn.datasets.base.load_csv_with_header(
        filename=IRIS_TRAINING, target_dtype=np.int, features_dtype=np.float32)
    
    train_input_fn = tf.estimator.inputs.numpy_input_fn(
        x={"x": np.array(training_set.data)},
        y=np.array(training_set.target),
        num_epochs=None,
        shuffle=True)
    
    classifier.train(input_fn=train_input_fn, steps=2000)

    载入一个 datasets 之后,直接调用 estimator.inputs 中的 numpy.input_fn 来生成需要的 input_fn,后面给 classifier 喂数据,就喂这个 train_input_fn 就可以了。需要注意的是,这里传入的是函数 input_fn=train_input_fn, 而不是函数的返回值 input_fn=train_input_fn()。闭包?

    或者,你想使用一个可以传递参数的 input_func,官方给出了三种方法(茴香豆的茴字也有三种写法,mmp):

    A)写个 wrapper

    def my_input_fn(data_set):
      ...
    
    def my_input_fn_training_set():
      return my_input_fn(training_set)
    
    classifier.train(input_fn=my_input_fn_training_set, steps=2000)

    B)使用 functools.partial

    classifier.train(
        input_fn=functools.partial(my_input_fn, data_set=training_set),
        steps=2000)

    C) 使用 lamda

    classifier.train(input_fn=lambda: my_input_fn(training_set), steps=2000)

    反正,在我看来,是越来越麻烦了,但是,现在它毕竟是一个有用的工具,还是要用的。

    ============

    from sklearn import metrics
    from sklearn.model_selection import train_test_split
    import tensorflow as tf
    from tensorflow.contrib import learn
    import numpy as np
    from tensorflow.contrib.learn.python import SKCompat
    import itertools
    
    iris = learn.datasets.load_dataset('iris')
    
    print iris.data
    print iris.target
    
    x_train, x_test, y_train, y_test = train_test_split(
            iris.data, iris.target, test_size=0.2, random_state=42)
    
    feature_columns = [tf.contrib.layers.real_valued_column("", dimension=4)]
    
    classifier = SKCompat( learn.DNNClassifier(feature_columns=feature_columns,
            hidden_units=[10, 20, 10],
            n_classes=3) )
    
    classifier.fit(x_train, y_train, steps=200)
    accuracy_score = classifier.score(x_test, y_test)["accuracy"]
    print('Accuracy:{0:f}'.format(accuracy_score))
    
    predictions=classifier.predict(x_test)['classes']
    print("Predictions: {}".format(str(predictions)))
  • 相关阅读:
    js添加和删除class
    GIT回滚master分支到指定tag版本
    table添加正确的样式
    iframe父页面与子页面赋值
    关于日期转换
    vue-cli脚手架安装
    npm手册
    linear-gradient常用实现效果
    【转载】说说JSON和JSONP,也许你会豁然开朗,含jQuery用例
    雷霄骅走了
  • 原文地址:https://www.cnblogs.com/pied/p/8109498.html
Copyright © 2020-2023  润新知