Входная функция оценщика Tensorflow: определение каждой функции или нет? - PullRequest
0 голосов
/ 09 мая 2018

С x - матрица данных Iris размером 120 x 4 (4 функции), а y - метка, я могу сделать функцию ввода для tf.estimator, как показано ниже

def input_function(x, y):
    dict_x = {
        "sepal_length" : x[:,0],
        "sepal_width" :  x[:,1],
        "petal_length" : x[:,2],
        "petal_width" :  x[:,3]
    }

    dataset = tf.data.Dataset.from_tensor_slices((
        dict_x, y
    ))

    return dataset

затем определите столбец объектов, как показано ниже:

feature_columns = [
    tf.feature_column.numeric_column(key="sepal_length"),
    tf.feature_column.numeric_column(key="sepal_width"),
    tf.feature_column.numeric_column(key="petal_length"),
    tf.feature_column.numeric_column(key="petal_width")
]

Но я обнаружил в Интернете (я забыл, что источник все еще ищет), что я также могу определить функцию ввода, как показано ниже. Разница с предыдущим методом состоит в том, что все четыре функции теперь определены только с одним ключом, "x".

def input_function(x, y):
    dict_x = {
        "x" : x,
    }

    dataset = tf.data.Dataset.from_tensor_slices((
        dict_x, y
    ))

    return dataset

затем определите столбец объектов, как показано ниже:

feature_columns = [
    tf.feature_column.numeric_column(key="x",shape=4),
]

Я запустил оба метода, и оба дают почти одинаковый результат. Мой вопрос : Я не могу найти документацию, которая объясняет разницу между обоими методами, потому что dict_x имеет различную форму. Они все еще одинаково относятся к входному слою в нейронных сетях?

Я новичок в использовании tf.estimator, Спасибо

Мой код оценки, если необходимо:

classifier = tf.estimator.DNNClassifier(
    feature_columns=feature_columns,
    hidden_units=[10],
    n_classes=3,
    optimizer=tf.train.GradientDescentOptimizer(0.001),
    activation_fn=tf.nn.relu
)

# Train the model
classifier.train(
    input_fn=lambda:input_function(xtrain, ytrain, True)
)

1 Ответ

0 голосов
/ 09 мая 2018

В случае numeric_column с одинаковыми dtype единственное отличие - форма результирующего ввода:

Опция 1 создает ввод формы: [120,4,1]: 120 выборок, каждый из которых представлен 4 векторами по 1 номеру.

Принимая во внимание, что опция 2 создает ввод формы: [120,1,4]: 120 выборок, каждый из которых представлен одним вектором, состоящим из 4 чисел.

В конце концов, это на самом деле не имеет значения, потому что оба сглаживаются до [120,4] перед подачей в сеть.


Сначала я создал элементы.

features1 = {
    'sepal_length' : np.random.rand(120),
    'sepal_width': np.random.rand(120),
    'petal_length': np.random.rand(120),
    'petal_width': np.random.rand(120)
}

features2 = {
    'everything' : np.random.rand(120, 4)
}

Затем я подготовил колонки функций - так же, как и вы.

feature_columns1 = [
    tf.feature_column.numeric_column(key="sepal_length"),
    tf.feature_column.numeric_column(key="sepal_width"),
    tf.feature_column.numeric_column(key="petal_length"),
    tf.feature_column.numeric_column(key="petal_width")
]

feature_columns2 = [
    tf.feature_column.numeric_column(key="everything", shape=4),
]

Теперь, чтобы увидеть, что именно с ними делается, когда они поступают в сеть, мы можем использовать feature_column.input_layer().

inputs1 = tf.feature_column.input_layer(features1, feature_columns1)
inputs2 = tf.feature_column.input_layer(features2, feature_columns2)

И, как мы видим, оба пути создали одну и ту же форму.

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    res1 = sess.run(inputs1)
    res2 = sess.run(inputs2)
print(res1.shape)
print(res2.shape)
(120, 4)
(120, 4)
...