В настоящее время я работаю с данными MNIST как часть курса по использованию numpy и tenorflow. Я выполнял код, который они предоставили в курсе, и заметил несколько предупреждений от tenorflow при запуске этого фрагмента кода:

from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets("../data/mnist_data/", one_hot=True)

Я заглянул в документацию и прочитал, что это устарело, и вместо этого следует использовать MNIST из keras. Поэтому я изменил приведенный выше код на этот

from keras.datasets import mnist
from keras.models import Sequential, load_model
from keras.layers.core import Dense, Dropout, Activation
from keras.utils import np_utils

(X_train, y_train), (X_test, y_test) = mnist.load_data()

Моя проблема сейчас в том, что в материале курса они используют эту функцию:

training_digits, training_labels = mnist.train.next_batch(5000)

Эта функция next_batch() недоступна для keras, а исходный набор данных MNIST довольно большой. Есть ли умный способ сделать это с помощью кераса?

Спасибо заранее!

2
afettouhi 27 Июн 2019 в 09:01

3 ответа

Лучший ответ

Вы можете установить batch_size и использовать итератор одного выстрела (), как описано здесь Документация Keras Mnist

1
nag 27 Июн 2019 в 06:25

Проблема заключается в том, что в вашем руководстве используется API, отличный от API набора данных keras, используемого в большинстве современных учебных пособий. Используя API keras.dataset, вы пытаетесь «пересечь потоки».

У вас (в широком смысле) есть три варианта:

Опция 1

Просто придерживайтесь существующего учебника и игнорируйте предупреждения об устаревании. Супер просто, но вы можете пропустить преимущества keras api (новый по умолчанию), если вы не собираетесь изучать это позже

Вариант 2

Полностью переключитесь на API keras и найдите новый учебник. Этот пример MNIST всего в нескольких строках кода:

mnist = tf.keras.datasets.mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

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

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])


model.fit(x_train, y_train, epochs=5)

model.evaluate(x_test, y_test)

Если это доступно для вас, я рекомендую этот вариант. keras - новое значение по умолчанию. Возможно, это не вариант, или вы хотите придерживаться своего первоначального курса, но я определенно рекомендую в ближайшее время ознакомиться с keras.

Вариант 3

Найдите способ успешно «пересечь потоки».

Это более сложно, но, безусловно, можно сделать. keras.dataset для mnist - это просто большой массив. Вы можете заглянуть в API набора данных (в частности, load_from_tensor() и load_from_tensor_slices()). Эти параметры должны быть немного спорными, потому что по своей сути (как вы обнаружили) набор данных, возвращаемый из нового метода, отличается от типа, возвращаемого из старых.

ОБНОВИТЬ:

ссылка в Ответ Нага предоставляет исчерпывающий пример того, что я не знал ранее!

0
Stewart_R 27 Июн 2019 в 06:33

Используйте Sequential () из Keras. Этот Sequential () имеет метод fit (), в котором вы можете установить batchSize в параметре. См. Документацию: последовательный keras

0
Asif 27 Июн 2019 в 06:08