Пользовательские проблемы слоя Keras

Ненавижу задавать подобные вопросы по машинному обучению, но поиск в Google ничего полезного не дал - я только что обнаружил 2 потока github, где люди на очень старых версиях tenorflow получали одно и то же сообщение об ошибке, но не по той же причине, по которой я его получал.

В принципе; Я использую этот документ для работы; и он использует пространственное softargmax (просто слой, который очень похож на стек изображений) и возвращает наиболее "интенсивную" часть изображения (то есть только координаты x,y белого шарика). массив с 68 из этих изображений (все 1 канал, таким образом, массив составляет 100x100x68), и он дает 68 пар координат x,y для каждого из них - они в конечном итоге являются точками лица.

Слой, который я написал в керасе, чтобы сделать это, является;

class spatial_softArgmax(Layer):

        def __init__(self, output_dim, **kwargs):
                self.output_dim = output_dim
                super(spatial_softArgmax, self).__init__(**kwargs)


        def build(self, input_shape):
                # Create a trainable weight variable for this layer.
                # self.kernel = self.add_weight(name='kernel', shape=(input_shape[1], self.output_dim), initializer='uniform', trainable=True)
                super(spatial_softArgmax, self).build(input_shape)  # Be sure to call this somewhere!

        def call(self, x):
            #print "input to ssm:  " + str(x.shape)
            maps = layers.spatial_softmax(x, data_format='NCHW')
            #maps = tf.reshape(maps, [2, 68])
            #print "output of ssm: " + str(maps.shape)
            return maps

        def get_config(self):
                config = super(spatial_softArgmax, self).get_config()
                config['output_dim'] = self.output_dim
                config['input_shape'] = self.input_shape
                return config

        def compute_output_shape(self, input_shape):
                return (input_shape[0], self.output_dim)

Это не работает, хотя; как у всех; Я продолжаю получать сообщение об ошибке "Нет значений, которые не поддерживаются" всякий раз, когда я пытаюсь начать обучение (обучение начинается, если я заменяю его плотным - так что проблема определенно в этом слое) - что заставляет меня думать, что мой слой не возвращается что-нибудь?? Я немного покопался в коде TF, где это исключение повышается, но на самом деле не нашел много...

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

РЕДАКТИРОВАТЬ: я удалил строку self.kernel; но сейчас получаю:

x,y shape (12000, 3, 100, 100) - (12000, 68, 2)
Traceback (most recent call last):
  File "architecture.py", line 58, in <module>
    model.fit(x, y, batch_size=1, epochs=50, verbose=1)
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 1522, in fit
    batch_size=batch_size)
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 1382, in _standardize_user_data
    exception_prefix='target')
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 132, in _standardize_input_data
    str(array.shape))
ValueError: Error when checking target: expected spatial_soft_argmax_1 to have 2 dimensions, but got array with shape (12000, 68, 2)

1 ответ

Решение

Вы добавили вес self.kernel но не использовал его нигде в вашем call функция.

Поэтому TF не может вычислить градиент для параметров в self.kernel, В этом случае градиент будет None и именно поэтому вы видите сообщение об ошибке при работе на None ценности.

Удаление линии self.kernel = self.add_weight(...) должно заставить это работать.

Другие вопросы по тегам