tf.data を使って NumPy データをロードする

View on TensorFlow.org Run in Google Colab View source on GitHub Download notebook

このチュートリアルでは、NumPy 配列から tf.data.Dataset にデータを読み込む例を示します。

この例では、MNIST データセットを .npz ファイルから読み込みますが、 NumPy 配列がどこに入っているかは重要ではありません。

設定

import numpy as np
import tensorflow as tf
import tensorflow_datasets as tfds

.npz ファイルからのロード

DATA_URL = 'https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz'

path = tf.keras.utils.get_file('mnist.npz', DATA_URL)
with np.load(path) as data:
  train_examples = data['x_train']
  train_labels = data['y_train']
  test_examples = data['x_test']
  test_labels = data['y_test']

tf.data.Dataset を使って NumPy 配列をロード

サンプルの配列と対応するラベルの配列があるとします。 tf.data.Dataset.from_tensor_slices にこれら2つの配列をタプルとして入力し、tf.data.Dataset を作成します。

train_dataset = tf.data.Dataset.from_tensor_slices((train_examples, train_labels))
test_dataset = tf.data.Dataset.from_tensor_slices((test_examples, test_labels))

データセットの使用

データセットのシャッフルとバッチ化

BATCH_SIZE = 64
SHUFFLE_BUFFER_SIZE = 100

train_dataset = train_dataset.shuffle(SHUFFLE_BUFFER_SIZE).batch(BATCH_SIZE)
test_dataset = test_dataset.batch(BATCH_SIZE)

モデルの構築と訓練

model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28)),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer=tf.keras.optimizers.RMSprop(),
                loss=tf.keras.losses.SparseCategoricalCrossentropy(),
                metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])
model.fit(train_dataset, epochs=10)
Epoch 1/10
938/938 [==============================] - 2s 2ms/step - loss: 3.2206 - sparse_categorical_accuracy: 0.8770
Epoch 2/10
938/938 [==============================] - 2s 2ms/step - loss: 0.5165 - sparse_categorical_accuracy: 0.9265
Epoch 3/10
938/938 [==============================] - 2s 2ms/step - loss: 0.3985 - sparse_categorical_accuracy: 0.9463
Epoch 4/10
938/938 [==============================] - 2s 2ms/step - loss: 0.3255 - sparse_categorical_accuracy: 0.9555
Epoch 5/10
938/938 [==============================] - 2s 2ms/step - loss: 0.2839 - sparse_categorical_accuracy: 0.9611
Epoch 6/10
938/938 [==============================] - 2s 2ms/step - loss: 0.2557 - sparse_categorical_accuracy: 0.9650
Epoch 7/10
938/938 [==============================] - 2s 2ms/step - loss: 0.2349 - sparse_categorical_accuracy: 0.9689
Epoch 8/10
938/938 [==============================] - 2s 2ms/step - loss: 0.2298 - sparse_categorical_accuracy: 0.9705
Epoch 9/10
938/938 [==============================] - 2s 2ms/step - loss: 0.2064 - sparse_categorical_accuracy: 0.9744
Epoch 10/10
938/938 [==============================] - 2s 2ms/step - loss: 0.2002 - sparse_categorical_accuracy: 0.9767

<tensorflow.python.keras.callbacks.History at 0x7f4432e9eb38>
model.evaluate(test_dataset)
157/157 [==============================] - 0s 2ms/step - loss: 0.6114 - sparse_categorical_accuracy: 0.9587

[0.6114354133605957, 0.9587000012397766]