Как загрузить набор данных Tensorflow "Iris" и изменить метки в одноразовое кодирование - PullRequest
3 голосов
/ 04 августа 2020

Я пытаюсь загрузить набор данных "iris" непосредственно из наборов данных tensorflow и застрял. Я привык работать с CSV.

import tensorflow as tf
import tensorflow_datasets as tfds

data = tfds.load("iris",split='train[:80%]', as_supervised=True)
data = data.batch(10)
features, labels = data

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

В документации по тензорному потоку мало информации о том, как это сделать. любая помощь приветствуется

1 Ответ

3 голосов
/ 04 августа 2020

Вы можете подогнать свои ярлыки с помощью метода .map() и tf.one_hot, например:

data = data.batch(10).map(lambda x, y: (x, tf.one_hot(y, depth=3)))

print(next(iter(data))[1])
<tf.Tensor: shape=(10, 3), dtype=float32, numpy=
array([[1., 0., 0.],
       [0., 0., 1.],
       [0., 1., 0.],
       [0., 0., 1.],
       [1., 0., 0.],
       [0., 1., 0.],
       [0., 1., 0.],
       [0., 1., 0.],
       [1., 0., 0.],
       [0., 0., 1.]], dtype=float32)>

Полностью рабочий минимальный пример:

import tensorflow as tf
import tensorflow_datasets as tfds

data = tfds.load("iris",split='train[:80%]', as_supervised=True)
data = data.batch(10).map(lambda x, y: (x, tf.one_hot(y, depth=3))).repeat()

model = tf.keras.models.Sequential([
    tf.keras.layers.Dense(8, activation='relu'),
    tf.keras.layers.Dense(16, activation='relu'),
    tf.keras.layers.Dense(3, activation='softmax')
])

model.compile(loss='categorical_crossentropy', optimizer='adam', 
    metrics=['categorical_accuracy'])

history = model.fit(data, steps_per_epoch=8, epochs=10)
Epoch 10/10
1/8 [==>...........................] - ETA: 0s - loss: 0.8848 - cat_acc: 0.6000
8/8 [==============================] - 0s 4ms/step - loss: 0.8549 - cat_acc: 0.5250
...