{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "rX8mhOLljYeM" }, "source": [ "##### Copyright 2019 The TensorFlow Authors." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "cellView": "form", "id": "BZSlp3DAjdYf" }, "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", "# You may obtain a copy of the License at\n", "#\n", "# https://www.apache.org/licenses/LICENSE-2.0\n", "#\n", "# Unless required by applicable law or agreed to in writing, software\n", "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", "# See the License for the specific language governing permissions and\n", "# limitations under the License." ] }, { "cell_type": "markdown", "metadata": { "id": "3wF5wszaj97Y" }, "source": [ "# 针对专业人员的 TensorFlow 2.0 入门" ] }, { "cell_type": "markdown", "metadata": { "id": "DUNzJc4jTj6G" }, "source": [ "\n", " \n", " \n", " \n", " \n", "
在 TensorFlow.org 上查看在 Google Colab 中运行在 GitHub 上查看源代码 下载笔记本\n", "
" ] }, { "cell_type": "markdown", "metadata": { "id": "hiH7AC-NTniF" }, "source": [ "这是一个 [Google Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb) 笔记本(notebook)文件。Python 程序直接在浏览器中运行——这是一种学习和使用 Tensorflow 的好方法。要学习本教程,请单击本页顶部按钮,在 Google Colab 中运行笔记本(notebook).\n", "\n", "1. 在 Colab 中,连接到 Python 运行时:在菜单栏右上角,选择*连接(CONNECT)*。\n", "2. 运行所有笔记本(notebook)代码单元格:选择*运行时(Runtime)* > *运行所有(Run all)*。" ] }, { "cell_type": "markdown", "metadata": { "id": "eOsVdx6GGHmU" }, "source": [ "下载并安装 TensorFlow 2。将 TensorFlow 导入您的程序:\n", "\n", "注:升级 `pip` 以安装 TensorFlow 2 软件包。请参阅[安装指南](https://tensorflow.google.cn/install)了解详细信息。" ] }, { "cell_type": "markdown", "metadata": { "id": "QS7DDTiZGRTo" }, "source": [ "将 Tensorflow 导入您的程序:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "0trJmd6DjqBZ" }, "outputs": [], "source": [ "import tensorflow as tf\n", "print(\"TensorFlow version:\", tf.__version__)\n", "\n", "from tensorflow.keras.layers import Dense, Flatten, Conv2D\n", "from tensorflow.keras import Model" ] }, { "cell_type": "markdown", "metadata": { "id": "7NAbSZiaoJ4z" }, "source": [ "加载并准备 [MNIST 数据集](http://yann.lecun.com/exdb/mnist/)。" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "JqFRS6K07jJs" }, "outputs": [], "source": [ "mnist = tf.keras.datasets.mnist\n", "\n", "(x_train, y_train), (x_test, y_test) = mnist.load_data()\n", "x_train, x_test = x_train / 255.0, x_test / 255.0\n", "\n", "# Add a channels dimension\n", "x_train = x_train[..., tf.newaxis].astype(\"float32\")\n", "x_test = x_test[..., tf.newaxis].astype(\"float32\")" ] }, { "cell_type": "markdown", "metadata": { "id": "k1Evqx0S22r_" }, "source": [ "使用 `tf.data` 来将数据集切分为 batch 以及混淆数据集:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "8Iu_quO024c2" }, "outputs": [], "source": [ "train_ds = tf.data.Dataset.from_tensor_slices(\n", " (x_train, y_train)).shuffle(10000).batch(32)\n", "\n", "test_ds = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32)" ] }, { "cell_type": "markdown", "metadata": { "id": "BPZ68wASog_I" }, "source": [ "使用 Keras [模型子类化 API](https://tensorflow.google.cn/guide/keras/custom_layers_and_models) 构建 `tf.keras` 模型:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "h3IKyzTCDNGo" }, "outputs": [], "source": [ "class MyModel(Model):\n", " def __init__(self):\n", " super(MyModel, self).__init__()\n", " self.conv1 = Conv2D(32, 3, activation='relu')\n", " self.flatten = Flatten()\n", " self.d1 = Dense(128, activation='relu')\n", " self.d2 = Dense(10)\n", "\n", " def call(self, x):\n", " x = self.conv1(x)\n", " x = self.flatten(x)\n", " x = self.d1(x)\n", " return self.d2(x)\n", "\n", "# Create an instance of the model\n", "model = MyModel()" ] }, { "cell_type": "markdown", "metadata": { "id": "uGih-c2LgbJu" }, "source": [ "为训练选择优化器与损失函数: " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "u48C9WQ774n4" }, "outputs": [], "source": [ "loss_object = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)\n", "\n", "optimizer = tf.keras.optimizers.Adam()" ] }, { "cell_type": "markdown", "metadata": { "id": "JB6A1vcigsIe" }, "source": [ "选择衡量指标来度量模型的损失值(loss)和准确率(accuracy)。这些指标在 epoch 上累积值,然后打印出整体结果。" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "N0MqHFb4F_qn" }, "outputs": [], "source": [ "train_loss = tf.keras.metrics.Mean(name='train_loss')\n", "train_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name='train_accuracy')\n", "\n", "test_loss = tf.keras.metrics.Mean(name='test_loss')\n", "test_accuracy = tf.keras.metrics.SparseCategoricalAccuracy(name='test_accuracy')" ] }, { "cell_type": "markdown", "metadata": { "id": "ix4mEL65on-w" }, "source": [ "使用 `tf.GradientTape` 来训练模型:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "OZACiVqA8KQV" }, "outputs": [], "source": [ "@tf.function\n", "def train_step(images, labels):\n", " with tf.GradientTape() as tape:\n", " # training=True is only needed if there are layers with different\n", " # behavior during training versus inference (e.g. Dropout).\n", " predictions = model(images, training=True)\n", " loss = loss_object(labels, predictions)\n", " gradients = tape.gradient(loss, model.trainable_variables)\n", " optimizer.apply_gradients(zip(gradients, model.trainable_variables))\n", "\n", " train_loss(loss)\n", " train_accuracy(labels, predictions)" ] }, { "cell_type": "markdown", "metadata": { "id": "Z8YT7UmFgpjV" }, "source": [ "测试模型:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "xIKdEzHAJGt7" }, "outputs": [], "source": [ "@tf.function\n", "def test_step(images, labels):\n", " # training=False is only needed if there are layers with different\n", " # behavior during training versus inference (e.g. Dropout).\n", " predictions = model(images, training=False)\n", " t_loss = loss_object(labels, predictions)\n", "\n", " test_loss(t_loss)\n", " test_accuracy(labels, predictions)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "i-2pkctU_Ci7" }, "outputs": [], "source": [ "EPOCHS = 5\n", "\n", "for epoch in range(EPOCHS):\n", " # Reset the metrics at the start of the next epoch\n", " train_loss.reset_states()\n", " train_accuracy.reset_states()\n", " test_loss.reset_states()\n", " test_accuracy.reset_states()\n", "\n", " for images, labels in train_ds:\n", " train_step(images, labels)\n", "\n", " for test_images, test_labels in test_ds:\n", " test_step(test_images, test_labels)\n", "\n", " print(\n", " f'Epoch {epoch + 1}, '\n", " f'Loss: {train_loss.result()}, '\n", " f'Accuracy: {train_accuracy.result() * 100}, '\n", " f'Test Loss: {test_loss.result()}, '\n", " f'Test Accuracy: {test_accuracy.result() * 100}'\n", " )" ] }, { "cell_type": "markdown", "metadata": { "id": "T4JfEh7kvx6m" }, "source": [ "该图片分类器现在在此数据集上训练得到了接近 98% 的准确率(accuracy)。要了解更多信息,请阅读 [TensorFlow 教程](https://tensorflow.google.cn/tutorials/keras)。" ] } ], "metadata": { "accelerator": "GPU", "colab": { "collapsed_sections": [], "name": "advanced.ipynb", "toc_visible": true }, "kernelspec": { "display_name": "Python 3", "name": "python3" } }, "nbformat": 4, "nbformat_minor": 0 }