自定义 Keras 层问题

Custom Keras Layer Troubles

讨厌在机器学习上问这样的问题,但谷歌搜索没有得到任何有用的结果——我刚刚发现 2 个 github 线程,其中超旧版本的 tensorflow 的人得到了同样的错误 消息,但我收到它的原因不同。

基本上;我正在为工作实施这张面部护理纸;它使用空间 softargmax(只是一个层,它接收一堆图像,很像 this - 它 returns 最 "intense part" 图像(所以只有 x,y 坐标白色斑点的)。它接收一个包含 68 张这些图像的数组(所有 1 个通道,因此数组为 100x100x68),并为每个图像提供 68 对 x,y 坐标 - 这些最终成为面部点。

我在 keras 中编写的图层是;

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)

虽然它不起作用;完全喜欢;每当我尝试开始训练时,我都会收到此错误,提示 'None Values not supported' (如果我用密集替换它,训练就会开始 - 所以问题肯定是这一层) - 这让我觉得我的层没有返回任何东西??我在 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)

您添加了一个权重 self.kernel,但没有在您的 call 函数中的任何地方使用它。

因此,TF无法为self.kernel中的参数计算梯度。在这种情况下,梯度将为 None,这就是为什么您会看到一个错误,抱怨在 None 值上进行操作。

删除行 self.kernel = self.add_weight(...) 应该可以正常工作。