vs2015调用tensorflow.dll实现mnist识别

1.准备文件

一共需要三个文件,dll文件,lib文件,和tensorflow源码,其中源码指的是build目录底下已经生成过工程文件并成功编译的,因为有很多接下来项目中包含的头文件是在编译之后产生的。准备文件
建议把三个文件放到后面新建的vs2015项目的sln文件所在目录下。

2. 新建vs2015项目, 并配置项目的属性,主要四个部分:

(1) 附加包含目录(添加头文件所在目录)
(2) 附加库目录(添加lib文件所在目录)
(3) 附加依赖项(添加lib文件具体文件名)
(4) 运行时环境(添加dll所在目录)

新建vs2015项目后,右键项目->属性:
项目属性
选择平台,由于我之前编译tensorflow.dll文件时选择的是release64位,因此这里配置平台选择release和x64:
选择平台
接下来是

(1) 附加包含目录(添加头文件所在目录)

点击C/C++ ->附加包含目录 ->编辑:
输入下面的包含目录

C:\eigen
$(SolutionDir)tensorflow-r1.6
$(SolutionDir)tensorflow-r1.6\tensorflow\contrib\cmake\build
$(SolutionDir)tensorflow-r1.6\tensorflow\contrib\cmake\build\protobuf\src\protobuf\src
$(SolutionDir)tensorflow-r1.6\tensorflow\contrib\cmake\build\external\nsync\public
$(SolutionDir)tensorflow-r1.6\tensorflow\contrib\cmake\build\external\eigen_archive

其中C:\eigen表示eigen所在目录,eigen下载地址,下载完成解压即可。
$(SolutionDir)表示项目解决方案sln文件所在目录。
tensorflow-r1.6是tensorflow编译后源码的根目录。

在这里插入图片描述
附加包含目录

(2) 附加库目录(添加lib文件所在目录)

链接器 -> 常规 -> 附加库目录 -> 编辑,输入:

$(SolutionDir)

这里因为tensorflow.lib文件在项目根目录下,所以输入$(SolutionDir),由于项目用到了opencv,因此还要输入opencv的lib所在目录。
附加库目录

(3) 附加依赖项(添加lib文件具体文件名)

链接器 -> 输入 -> 附加依赖项 -> 编辑,步骤与上面的附加库目录相同,输入:

tensorflow.lib

(4) 运行时环境(添加dll所在目录)

配置属性 -> 调试 -> 环境 -> 编辑,输入

path = $(SolutionDir)

运行时环境

3.转换tensorflow模型(ckpt->pb)

一般tensorflow通过saver进行模型保存的时候,会将模型的参数和图结构分开存储。如图:
ckpt格式
其中meta是模型图结构,data是模型权值参数。而pb模型则是将图结构和权值参数绑定到一起,具体来说就是将data里的变量参数转成常量参数写到pb文件中去。那么如何将ckpt格式的模型转换成pb模型呢?
理论和详细介绍参见博客。这里具体讲一下如何实现。

(1)确定输出节点

在转换ckpt文件到pb文件过程中,需要确定输出节点。一般来说,训练模型的源代码里面会定义节点名字。如果没办法获得源码,或者源码里面没有定义节点名字的话,可以通过以下代码加载ckpt格式的模型,打印出所有的节点。

#encoding=utf-8
import tensorflow as tf
input_checkpoint = './model.ckpt'#模型路径
#恢复图的结构
saver = tf.train.import_meta_graph(input_checkpoint + '.meta', clear_devices=True)
 
with tf.Session() as sess:
    saver.restore(sess, input_checkpoint) #恢复图并得到数据
    for op in tf.get_default_graph().get_operations():
        print(op.name, op.values()) #打印节点名字和张量维度信息
        

本项目中mnist模型打印出的节点如图所示(部分):
打印出的节点

tensorflow 每调用一次类似 tf.XXX()函数,就代表了生成一个节点,那么tf.variable()就会生成一个Variable节点,如果调用了很多次,就生成Variable_1,Variable_2…以此类推。
我们看一个简单例子:

#encoding=utf-8
import tensorflow as tf

#下面代码定义了两个constant常量i1和i3,
#两个Variable变量i2和i4
#两个Add操作tf.add_n()

def test_ops():
	#定义命名空间”input1"
	with tf.name_scope("input1"):
		i1 = tf.constant([1.0, 2.0, 3.0],name="input1")

	i2 = tf.Variable(tf.random_uniform([3]))
	i3 = tf.constant([1.0, 2.0, 4.0])
	i4 = tf.Variable(tf.random_uniform([3], name="input2"))

	output = tf.add_n([i1,i2],name = "add")
	output1 = tf.add_n([i3,i4])

	#将图结构写入log,以便tensorboard调用可视化
	writer = tf.summary.FileWriter("./log",tf.get_default_graph())
	writer.close()

test_ops()

