Ошибка Tensorflow.keras с использованием глубины ввода Conv2D и глубины фильтра не совместимы? - PullRequest
1 голос
/ 22 марта 2020

Я использую tenorflow 2.1 и получаю эту ошибку

OP_REQUIRES failed at conv_ops.cc:530 : Invalid argument: input depth must be evenly divisible by filter depth: 56 vs 16

Когда я запускаю этот код

# modified from https://github.com/tensorflow/tpu/blob/master/models/official/efficientnet/efficientnet_model.py
def SEBlock(input_filters, se_ratio, data_format=None):

    expand_ratio = 1
    num_reduced_filters = max(
        1, int(input_filters * se_ratio))
    filters = input_filters * expand_ratio

    channel_axis = -1
    spatial_dims = [1, 2]

    def block(inputs):
        x = inputs
        x = layers.Lambda(lambda a: K.mean(a, axis=spatial_dims, keepdims=True))(x)
        x = layers.Conv2D(
            num_reduced_filters,
            kernel_size=[1, 1],
            strides=[1, 1],
            padding='same',
            use_bias=True,
            data_format="channels_last")(x)
        x = Swish()(x)
        # Excite
        x = layers.Conv2D(
            filters,
            kernel_size=[1, 1],
            strides=[1, 1],
            padding='same',
            use_bias=True,
            data_format="channels_last")(x)
        x = layers.Activation('sigmoid')(x)
        out = layers.Multiply()([x, inputs])
        return out

    return block

Когда я строю свою модель с этим блоком, она строится просто отлично, но когда я пытаюсь тренироваться, он взрывается. Входной тензор в блок имеет значение shape=(None, 56, 56, 16), на выходе возвращается тензор с такими же размерами.

input_filters = 16
se_ratio = .25

1 Ответ

1 голос
/ 23 марта 2020

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

import tensorflow.keras as keras
import tensorflow.math as K

import numpy
ip = keras.layers.Input((56, 56, 16))
x = keras.layers.Lambda(lambda a: K.reduce_mean(a, axis=[1,2], keepdims=True))(ip)
x = keras.layers.Conv2D( 
    4, 
    kernel_size=[1,1], 
    strides=[1,1], 
    padding='same', 
    use_bias=True,
    data_format="channels_last" )(x)
x = keras.layers.Lambda(lambda a: a*K.sigmoid(a))(x)
x = keras.layers.Conv2D( 
    16, 
    kernel_size=[1,1], 
    strides=[1,1], 
    padding='same', 
    use_bias=True,
    data_format="channels_last" )(x)

x = keras.layers.Activation('sigmoid')(x)
x = keras.layers.Multiply()([x, ip])
m = keras.Model(inputs=[ip], outputs=[x])


y = m.predict(numpy.random.random((2, 56, 56, 16)))

print(y.shape)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...