如何在TensorFlow中向tf.estimator.inputs.numpy_input_fn传入完整数据集
如何用
tf.estimator.inputs.numpy_input_fn传入完整数据集 嗨,我来帮你搞定这个问题!其实tf.estimator.inputs.numpy_input_fn本身就是为批量数据集设计的,你只需要把整个数据集的特征和标签转换成numpy数组传进去就行,不用单张处理。下面分两种常见情况给你讲具体做法:
情况1:已经把完整数据集加载到numpy数组里
如果你已经通过其他方式(比如PIL、OpenCV)把所有图像和标签都读取到了numpy数组(比如X_train存所有图像,y_train存对应标签),直接把这两个数组传入函数就行:
import tensorflow as tf import numpy as np # 假设X_train是形状为[样本总数, 图像高度, 图像宽度, 通道数]的numpy数组 # 比如(1000, 28, 28, 1)代表1000张28x28的灰度图 # y_train是对应标签的numpy数组,形状可以是[样本总数](单分类)或[样本总数, 类别数](多分类) input_fn = tf.estimator.inputs.numpy_input_fn( x={"x": X_train}, # 这里的"x"要和你的模型输入层名称对应 y=y_train, batch_size=32, # 根据你的硬件和需求设置批次大小 num_epochs=None, # 训练时设为None表示循环遍历数据集;评估时设为1表示只遍历一次 shuffle=True # 训练时打乱数据,评估阶段建议设为False )
情况2:从TensorFlow张量中获取完整数据集
如果你之前是通过TensorFlow的张量(比如从tf.data或者队列中获取的features)来读取数据,那不要单张调用sess.run(features),而是一次性获取整个数据集的numpy数组:
# 假设features和labels是对应整个数据集的TensorFlow张量 with tf.Session() as sess: # 一次性获取全部特征和标签的numpy数组 X_train = sess.run(features) y_train = sess.run(labels) # 再传入numpy_input_fn input_fn = tf.estimator.inputs.numpy_input_fn( x={"x": X_train}, y=y_train, batch_size=32, shuffle=True )
额外提醒
- 确保
X_train的形状符合模型输入要求:比如图像数据通常需要是[样本数, 高, 宽, 通道数],如果是灰度图记得扩展通道维度(可以用np.expand_dims(X_train, axis=-1))。 - 特征数组和标签数组的样本数量必须完全一致,否则会报错。
- 如果你的数据集特别大,一次性加载到内存会占太多资源,这时候更推荐用
tf.data.Dataset来构建输入函数(比numpy_input_fn更高效),举个简单例子:
def custom_input_fn(): # 从numpy数组构建数据集 dataset = tf.data.Dataset.from_tensor_slices(({"x": X_train}, y_train)) # 打乱、分批、重复 dataset = dataset.shuffle(buffer_size=1000).batch(32).repeat() return dataset
内容的提问来源于stack exchange,提问作者Mateusz Kalinowski
相关产品推荐
相关产品推荐

