Как реализовать мини-пакетный градиентный спуск в Tensorflow 2?

#python #numpy #tensorflow #keras #tensorflow-datasets

#python #numpy #tensorflow #keras #tensorflow-наборы данных

Вопрос:

Я относительно новичок в машинном обучении и Tensorflow, и я хочу попробовать реализовать мини-пакетный градиентный спуск в наборе данных MNIST. Однако я не уверен, как я должен это реализовать.

(Примечание: обучающие изображения (28 пикселей на 28 пикселей) и метки хранятся в массивах Numpy)

На данный момент я вижу 2 разных способа его реализации:

  1. Мои обучающие изображения находятся в массиве Numpy [60000,28,28]. Преобразуйте это в [25 (количество пакетов), 2400 (количество изображений в пакете), 28,28], а затем используйте цикл for для вызова каждого пакета и передачи ему метода model.compile(). Единственное, что меня беспокоит в этом методе, это то, что циклы for по своей сути медленные, а векторизованная реализация была бы намного быстрее.

  2. Объедините изображения и метки в объект набора данных tensorflow, а затем вызовите метод Dataset.batch() и метод Dataset.prefetch(), а затем передайте данные в метод model.compile(). Единственная проблема заключается в том, что мои данные не остаются в виде массива Numpy, который, как я чувствую, обладает большей гибкостью, чем объекты набора данных tensorflow.

Какой из этих 2 методов было бы лучше всего реализовать, или есть третий способ, который является лучшим, о котором я не знаю?

Ответ №1:

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

Комментарии:

1. Спасибо за ваш ответ! Да, я использую Keras. Какие размеры будет иметь массив numpy, который я передаю модели. подходящий метод может быть, если, скажем, я хотел размер мини-пакета 25.

2. Просто передайте все данные, на которых вы хотите обучить сеть, в функцию fit и укажите batch_size=25. Затем это будет обучать сеть всем данным в мини-пакетах размером 25. Возможно, вам придется немного отредактировать данные, прежде чем вы это сделаете, чтобы придать им правильную форму и тип. Подробную информацию о том, как это сделать, можно найти здесь: keras.io/examples/vision/mnist_convnet

3. Спасибо. Я заставил это работать 😁. Одним из компонентов, которого мне также не хватало ранее, был слой выравнивания перед плотными слоями.