Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow 自定义Keras层的未定义输出形状_Tensorflow_Keras_Keras Layer - Fatal编程技术网

Tensorflow 自定义Keras层的未定义输出形状

Tensorflow 自定义Keras层的未定义输出形状,tensorflow,keras,keras-layer,Tensorflow,Keras,Keras Layer,我正在编写一个自定义Keras层,它将除输入的最后一个维度外的所有维度都展平。但是,当将层的输出馈送到下一层时,会发生错误,因为层的输出形状在所有维度上都是None 类展平层(层): """ 采用nD张量展平中间尺寸,忽略边缘尺寸。 [n,x,y,z]->[n,xy,z] """ 定义初始(自我,**kwargs): 超级(扁平层,自).\uuuu初始化(**kwargs) def构建(自我,输入_形状): 超级(扁平层,自我)。构建(输入形状) def呼叫(自我,输入): 输入形状=tf.形状

我正在编写一个自定义Keras层,它将除输入的最后一个维度外的所有维度都展平。但是,当将层的输出馈送到下一层时,会发生错误,因为层的输出形状在所有维度上都是
None

类展平层(层):
"""
采用nD张量展平中间尺寸,忽略边缘尺寸。
[n,x,y,z]->[n,xy,z]
"""
定义初始(自我,**kwargs):
超级(扁平层,自).\uuuu初始化(**kwargs)
def构建(自我,输入_形状):
超级(扁平层,自我)。构建(输入形状)
def呼叫(自我,输入):
输入形状=tf.形状(输入)
扁平=tf。重塑(
投入,
tf.stack([
-1, 
K.prod(输入_形[1:-1]),
输入_形[-1]
] )
)
返回平面
def计算输出形状(自身、输入形状):
如果不是全部(输入_形[1:]):
raise VALUE ERROR('将输入的形状设置为“展平”'
“未完全定义”
"(得到"str(input_shape[1:])","str"(input_shape[1:])34
'确保传递完整的“输入形状”'
'或第一个的“批处理输入形状”参数'
“模型中的图层。”)
输出形状=(
输入_形[0],
np.prod(输入_形[1:-1]),
输入_形[-1]
)
返回输出波形

例如,当一个密集层出现时,我收到错误
ValueError:应该定义密集输入的最后一个维度。找不到任何文件。

为什么要将
tf.stack()
放在新的形状中?要展平除最后一个维度以外的所有维度;这就是你可以做到的:

将tensorflow导入为tf
从tensorflow.keras.layers导入图层
将numpy作为np导入
类别图层(图层):
定义初始(自我,**kwargs):
超级(展平层,自我)。\uuuuu初始化(**kwargs)
def构建(自我,输入_形状):
超级(扁平层,自我)。构建(输入形状)
def呼叫(自我,输入):
新形状=自计算输出形状(tf形状(输入))
返回tf.重塑(输入,新形状)
def计算输出形状(自身、输入形状):
新建形状=(输入形状[0]*输入形状[1]*输入形状[2],
输入_形[3])
返回新的形状
使用单个数据点进行测试(
tf.\uuuuuu版本=1.13.1'
):

inputs=tf.keras.layers.Input(形状=(10,10,1))
res=tf.keras.layers.Conv2D(过滤器=3,内核大小=2)(输入)
res=平坦层()(res)
模型=tf.keras.models.model(输入=输入,输出=恢复)
x_data=np.random.normal(大小=(1,10,10,1))
使用tf.Session()作为sess:
sess.run(tf.global\u variables\u initializer())
evaled=model.outputs[0].eval({model.inputs[0]:x_data})
打印(evaled.shape)#(81,3)

我有
堆栈
,因为我在修改前面使用它的示例。谢谢你的意见。我刚刚尝试在Google Colab上运行您的代码,但在下面的
self.compute\u output\u shape
TypeError:无法将类型的对象转换为Tensor。目录:。将铸造元素考虑为支持类型。< /代码>我正在运行TF V1.1.1。此外,将自定义层馈送到另一个层时会出现错误,而不是像您在示例中所做的那样,将自定义层馈送到另一个层时会出现错误。您确定正在运行完全相同的示例吗?复制粘贴此精确代码并删除所有其他代码,然后重新加载运行时。您可能向模型的输入传递了错误的变量。您是正确的。这是运行时的问题。我得到了我的层与你的代码作为一个例子的帮助下工作,谢谢你。然而,我似乎仍然不理解为什么我的原始代码不起作用,因为我现在正在为另一个自定义层处理同样的问题。您能否详细说明一下如何确保自定义图层输出所有相关的形状信息。1。不能将
np.prod()
与从
tf.shape()获取的参数一起使用。2.新形状的计算不正确。像我一样计算新的形状-明确地在产品中写入每个元素而不进行切片。3.如果将结果形状送入致密层,则其必须具有二维。在代码中有3个维度。第一个维度可以是未定义的(
None
),但第二个维度不能是
None
,因为它决定了权重矩阵的第一个维度。