python - 批量大小未知的 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
解决方案
我通过反复试验找到了解决方案。我目前不知道它为什么会起作用。设source
为网络的输入数组,形状[?,width,height]
和感兴趣的单个feature
元素介于0
和之间height
。首先,我们需要将其展平source
,使其具有一维。我相信解决问题的关键在于层,因为尽管类型和相同() ,但Flatten
它必须使性质与某些方式flat
不同。现在我们可以使用一个层来选择我们想要的特征,基于它在.source
source
flat
<class 'tensorflow.python.framework.ops.Tensor'>
Lambda
flat
flat = Flatten()(source)
subsection = Lambda(lambda x: x[:,feature*width:(1+feature)*width])(flat)
新张量subsection
现在可以输入到某个层,网络将正确编译和保存。
推荐阅读
- nginx - NGINX proxy_pass 返回内容类型的 HTML 而不是内容类型的 JAVASCRIPT
- apache-spark - 如何使用 Pyspark 在 AWS EMR 上向 Glue 添加评论
- angular - 为具有不同 FormGroup 的 FormArray 设置值
- python - (Python、Twitch Bot)在实现 AutoMod 时遇到问题
- ios - 如何在 U+FFFC 字符产生的 UITextVIew 中隐藏字符(图标)
- node.js - 在使用 koa 或 express 组合模块或组合中间件时,调试 typescript 错误的最佳方法是什么?
- php - 如何通过 PHP 在 HTML 站点中放置 WooCommerce 产品框架
- google-colaboratory - Pandas_datareader 和 Google Colab。它应该工作吗?
- ethereum - 为什么我的合同状态没有改变
- python - Boto3 不删除 S3 或数字海洋空间中的对象