自定义Keras层故障

时间:2017-12-04 00:23:51

标签: tensorflow neural-network keras softmax

讨厌在机器学习上问这样的问题,但谷歌搜索没有产生任何用处 - 我刚刚找到2个github线程,其中超级旧版本的tensorflow上的人得到了同样的错误消息,但是不是出于同样的原因我得到它。

基本上;我正在为工作实施这张面部纸;并且它使用空间softargmax(只是一个接收一堆图像的层,就像this一样 - 它返回图像中最“强烈的部分”(所以只是白色斑点的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)

虽然不行;像一样;每当我尝试开始训练时,我会不断收到“无值不支持”的错误(如果我用密集替换它就开始训练 - 所以问题肯定是这一层) - 这让我认为我的图层没有返回什么?我在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 个答案:

答案 0 :(得分:2)

您已经添加了权重self.kernel,但在call函数的任何位置都没有使用它。

因此,TF无法计算self.kernel中参数的梯度。在这种情况下,渐变将为None,这就是为什么您发现抱怨操作None值的错误。

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