首页 > 解决方案 > 批量大小未知的 TensorFlow 切片问题

问题描述

我正在尝试获取输入数据的一部分,source. 输入形状是 [?, 512, 6] 并且在输入 LSTM 层时具有这种形状,批量大小未指定。我的神经网络 NN 是非序列的,我需要使用原始输入数据的子集的另一层。具体来说,我想获得source[:, :, feature]wherefeature是一个整数变量。

我可以使用raw = Reshape((512*6,))(source)并传递raw到一个密集层,网络将组装、编译和训练。但是,在使用source数组的子集进行编译时,出现以下错误:

AttributeError: 'NoneType' object has no attribute '_inbound_nodes'

我尝试了一些不同的东西。的原始数据类型source是一个 numpy 数组。一种尝试是使用:

raw = source[:,:,feature]

我相信tf.slice应该能够处理这个问题。使用时我也收到了错误:

raw = tf.slice( source, [0,0,feature], [-1,512,1] )

我试图用它type()来尝试确定哪个是NoneType没有成功的对象。如何获得工作切片?

编辑:我已经能够使用以下方法获得切片并成功添加到模型中:

raw = Lambda(lambda x: x[:,:,feature])(source)

raw = Lambda(lambda x: tf.slice(x, [0,0,feature], [-1,512,1]))(source)

虽然这有效并且模型可以编译,但在尝试保存时出现错误:

TypeError: Not JSON Serializable

我找到了一些讨论这个问题的链接,他们指出问题是其中一个层不是 Keras 层。他们的解决方案涉及使用 Lambda 层来解决问题。我相信我已经能够将问题层隔离为 Lambda 层,据我所知,它是 Keras 层。它是使用以下方式导入的:

from keras.layers import Lambda

标签: pythontensorflow

解决方案


我通过反复试验找到了解决方案。我目前不知道它为什么会起作用。设source为网络的输入数组,形状[?,width,height]和感兴趣的单个feature元素介于0和之间height。首先,我们需要将其展平source,使其具有一维。我相信解决问题的关键在于层,因为尽管类型和相同() ,但Flatten它必须使性质与某些方式flat不同。现在我们可以使用一个层来选择我们想要的特征,基于它在.sourcesourceflat<class 'tensorflow.python.framework.ops.Tensor'>Lambdaflat

flat = Flatten()(source)
subsection = Lambda(lambda x: x[:,feature*width:(1+feature)*width])(flat)

新张量subsection现在可以输入到某个层,网络将正确编译和保存。


推荐阅读