diff --git a/tensorflow2fluid/vgg_translate_tutorial.ipynb b/tensorflow2fluid/vgg_translate_tutorial.ipynb index b77fcaf160e1aae8192e01e39899e38e2944f61b..b6e4c3d0ca8f69af77b87090e4e07c6a500fc665 100644 --- a/tensorflow2fluid/vgg_translate_tutorial.ipynb +++ b/tensorflow2fluid/vgg_translate_tutorial.ipynb @@ -12,7 +12,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -45,7 +45,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -62,12 +62,14 @@ "source": [ "### 保存模型为checkpoint格式\n", "\n", - "tensorflow2fluid目前支持checkpoint格式的模型或者是将网络结构和参数序列化的pb格式模型,上面下载的`vgg_16.ckpt`仅仅存储了模型参数,因此我们需要重新加载参数,并将网络结构和参数一起保存为checkpoint模型" + "tensorflow2fluid目前支持checkpoint格式的模型或者是将网络结构和参数序列化的pb格式模型,上面下载的`vgg_16.ckpt`仅仅存储了模型参数,因此我们需要重新加载参数,并将网络结构和参数一起保存为checkpoint模型\n", + "\n", + "**注意:下面的代码里,运行TensorFlow模型和将TensorFlow模型转换为PaddlePaddle模型,依赖TensorFlow**" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -107,12 +109,28 @@ "source": [ "### 将模型转换为PaddlePaddle模型\n", "\n", - "注意:部分OP在转换时,需要将参数写入文件;或者是运行tensorflow模型进行infer,获取tensor值。两种情况下均会消耗一定的时间用于IO或计算,对于后一种情况,建议转换模型时将`use_cuda`参数设为`True`,加快infer速度" + "**注意**:部分OP在转换时,需要将参数写入文件;或者是运行tensorflow模型进行infer,获取tensor值。两种情况下均会消耗一定的时间用于IO或计算,对于后一种情况,建议转换模型时将`use_cuda`参数设为`True`,加快infer速度\n", + "\n", + "可以通过下面的**模型转换python脚本**在代码中设置参数,在python脚本中进行模型转换。或者一般可以通过如下的命令行方式进行转换,\n", + "``` python\n", + "# 通过命令行也可进行模型转换\n", + "python tf2fluid/convert.py --meta_file checkpoint/model.meta --ckpt_dir checkpoint \\\n", + " --in_nodes inputs --input_shape None,224,224,3 \\\n", + " --output_nodes vgg_16/fc8/squeezed --use_cuda True \\\n", + " --input_format NHWC --save_dir paddle_model\n", + "```" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 模型转换python脚本" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -246,7 +264,9 @@ "metadata": {}, "source": [ "### 加载转换后的PaddlePaddle模型,并进行预测\n", - "**需要注意,转换后的PaddlePaddle CV模型输入格式为NCHW**" + "需要注意的是,转换后的PaddlePaddle CV模型**输入格式为NCHW**\n", + "\n", + "**注意:下面代码用于运行转换后的PaddlePaddle模型,并与TensorFlow计算结果对比diff,因此依赖PaddlePaddle**" ] }, { @@ -254,8 +274,8 @@ "execution_count": 1, "metadata": { "ExecuteTime": { - "end_time": "2019-03-14T10:18:46.124339Z", - "start_time": "2019-03-14T10:18:40.858372Z" + "end_time": "2019-03-15T05:51:40.544737Z", + "start_time": "2019-03-15T05:51:27.857863Z" } }, "outputs": [], @@ -263,7 +283,7 @@ "import numpy\n", "import tf2fluid.model_loader as ml\n", "\n", - "model = ml.ModelLoader(\"paddle_model\", use_cuda=True)\n", + "model = ml.ModelLoader(\"paddle_model\", use_cuda=False)\n", "\n", "numpy.random.seed(13)\n", "data = numpy.random.rand(5, 224, 224, 3).astype(\"float32\")\n", @@ -287,8 +307,8 @@ "execution_count": 2, "metadata": { "ExecuteTime": { - "end_time": "2019-03-14T10:20:13.611132Z", - "start_time": "2019-03-14T10:20:13.598874Z" + "end_time": "2019-03-15T05:52:02.126718Z", + "start_time": "2019-03-15T05:52:02.115849Z" } }, "outputs": [ @@ -296,7 +316,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "3.33786e-06\n" + "6.67572e-06\n" ] } ], @@ -315,15 +335,15 @@ "### 需要注意的点\n", "1. 转换后的模型需要注意输入格式,PaddlePaddle中输入格式需为NCHW格式 \n", "2. 此例中不涉及到输入中间层,如卷积层的输出,需要了解的是PaddlePaddle中的卷积层输出,卷积核的`shape`与Tensorflow有差异 \n", - "3. 模型转换完后,检查转换前后模型的diff,在本例中,最大diff为3.34-e06,满足转换需求 " + "3. 模型转换完后,检查转换前后模型的diff,在本例中,测试得到的最大diff满足转换需求 " ] } ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python [conda env:GPU-Paddle]", "language": "python", - "name": "python2" + "name": "conda-env-GPU-Paddle-py" }, "language_info": { "codemirror_mode": {