Есть ли разница в вычислениях в зависимости от формы ввода?(CNN в Python с Tensorflow) - PullRequest
0 голосов
/ 13 февраля 2019

Я решаю проблему классификации текста, ссылаясь на статью ( Ким, 2014 ).И тогда я обнаружил, что между двумя нижеприведенными моделями модель слева (Модель 1) занимает примерно в 2,5 раза больше времени, чем модель справа (Модель 2).Я думаю, что количество весовых параметров двух моделей одинаково.Почему разница во времени между двумя моделями?
* Содержимое входных данных двух моделей одинаковое.Просто изменил форму.

model input data Я использовал tf.nn.conv2d .И формы фильтров и шаг следующие:
модель 1: 3x9x1 с количеством фильтров, шаг 3
модель 2: 1x9x3 с количеством фильтров, шаг 1
И остальные вещи такие же
*На изображении выше ширина означает «self.embedding_dim», а высота означает «self.max_length».

pooled_outputs = []
with tf.name_scope("conv-maxpool-3"):
# Convolution Layer
filter_shape = [3, self.embedding_dim, 1, self.num_filters]
W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), name="W")
b = tf.Variable(tf.constant(0.1, shape=[self.num_filters]), name="b")
conv = tf.nn.conv2d(
    self.embedded_chars_expanded,
    W,
    strides=[1, 1, 3, 1],
    padding="VALID",
    name="conv")
# Apply nonlinearity
h = tf.nn.relu(tf.nn.bias_add(conv, b), name="relu")
# Maxpooling over the outputs
pooled = tf.nn.max_pool(
    h,
    ksize=[1, self.max_length - 3 + 1, 1, 1],
    strides=[1, 1, 1, 1],
    padding='VALID',
    name="pool")
pooled_outputs.append(pooled)

----------------------------------------------------------------------

pooled_outputs = []
with tf.name_scope("conv-maxpool-1"):
# Convolution Layer
filter_shape = [1, self.embedding_dim, 3, self.num_filters]
W = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), name="W")
b = tf.Variable(tf.constant(0.1, shape=[self.num_filters]), name="b")
conv = tf.nn.conv2d(
    self.embedded_chars_expanded,
    W,
    strides=[1, 1, 1, 1],
    padding="VALID",
    name="conv")
# Apply nonlinearity
h = tf.nn.relu(tf.nn.bias_add(conv, b), name="relu")
# Maxpooling over the outputs
pooled = tf.nn.max_pool(
    h,
    ksize=[1, self.max_length - 1 + 1, 1, 1],
    strides=[1, 1, 1, 1],
    padding='VALID',
    name="pool")
pooled_outputs.append(pooled)

1 Ответ

0 голосов
/ 13 февраля 2019

В первой модели вы устанавливаете шаг на [1, 1, 3, 1] и не указываете порядок данных, поэтому по умолчанию он равен NHWC, т.е. (num_batches, высота, ширина, каналы) (см. Документ ).).Таким образом, шаг 3 относится к ширине, а не к высоте, как показывает ваше изображение модели 1.Поскольку вы используете VALID отступ, шаг 3 по ширине, между прочим, не имеет никакого эффекта.

Таким образом, ваше описание модели 1 в основном неверно: на шаге 2 оно не переходит к4-й ряд, но во 2-й ряд.То есть модель 1 вычисляет в 3 раза больше сверток, чем модель 2.

Существуют и другие факторы, которые могут способствовать разнице в скорости - может быть, модель 2 может быть лучше распараллелена на GPU, но об этом сложно судить.

...