我在Tensorflow 1.10上实现了一个多数投票算法(计算不同分类器的预测),对于预测大小为1000的数据集(MNIST)来说,速度非常慢(10个分类器需要3个多小时)。根据我的猜测,这是因为session.run在我的代码中经常调用www.example.com(),但我如何优化它呢?
def majority_voting(session, x, y):
votes = []
for i in range(number_of_ensemble_modules):
# run the training
feature_extractor = iterators[i][3]
input, label = feature_extractor(x, y)
transformed_x = session.run(input)
ensemble_prediction = nn_models[0][i][0][3]
prediction = session.run(ensemble_prediction, feed_dict={X: transformed_x, Y: y})
votes.append(prediction[0])
nearest_k_y, idx, vote = tf.unique_with_counts(tf.convert_to_tensor(votes, tf.int64))
majority = tf.argmax(vote)
predict_res = tf.gather(nearest_k_y, majority)
return predict_res
def calculate_ensemble_accuracy():
accuracy = 0
for j in range(voting_iterations):
accuracy += 0
(features, labels) = session.run(next_element)
vote = majority_voting(session, features, labels)
correct_label = session.run(tf.argmax(labels, axis=1))
if vote == correct_label[0]:
accuracy += 1
return accuracy
2条答案
按热度按时间0sgqnhkj1#
一些提示,可能会解决您的问题。
1-在创建
tensorflow graph
之前进行特征提取。例如,如果创建TfIDF
特征向量,可以在预处理步骤中进行,并保存numpy作为图形的输入。2-删除不必要的
session.run()
。例如,当您调用Optimizer时,它会自动调用x_transformed。3-以更好的方式使用
tf.data
(Dataset API)。没有必要调用sess.run(next_element)
。因为next_element
是你的图的一部分。fd3cxomn2#
我建议你试试OpenVINO,它允许你把你的模型转换成中间表示(IR),然后在CPU上运行,具有良好的推理加速。OpenVINO针对Intel硬件进行了优化,但它应该可以与任何处理器一起工作。您可以在这里找到笔记本示例MNIST with OpenVINO and Tensorflow on Kaggle。这只是一个代码示例,展示了如何使用OpenVINO优化您的Tensorflow模型,并使用MNIST数据集运行快速推理。您可以轻松地使用PC或笔记本电脑测试性能。这是我用笔记本电脑测试的结果。
安装OpenVINO
最简单的方法是使用PIP。或者,您可以搜索here以找到适合您情况的最佳方法。
请注意,此“pip install”命令将安装版本〉=1.15.0的Tensorflow。由于您使用的是Tensorflow==1.10,我建议在完成上述安装后再次安装Tensorflow==1.10.0。
为MNIST下载数据集
使用模型优化器转换Tensorflow模型
Model Optimizer是一款命令行工具,来自OpenVINO开发包,因此请确保您已安装它。它可以将您的Tensorflow模型转换为OpenVINO格式(又名IR格式)。它还可以将精度更改为FP16(以进一步提高性能)。
在CPU上对测试数据集中的前1000个图像运行推断
转换后的模型可以由运行时加载,并针对特定设备进行编译,例如CPU或GPU(集成到您的CPU中,如英特尔Iris Xe显卡)。如果您不知道哪个是最适合您的选择,只需将AUTO设置为device_name。
我在笔记本电脑上用CPU运行了推理,1000张MNIST测试图像的推理时间真的很快,不到0.5秒。也许你也可以试试。
免责声明:我在OpenVINO上工作。