Форма тензора для 2D-изображения в Keras

Я новичок в Keras (и как-то в TF), но я нашел определение формы для входного слоя очень запутанным.

Итак, в примерах, когда у нас есть одномерный вектор длиной 20 для ввода, форма определяется как

...Input(shape=(20,)...)

И когда необходимо определить 2D-тензор для изображений в оттенках серого для MNIST определяется как:

...Input(shape=(28, 28, 1)...)

Итак, мой вопрос: почему тензор не определяется как (20) и (28, 28)? Почему в первом случае добавляется второе измерение и остается пустым? Кроме того, во-вторых, количество каналов должно быть определено?

Я понимаю, что это зависит от уровня, поэтому Conv1D, Dense или Conv2D принимают разные формы, но кажется, что первый параметр неявный?

Согласно docs, Dense должен быть (batch_size, ..., input_dim), но как это связано с примером:

Плотный (32, input_shape = (784,))

Спасибо


person Aliostad    schedule 10.09.2017    source источник
comment
Помимо моего ответа, я также предлагаю вам сразу перейти к функциональным моделям API. Последовательные модели - это просто ограничения для построения сложных моделей, и когда люди привыкают к последовательным моделям, они часто пытаются продолжать использовать их в тех случаях, когда они не могут быть использованы.   -  person Daniel Möller    schedule 11.09.2017


Ответы (1)


Кортежи против чисел

input_shape должен быть кортежем, поэтому только (20,) может удовлетворить его. Число 20 не является кортежем. - Есть параметр input_dim, чтобы облегчить вам жизнь, если у вас только одно измерение. Этот параметр может принимать 20. (Но на самом деле, меня это просто сбивает с толку, я всегда работаю с input_shape и использую кортежи, чтобы сохранить согласованное понимание).

Dense(32, input_shape=(784,)) совпадает с Dense(32, input_dim=784).

Изображения

В изображениях есть не только пиксели, но и каналы (красный, зеленый, синий).
Черно-белое изображение имеет только один канал.

So, (28pixels, 28pixels, 1channel)

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

Некоторые слои требуют определенной формы

Это случай сверточных 2D-слоев, которым требуется (size1,size2,channels). Им нужна эта форма, потому что они должны соответствующим образом применять сверточные фильтры.

Это также относится к повторяющимся слоям, которым требуется (timeSteps,featuresPerStep) для выполнения своих повторяющихся вычислений.

Модели MNIST

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

Многие примеры просто не заботятся о том, чтобы изображение было двухмерным структурированным объектом, и они просто используют модели, занимающие 784 пикселя. Достаточно. Вероятно, они начинаются с Dense слоев, требующих формы типа (size,).

Другие примеры могут иметь значение и использовать форму (28,28), но тогда эти модели должны будут изменить форму ввода, чтобы соответствовать потребностям следующего слоя.

Сверточные слои 2D потребуют (28,28,1).

Основная идея: входные массивы должны соответствовать input_shape или input_dim.

Тензорные формы

Однако будьте осторожны при чтении сообщений об ошибках Keras или работе с пользовательскими слоями / слоями лямбда.

Во всех этих формах, которые мы определили ранее, не учитывается важный параметр: размер партии или количество образцов.

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

Таким образом, input_shape=(784,) будет отображаться как (None,784).
И input_shape=(28,28,1) будет отображаться как (None,28,28,1)

И ваши фактические входные данные должны иметь форму, которая соответствует указанной форме.

person Daniel Möller    schedule 10.09.2017
comment
Спасибо. Это было так полезно. - person Aliostad; 11.09.2017