将 numpy uint8 送入 tensorflow float32 占位符

Feeding numpy uint8 into tensorflow float32 placeholder

我最近发现了一个概念验证实现,它使用 numpy.zeros:

在单热编码中准备特征
data = np.zeros((len(raw_data), n_input, vocab_size),dtype=np.uint8)

从上面可以看出,单个的输入为np.uint8。 检查模型后,我意识到tensorflow模型的输入占位符定义为tf.float32:

x = tf.placeholder(tf.float32, [None, n_input, vocab_size], name="onehotin")

我的具体问题: tensorflow 如何处理这种 "mismatch" 的输入类型。这些值 (0/1) 是否由 tensorflow 正确解释或转换。如果是这样,这是文档中提到的某个地方吗?谷歌搜索后我找不到答案。应该提到的是,模型运行和值似乎是合理的。但是,将输入的 numpy 特征键入 np.float32 会导致需要大量内存。

相关性: 运行 但错误训练的模型在采用输入管道/将模型投入生产后会表现不同。

Tensorflow 支持这样的 dtype 转换。

x + 1 等操作中,值 1 通过 tf.convert_to_tensor 函数进行验证和转换。该函数有时会在后台手动调用,当设置 dtype 参数时,该值会自动转换为这种类型。

当您将数组输入这样的占位符时:

session.run(..., feed_dict={x: data})

... 数据通过 np.asarray 调用显式转换为正确类型的 numpy 数组。请参阅 python/client/session.py 处的源代码。请注意,当 dtype 不同时,此方法 可能会重新分配缓冲区 ,而这正是您的情况。所以你的内存优化并没有像你预期的那样工作:临时的 32 位 data 是内部分配的。