可视化节点如下:
可视化节点
每一个 tf.XXX()函数都产生了一个节点,包括tf.random_uniform(),所以i2和i4可以看成是两个节点产生的一个张量。而i1由于定义了名字input,所以没有显示默认的Const节点名,第一个tf.add_n()函数定义了名字“add”所以直接显示名字,第二个add_n()就显示了默认的AddN。

从例子可以看出,我们需要从打印出的所有节点中,根据shape和变量名,推测出最终输出的节点,将推理出该节点的所有节点涉及到的变量固化(常量化)。例如mnist的最终输出肯定是一个维度为(,10)的张量。

### 回答1: tensorflow.keras.datasets.mnist是一个内置的数据集,用于识别手写数字的机器学习任务。该数据集包含了60000张28x28像素的训练图像和10000张测试图像,每张图像都代表一个手写数字(0-9之间)。这个数据集常用于深度学习的图像分类任务。 使用tensorflow.keras.datasets.mnist,可以很方便地加载和使用这个数据集。通过调用load_data()函数,可以将训练和测试数据分别加载到变量中。这些数据已经划分好了训练集和测试集,可以直接用于模型的训练和评估。 加载数据后,可以对图像进行预处理和准备,并构建机器学习模型来识别手写数字。通常,经典的深度学习模型,如卷积神经网络(CNN),在这个任务上表现良好。 在训练模型时,可以使用训练集来调整模型的参数,使其可以准确地预测手写数字。训练集的标签提供了每个图像对应的真实数字,可以用于监督学习。 在模型训练完成后,可以使用测试集来评估模型的性能和准确度。测试集的标签提供了每个测试图像的真实数字,可以与模型的预测结果进行比较,从而得到模型的准确率。 总的来说,tensorflow.keras.datasets.mnist提供了一个方便的方式来获取和使用手写数字数据集,可以用于构建和训练机器学习模型,实现手写数字识别任务。 ### 回答2: tensorflow.keras.datasets.mnist是一个常用的数据集,用于机器学习中数字识别的训练和测试。该数据集包含了60,000个用于训练的手写数字图像和10,000个用于测试的手写数字图像。 这个数据集可以通过tensorflow.keras.datasets模块中的mnist.load_data()函数来加载。这个函数会返回两个元组,分别是训练集和测试集。每个元组都包括了两个numpy数组,一个是图像数组,另一个是对应的标签数组。 训练集包括了60,000个28x28像素的灰度图像,用于训练模型。每个图像数组都是一个形状为(28, 28)的二维numpy数组,表示一个手写数字图像。对应的标签数组是一个形状为(60000,)的一维numpy数组,包含了0到9之间的整数,表示了对应图像的真实数字。 测试集包括了10,000个用于测试模型的手写数字图像,和训练集相似,每个图像数组是一个形状为(28, 28)的二维numpy数组。对应的标签数组是一个形状为(10000,)的一维numpy数组,包含了0到9之间的整数,表示了对应图像的真实数字。 使用这个数据集可以帮助我们训练和评估模型的性能,比如使用卷积神经网络对手写数字进行分类。加载mnist数据集并将其拆分为训练集和测试集后,我们可以使用这些数据来训练模型,并使用测试集来评估模型在未见过的数据上的表现。 总之,tensorflow.keras.datasets.mnist提供了一个方便且广泛使用的手写数字识别数据集,供机器学习研究和实践中使用。 ### 回答3: tensorflow.keras.datasets.mnist是一个常用的数据集,用于机器学习领域中的手写数字识别任务。该数据集包含了60000张28x28像素的训练图像和10000张测试图像。 这个数据集可以通过以下代码导入: ``` (train_images, train_labels), (test_images, test_labels) = tensorflow.keras.datasets.mnist.load_data() ``` 其中train_images和train_labels是训练图像和对应的标签,test_images和test_labels是测试图像和对应的标签。 train_images和test_images都是三维数组,表示图像的像素值。每张图像都由28行28列的像素组成,像素值范围为0-255。 train_labels和test_labels是一维数组,表示图像对应的真实数字标签。标签范围为0-9,分别表示数字0到9。 加载完数据集后,我们可以进行数据预处理,例如将像素值缩放到0-1之间: ``` train_images = train_images / 255.0 test_images = test_images / 255.0 ``` 然后可以使用这些数据来训练机器学习模型,例如使用卷积神经网络进行手写数字识别的训练: ``` model = tensorflow.keras.models.Sequential([ tensorflow.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(28, 28, 1)), tensorflow.keras.layers.MaxPooling2D((2, 2)), tensorflow.keras.layers.Flatten(), tensorflow.keras.layers.Dense(64, activation='relu'), tensorflow.keras.layers.Dense(10, activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(train_images, train_labels, epochs=10) ``` 通过这个数据集和训练示例,我们可以建立一个手写数字识别模型,并用测试集进行评估和预测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值