我正在尝试针对二元分类问题训练固定估计器tf.estimator.DNNClassifier
def input_fn_train(features, labels, batch_size):
dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels))
dataset = dataset.shuffle(1000).repeat().batch(batch_size)
return dataset
hidden_units=[1024, 512, 256]
estimator = tf.estimator.DNNClassifier(
feature_columns=my_feature_columns,
hidden_units=hidden_units,
model_dir=model_dir,
optimizer=tf.train.ProximalAdagradOptimizer(
learning_rate=0.01,
l1_regularization_strength=0.001))
estimator.train(input_fn=lambda:input_fn_train(train_x, train_y, batch_size), steps=train_steps)
但是,当我尝试运行estimator.train
时,出现以下错误
[libprotobuf FATAL T:\src\github\tensorflow\cmake_build\protobuf\src\protobuf\src\google\protobuf\message_lite.cc:68] CHECK failed: (byte_size_before_serialization) == (byte_size_after_serialization): tensorflow.GraphDef was modified concurrently during serialization.
我非常确定这与存储在变量train_x
中的CSV训练文件的大小有关,因为我在较小的训练CSV文件(〜500 MB)中尝试了相同的代码,并且效果很好。
我的CSV培训文件有801列(包括标签0或1),这800个要素是介于0和1(浮点数)之间的数值。训练文件具有超过一百万个实例(801 x 1172480),
此外,重要的是要提到train_x
(包含7GB CSV数据的变量)已成功填充内存中的7GB数据。此外,我对内存溢出没有任何问题(我的计算机具有128 GB的内存RAM),因此剩下的唯一一件事是Tensorflow [不幸的是]无法处理该大小的CSV训练文件。
我计划将训练集分成不同的文件,并使用检查点功能对这些文件进行训练,但是我不确定这是否是最佳解决方案,任何建议都将得到赞赏