如何将Tensorflow数据集API与训练集和验证集一起使用

如何将Tensorflow数据集API与训练集和验证集一起使用,tensorflow,dataset,Tensorflow,Dataset,手头的简单任务:运行N个历元的训练,在每个历元后计算精确的验证精度。历元大小可以等于完整的训练集,也可以等于某个预定义的迭代次数。在验证过程中,每个验证集输入必须精确评估一次 对于该任务,将一次性迭代器、可初始化迭代器和/或句柄混合在一起的最佳方法是什么 以下是我认为它应该如何工作的脚手架: def build_training_dataset(): 通过 def生成验证数据集(): 通过 def构造列车运行(数据集): 通过 def magic(迭代器): 通过 使用\自定义\历元\大小=真

手头的简单任务:运行N个历元的训练,在每个历元后计算精确的验证精度。历元大小可以等于完整的训练集,也可以等于某个预定义的迭代次数。在验证过程中,每个验证集输入必须精确评估一次

对于该任务,将一次性迭代器、可初始化迭代器和/或句柄混合在一起的最佳方法是什么

以下是我认为它应该如何工作的脚手架:

def build_training_dataset():
通过
def生成验证数据集():
通过
def构造列车运行(数据集):
通过
def magic(迭代器):
通过
使用\自定义\历元\大小=真
自定义\u历元\u大小=60
最大纪元=100
training_dataset=构建_training_dataset()
验证\数据集=生成\验证\数据集()
#Magic在这里构建了一个很好的单实例数据集
数据集=魔术(训练数据集、验证数据集)
列车运行=构造列车运行(数据集)
#运行N个遍历训练数据集的时间段,然后是
#验证数据集。
使用tf.Session()作为sess:
对于MAX_历元中的历元:
#训练
如果使用\u自定义\u历元\u大小:
对于范围内的(自定义大小):
列车运行(列车运行)
其他:
尽管如此:
#我想smth是这样的:
尝试:
列车运行(列车运行)
除了tf.errors.OutOfRangeError:
我们的时代结束了
#验证
验证\u预测=[]
尽管如此:
尝试:
np.append(验证预测,sess.run(训练操作))#但这次是为了验证
除了tf.errors.OutOfRangeError:
打印('历元%d已完成,精度为:%f'(历元验证\u.mean())
打破
由于解决方案比我预期的要混乱得多,因此它分为两个阶段:

0)两个示例共享的辅助代码:

USE\u CUSTOM\u EPOCH\u SIZE=True
自定义\u历元\u大小=60
最大纪元=100
列车尺寸=500
验证大小=145
批量大小=64
def构造列车运行(批次):
返回批次
def build_train_数据集():
返回tf.data.Dataset.range(列大小)\
.map(λx:x+tf.random_uniform([],-10,10,tf.int64))\
.批次(批次大小)
def生成测试数据集():
返回tf.data.Dataset.range(验证大小)\
.批次(批次大小)
1) 对于等于列车数据集大小的历元:

#数据集构造
训练\u数据集=构建\u训练\u数据集()
验证\数据集=构建\测试\数据集()
#处理构造。Handle允许我们通过在feed_dict中提供一个参数来从不同的数据集馈送数据
handle=tf.placeholder(tf.string,shape=[])
迭代器=tf.data.iterator.from_string_句柄(句柄、training_dataset.output_类型、training_dataset.output_形状)
下一个元素=迭代器。获取下一个元素()
列车运行=构造列车运行(下一个元素)
training_iterator=training_dataset.make_initializable_iterator()
validation_iterator=validation_dataset.make_initializable_iterator()
使用tf.Session()作为sess:
training\u handle=sess.run(training\u iterator.string\u handle())
validation\u handle=sess.run(validation\u iterator.string\u handle())
对于范围内的历元(最大历元):
#训练
sess.run(训练迭代器初始化器)
列车中的列车总数=0
尽管如此:
尝试:
列车输出=sess.run(列车运行,馈送指令={handle:training\u handle})
列车中的列车总数+=len(列车输出)
除了tf.errors.OutOfRangeError:
断言列车中的列车总数==列车大小
我们的时代结束了
#验证
验证\u预测=[]
运行(验证迭代器初始化器)
尽管如此:
尝试:
pred=sess.run(train\u op,feed\u dict={handle:validation\u handle})
验证预测=np.append(验证预测,pred)
除了tf.errors.OutOfRangeError:
断言len(验证预测)=验证大小
打印('历元%d已完成,精度为:%f'(历元,np.平均值(验证\u预测)))
打破
2) 对于自定义纪元大小:

#数据集构造
训练数据集=构建训练数据集()。重复()#更改1
验证\数据集=构建\测试\数据集()
#处理构造。Handle允许我们通过在feed_dict中提供一个参数来从不同的数据集馈送数据
handle=tf.placeholder(tf.string,shape=[])
迭代器=tf.data.iterator.from_string_句柄(句柄、training_dataset.output_类型、training_dataset.output_形状)
下一个元素=迭代器。获取下一个元素()
列车运行=构造列车运行(下一个元素)
training_iterator=training_数据集。使_one_shot_iterator()更改2
validation_iterator=validation_dataset.make_initializable_iterator()
使用tf.Session()作为sess:
training\u handle=sess.run(training\u iterator.string\u handle())
validation\u handle=sess.run(validation\u iterator.string\u handle())
对于范围内的历元(最大历元):
#训练
#更改3:不初始化,不尝试/捕获
对于范围内的(自定义大小):
列车输出=sess.run(列车运行,馈送指令={handle:training\u handle})
#验证
验证\u预测=[]
运行(验证迭代器初始化器)
尽管如此:
尝试:
pred=sess.run(train\u op,feed\u dict={handle:validation\u handle})
验证预测=np.append(验证预测,pred)
除了tf.errors.OutOfRangeError:
断言len(验证预测)=验证大小
打印('历元%d已完成,精度为:%f'(历元,np.平均值(验证\u预测)))
打破

您确定需要重新初始化培训吗