自定义 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(...)
应该可以正常工作。
讨厌在机器学习上问这样的问题,但谷歌搜索没有得到任何有用的结果——我刚刚发现 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(...)
应该可以正常工作。