python 多数表决时Tensorflow性能缓慢

cqoc49vn  于 2022-12-21  发布在  Python
关注(0)|答案(2)|浏览(107)

我在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
0sgqnhkj

0sgqnhkj1#

一些提示,可能会解决您的问题。
1-在创建tensorflow graph之前进行特征提取。例如,如果创建TfIDF特征向量,可以在预处理步骤中进行,并保存numpy作为图形的输入。

input, label = feature_extractor(x, y)

2-删除不必要的session.run()。例如,当您调用Optimizer时,它会自动调用x_transformed。

transformed_x = session.run(input)

3-以更好的方式使用tf.dataDataset API)。没有必要调用sess.run(next_element)。因为next_element是你的图的一部分。

fd3cxomn

fd3cxomn2#

我建议你试试OpenVINO,它允许你把你的模型转换成中间表示(IR),然后在CPU上运行,具有良好的推理加速。OpenVINO针对Intel硬件进行了优化,但它应该可以与任何处理器一起工作。您可以在这里找到笔记本示例MNIST with OpenVINO and Tensorflow on Kaggle。这只是一个代码示例,展示了如何使用OpenVINO优化您的Tensorflow模型,并使用MNIST数据集运行快速推理。您可以轻松地使用PC或笔记本电脑测试性能。这是我用笔记本电脑测试的结果。

安装OpenVINO

最简单的方法是使用PIP。或者,您可以搜索here以找到适合您情况的最佳方法。

#setup the environment
pip install openvino-dev[onnx, tensorflow]

请注意,此“pip install”命令将安装版本〉=1.15.0的Tensorflow。由于您使用的是Tensorflow==1.10,我建议在完成上述安装后再次安装Tensorflow==1.10.0。

为MNIST下载数据集

import tensorflow as tf

mnist = tf.keras.datasets.mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

使用模型优化器转换Tensorflow模型

Model Optimizer是一款命令行工具,来自OpenVINO开发包,因此请确保您已安装它。它可以将您的Tensorflow模型转换为OpenVINO格式(又名IR格式)。它还可以将精度更改为FP16(以进一步提高性能)。

mo --input_model "mnist_model.pb" --input_shape "[1,28,28,1]" --data_type FP16 --output_dir "model_ir" --model_name "mnist_ir"

在CPU上对测试数据集中的前1000个图像运行推断

转换后的模型可以由运行时加载,并针对特定设备进行编译,例如CPU或GPU(集成到您的CPU中,如英特尔Iris Xe显卡)。如果您不知道哪个是最适合您的选择,只需将AUTO设置为device_name。

import time

infer_time = 0

model_xml = "mnist_ir.xml"
model_bin = "mnist_ir.bin"

# Load network to the plugin
ie = Core()
net = ie.read_model(model=model_xml) 
exec_net = ie.compile_model(model=net, device_name="CPU")

del net

#test against the first 1000 images from the dataset
input_list = x_test[:1000]

for input_image in input_list:
    input_layer = next(iter(exec_net.input))
    output_layer = next(iter(exec_net.output))

    start_time = time.time()
    res = exec_net([input_image])[output_layer]
    end_time = time.time()
    infer_time += end_time - start_time

我在笔记本电脑上用CPU运行了推理,1000张MNIST测试图像的推理时间真的很快,不到0.5秒。也许你也可以试试。
免责声明:我在OpenVINO上工作。

相关问题