Tensorflow 自定义Keras层故障

Tensorflow 自定义Keras层故障,tensorflow,neural-network,keras,softmax,Tensorflow,Neural Network,Keras,Softmax,我不想在机器学习上问这样的问题,但谷歌搜索并没有产生任何有用的结果——我刚刚发现了两个github线程,其中使用tensorflow超旧版本的用户收到了相同的错误消息,但原因与我收到的错误消息不同 基本上;我正在为工作实施这个面部观点文件;它使用spatial softargmax(只是一个层,它接收一堆图像,非常像-并且它返回图像中最“强烈的部分”(因此只有白色斑点的x,y坐标)。它接收一个包含68个图像的阵列(所有1个通道,因此阵列为100x100x68)它给出了68对x,y坐标,每一对都是

我不想在机器学习上问这样的问题,但谷歌搜索并没有产生任何有用的结果——我刚刚发现了两个github线程,其中使用tensorflow超旧版本的用户收到了相同的错误消息,但原因与我收到的错误消息不同

基本上;我正在为工作实施这个面部观点文件;它使用spatial softargmax(只是一个层,它接收一堆图像,非常像-并且它返回图像中最“强烈的部分”(因此只有白色斑点的x,y坐标)。它接收一个包含68个图像的阵列(所有1个通道,因此阵列为100x100x68)它给出了68对x,y坐标,每一对都是面部的点

我用keras写的图层是:

类空间_softArgmax(层):
定义初始值(自身、输出尺寸,**kwargs):
self.output\u dim=output\u dim
超级(空间软件argmax,self)。\uuuuuu初始值(**kwargs)
def构建(自我,输入_形状):
#为该层创建可训练重量变量。
#self.kernel=self.add_weight(name='kernel',shape=(input_shape[1],self.output_dim),初始值设定项='uniform',trainable=True)
超级(spatial_softArgmax,self)。构建(input_shape)#一定要在某处调用它!
def呼叫(自我,x):
#打印“输入到ssm:+str(x.shape)
地图=图层.spatical\u softmax(x,数据格式为'NCHW')
#maps=tf.重塑(maps[2,68])
#打印“ssm的输出:+str(maps.shape)
返回地图
def get_配置(自身):
config=super(space\u softArgmax,self).get\u config()
配置['output\u dim']=self.output\u dim
config['input\u shape']=self.input\u shape
返回配置
def计算输出形状(自身、输入形状):
返回(输入形状[0],自输出尺寸)
但它不起作用;完全一样;每当我尝试开始培训时,我总是会遇到这样一个错误,即“None Values not supported”(无值不受支持)(如果我将其替换为稠密值,则开始培训-因此问题肯定出在这一层)-这让我觉得我的图层没有返回任何东西??我在TF代码中查找了一些异常出现的地方,但没有找到太多

如果你们看到我的图层有什么问题,只要看一眼,我会非常感激,如果你们能让我知道,我今晚需要进行网络培训

编辑:我已经删除了self.kernel行;但是现在我得到了:

x,y形(12000,3100100)-(12000,68,2)
回溯(最近一次呼叫最后一次):
文件“architecture.py”,第58行,在
model.fit(x,y,批大小=1,历代=50,详细=1)
文件“/usr/local/lib/python2.7/dist-packages/keras/engine/training.py”,第1522行,适合
批次大小=批次大小)
文件“/usr/local/lib/python2.7/dist-packages/keras/engine/training.py”,第1382行,在用户数据中
异常(前缀='target')
文件“/usr/local/lib/python2.7/dist packages/keras/engine/training.py”,第132行,输入数据
str(array.shape))
ValueError:检查目标时出错:预期空间_soft_argmax_1有2个维度,但得到了具有形状的数组(12000,68,2)

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

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


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

您已经添加了一个weight
self.kernel
,但没有在
调用中的任何地方使用它

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


删除行
self.kernel=self.add_weight(…)
应该可以让它工作。

我删除了它,但现在我遇到另一个错误;我已经编辑了这个问题,并将新的错误放在最后。我还将softargmax函数更改为使用tensorflow内置的softargmax函数。我的数据集大小为12000;这就是我认为12000的来源…你的图层指定了一个输出形状
(input\u shape[0],self.output\u dim)
(我猜是
(12000,136)
),但是你的
y
(12000,68,2)
。因此,要么将
call
的输出值重塑为
(12000,68,2)
,要么将
y
重塑为
(12000,136)
。不过,我不太确定这种重塑是否能很好地对应您的损失函数,因为我不知道您(或原始纸张)使用的是什么损失。我只是建议一种克服错误的方法。非常感谢您迄今为止提供的所有帮助。y和调用的输出都是(12000136)-但是我仍然得到“ValueError:Error when check target:expected spatical_soft_argmax_1具有3维,但得到了形状为(12000136)的数组”。。。当我添加一个tf.reforme(filters,[136])来调用(filters是softmax的输出)时,我再次得到了这个错误:
文件/usr/local/lib/python2.7/dist packages/tensorflow/python/framework/tensor\u util.py”,第371行,在make\u tensor\u proto raise ValueError(“无值不受支持”)ValueError:不支持任何值。
我删除了它,但现在又出现另一个错误;我已经编辑了这个问题,并将新的错误放在最后。我还将softargmax函数更改为使用tensorflow内置的softargmax函数。我的数据集大小为12000;这就是我认为12000的来源…你的图层指定了一个输出形状
(input\u shape[0],self.output\u dim)