TensorFlow介紹與安裝

1. 介紹

首先讓我們來看看TensorFlow!

但是在我們開始之前,我們先來看看Python API中的TensorFlow代碼,這樣你就可以感受到我們?cè)趺醋龅摹?/p>

這段很短的 Python 程序生成了一些三維數(shù)據(jù), 然后用一個(gè)平面擬合它。

import tensorflow as tf
import numpy as np

# Create 100 phony x, y data points in NumPy, y = x * 0.1 + 0.3
x_data = np.random.rand(100).astype(np.float32)
y_data = x_data * 0.1 + 0.3

# Try to find values for W and b that compute y_data = W * x_data + b
# (We know that W should be 0.1 and b 0.3, but TensorFlow will
# figure that out for us.)
W = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
b = tf.Variable(tf.zeros([1]))
y = W * x_data + b

# Minimize the mean squared errors.
loss = tf.reduce_mean(tf.square(y - y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)
train = optimizer.minimize(loss)

# Before starting, initialize the variables.  We will 'run' this first.
init = tf.global_variables_initializer()

# Launch the graph.
sess = tf.Session()
sess.run(init)

# Fit the line.
for step in range(201):
    sess.run(train)
    if step % 20 == 0:
        print(step, sess.run(W), sess.run(b))

# Learns best fit is W: [0.1], b: [0.3]

# Close the Session when we're done.
sess.close()

該代碼的第一部分構(gòu)建了數(shù)據(jù)流圖。在創(chuàng)建會(huì)話并run 調(diào)用該函數(shù)之前,TensorFlow實(shí)際上不會(huì)運(yùn)行任何計(jì)算。

為了進(jìn)一步提高您的興趣,我們建議您在TensorFlow中學(xué)習(xí)常見的機(jī)器學(xué)習(xí)問題。在神經(jīng)網(wǎng)絡(luò)的領(lǐng)域上,最經(jīng)典的問題是MNIST手寫數(shù)字分類問題。我們?cè)谶@里為機(jī)器學(xué)習(xí)新手專業(yè)人士分別提供了兩種教程。

如果您已經(jīng)確定要學(xué)習(xí)并安裝TensorFlow,可以跳過這些步驟,直接閱讀后面的章節(jié)。
不用擔(dān)心,我們會(huì)使用MNIST做為技術(shù)教程的示例來闡述TensorFlow的特性,所以您仍然可以看到MNIST。

2. 下載與安裝

您可以從我們提供的二進(jìn)制包或github源安裝TensorFlow。

要求

TensorFlow支持Python 2.7和Python 3.3+。

GPU版本最好使用Cuda Toolkit 8.0和cuDNN v5。只有從源代碼安裝時(shí),才支持其他版本(Cuda工具包> = 7.0和cuDNN> = v3)。有關(guān)詳細(xì)信息,請(qǐng)參閱Cuda安裝。對(duì)于Mac OS X,請(qǐng)參閱安裝GPU for Mac

概述

你可以使用我們提供的 Pip, Docker, Virtualenv, Anaconda 或 源碼編譯的方法安裝 TensorFlow。

如果您熟悉Pip,Virtualenv,Anaconda或Docker,請(qǐng)隨時(shí)根據(jù)您的需求進(jìn)行調(diào)整。
如果遇到安裝錯(cuò)誤,請(qǐng)參閱常見問題的解決方案。

基于Pip安裝

Pip是用于安裝和管理用Python編寫的軟件包的軟件包管理系統(tǒng)。我們?cè)贚inux,Mac OS X和Windows上為TensorFlow提供pip軟件包。有關(guān)Windows的說明,請(qǐng)參閱Windows上的Pip安裝

首先安裝 pip (或 Python3 的 pip3 ):

# Ubuntu/Linux 64-bit
$ sudo apt-get install python-pip python-dev

# Mac OS X
$ sudo easy_install pip
$ sudo easy_install --upgrade six

我們也將CPU版本的二進(jìn)制文件上傳到Pypi,因此您可以簡(jiǎn)單地在Linux,Mac或Windows上pip安裝TensorFlow:

$ pip install tensorflow

請(qǐng)注意,您的pip版本需要在8.1或更高版本才能讓上述命令在Linux上工作。

對(duì)于Windows用戶,您還可以使用以下方式安裝GPU版本的二進(jìn)制文件: bash $ pip install tensorflow-gpu
由于其大小超過Pypi限制,所以此命令尚不適用于在Linux或Mac安裝GPU版本的二進(jìn)制文件。

如果上述命令不能在您的系統(tǒng)上運(yùn)行,或者您想在Linux或Mac上安裝GPU版本的二進(jìn)制文件,則可以按照以下步驟進(jìn)行操作:

# Ubuntu/Linux 64-bit, CPU only, Python 2.7
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.12.0rc1-cp27-none-linux_x86_64.whl

# Ubuntu/Linux 64-bit, GPU enabled, Python 2.7
# Requires CUDA toolkit 8.0 and CuDNN v5. For other versions, see "Installing from sources" below.
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-0.12.0rc1-cp27-none-linux_x86_64.whl

# Mac OS X, CPU only, Python 2.7:
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-0.12.0rc1-py2-none-any.whl

# Mac OS X, GPU enabled, Python 2.7:
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/gpu/tensorflow_gpu-0.12.0rc1-py2-none-any.whl

# Ubuntu/Linux 64-bit, CPU only, Python 3.4
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.12.0rc1-cp34-cp34m-linux_x86_64.whl

# Ubuntu/Linux 64-bit, GPU enabled, Python 3.4
# Requires CUDA toolkit 8.0 and CuDNN v5. For other versions, see "Installing from sources" below.
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-0.12.0rc1-cp34-cp34m-linux_x86_64.whl

# Ubuntu/Linux 64-bit, CPU only, Python 3.5
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.12.0rc1-cp35-cp35m-linux_x86_64.whl

# Ubuntu/Linux 64-bit, GPU enabled, Python 3.5
# Requires CUDA toolkit 8.0 and CuDNN v5. For other versions, see "Installing from sources" below.
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-0.12.0rc1-cp35-cp35m-linux_x86_64.whl

# Mac OS X, CPU only, Python 3.4 or 3.5:
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-0.12.0rc1-py3-none-any.whl

# Mac OS X, GPU enabled, Python 3.4 or 3.5:
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/gpu/tensorflow_gpu-0.12.0rc1-py3-none-any.whl

安裝TensorFlow:

# Python 2
$ sudo pip install --upgrade $TF_BINARY_URL

# Python 3
$ sudo pip3 install --upgrade $TF_BINARY_URL

注意:如果之前安裝過 TensorFlow < 0.7.1 的版本,應(yīng)該先使用 pip uninstall 卸載 TensorFlow 和 protobuf ,保證獲取的是一個(gè)最新 protobuf 依賴下的安裝包。

安裝完成之后,您就可以測(cè)試您的安裝是否成功了。

在Windows上Pip安裝

TensorFlow在Windows上僅支持64位Python 3.5。我們已經(jīng)使用以下Python版本測(cè)試了pip軟件包:

注意:TensorFlow要求MSVCP140.DLL文件,它可能不會(huì)安裝在您的系統(tǒng)上。如果當(dāng)您import tensorflow as tf遇到錯(cuò)誤No module named "_pywrap_tensorflow"和/或DLL load failed,請(qǐng)檢查MSVCP140.DLL是否在您的%PATH%,如果不是,您應(yīng)該安裝Visual C ++ 2015可再發(fā)行組件 (x64版本)。

下面兩種命令進(jìn)行pip安裝。

只是安裝CPU版本的TensorFlow,請(qǐng)?jiān)诿钐崾痉螺斎胍韵旅睿?code>C:\> pip install --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-0.12.0rc1-cp35-cp35m-win_amd64.whl

要安裝GPU版本的TensorFlow,請(qǐng)?jiān)诿钐崾痉螺斎胍韵旅睿?code>C:\> pip install --upgrade https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow_gpu-0.12.0rc1-cp35-cp35m-win_amd64.whl

安裝完成之后,您就可以測(cè)試您的安裝是否成功了。

您還可以使用Virtualenv或Anaconda環(huán)境來管理在Windows上安裝TensorFlow。

基于Virtualenv安裝

Virtualenv是為不同Python項(xiàng)目創(chuàng)建一個(gè)隔離的容器的工具。利用Virtualenv安裝TensorFlow不會(huì)影響原先存在的的Python環(huán)境。

使用Virtualenv安裝步驟如下:

  • 安裝pip和Virtualenv。
  • 創(chuàng)建一個(gè)Virtualenv環(huán)境。
  • 激活Virtualenv環(huán)境并在其中安裝TensorFlow。
  • 安裝完成后,您將在每次要使用TensorFlow時(shí)激活Virtualenv環(huán)境。

安裝pip和Virtualenv:

# Ubuntu/Linux 64-bit
$ sudo apt-get install python-pip python-dev python-virtualenv

# Mac OS X
$ sudo easy_install pip
$ sudo pip install --upgrade virtualenv

在目錄中創(chuàng)建一個(gè)Virtualenv環(huán)境~/tensorflow:

$ virtualenv --system-site-packages ~/tensorflow

激活環(huán)境:

$ source ~/tensorflow/bin/activate  # If using bash
$ source ~/tensorflow/bin/activate.csh  # If using csh
(tensorflow)$  # Your prompt should change

最后,Pip安裝TensorFlow。

首先選擇正確的二進(jìn)制文件進(jìn)行安裝:

# Ubuntu/Linux 64-bit, CPU only, Python 2.7
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.12.0rc1-cp27-none-linux_x86_64.whl

# Ubuntu/Linux 64-bit, GPU enabled, Python 2.7
# Requires CUDA toolkit 8.0 and CuDNN v5. For other versions, see "Installing from sources" below.
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-0.12.0rc1-cp27-none-linux_x86_64.whl

# Mac OS X, CPU only, Python 2.7:
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-0.12.0rc1-py2-none-any.whl

# Mac OS X, GPU enabled, Python 2.7:
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/gpu/tensorflow_gpu-0.12.0rc1-py2-none-any.whl

# Ubuntu/Linux 64-bit, CPU only, Python 3.4
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.12.0rc1-cp34-cp34m-linux_x86_64.whl

# Ubuntu/Linux 64-bit, GPU enabled, Python 3.4
# Requires CUDA toolkit 8.0 and CuDNN v5. For other versions, see "Installing from sources" below.
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-0.12.0rc1-cp34-cp34m-linux_x86_64.whl

# Ubuntu/Linux 64-bit, CPU only, Python 3.5
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.12.0rc1-cp35-cp35m-linux_x86_64.whl

# Ubuntu/Linux 64-bit, GPU enabled, Python 3.5
# Requires CUDA toolkit 8.0 and CuDNN v5. For other versions, see "Installing from sources" below.
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-0.12.0rc1-cp35-cp35m-linux_x86_64.whl

# Mac OS X, CPU only, Python 3.4 or 3.5:
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-0.12.0rc1-py3-none-any.whl

# Mac OS X, GPU enabled, Python 3.4 or 3.5:
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/gpu/tensorflow_gpu-0.12.0rc1-py3-none-any.whl

最后安裝TensorFlow:

# Python 2
(tensorflow)$ pip install --upgrade $TF_BINARY_URL

# Python 3
(tensorflow)$ pip3 install --upgrade $TF_BINARY_URL

在Virtualenv環(huán)境激活后,您現(xiàn)在可以測(cè)試您的安裝。

當(dāng)您完成使用TensorFlow后,停用環(huán)境。

(tensorflow)$ deactivate

$  # Your prompt should change back

要使用TensorFlow,您將需要再次激活Virtualenv環(huán)境:

$ source ~/tensorflow/bin/activate  # If using bash.
$ source ~/tensorflow/bin/activate.csh  # If using csh.
(tensorflow)$  # Your prompt should change.
# Run Python programs that use TensorFlow.
...
# When you are done using TensorFlow, deactivate the environment.
(tensorflow)$ deactivate

基于Anaconda安裝

Anaconda是一個(gè)集成許多第三方科學(xué)計(jì)算庫的 Python 科學(xué)計(jì)算環(huán)境。Anaconda使用一個(gè)名為“conda”的包管理器,它具有與Virtualenv相似的環(huán)境系統(tǒng)

與Virtualenv一樣,不同Python 工程需要的依賴包,conda 將他們存儲(chǔ)在不同的地方。利用Anconda安裝TensorFlow不會(huì)影響原先存在的的Python環(huán)境。

  • 安裝Anaconda。
  • 創(chuàng)建一個(gè)conda環(huán)境。
  • 激活conda環(huán)境并在其中安裝TensorFlow。
  • 安裝完成后,每次要使用TensorFlow時(shí),都需要激活環(huán)境。
  • 可選地將ipython和其他軟件包安裝到conda環(huán)境中。

安裝Anaconda:

按照Anaconda下載站點(diǎn)上的說明進(jìn)行操作。

注意:如果已經(jīng)通過Anaconda環(huán)境以外的pip安裝TensorFlow,但想在Anaconda環(huán)境中使用TensorFlow,就需要先卸載之前在環(huán)境以外的利用pip安裝的TensorFlow,因?yàn)锳naconda從.local更高優(yōu)先級(jí)搜索系統(tǒng)site-packages 。

Python 2

$ pip uninstall tensorflow

Python 3

$ pip3 uninstall tensorflow 

創(chuàng)建一個(gè)名為tensorflow的conda環(huán)境:

# Python 2.7
$ conda create -n tensorflow python=2.7

# Python 3.4
$ conda create -n tensorflow python=3.4

# Python 3.5
$ conda create -n tensorflow python=3.5

激活環(huán)境,并在其中使用conda或pip安裝TensorFlow。

使用conda

目前只有CPU版本的TensorFlow可用,可以安裝在Python 2或Python 3的conda環(huán)境中。

$ source activate tensorflow
(tensorflow)$  # Your prompt should change

# Linux/Mac OS X, Python 2.7/3.4/3.5, CPU only:
(tensorflow)$ conda install -c conda-forge tensorflow

使用pip

如果使用pip進(jìn)行安裝,請(qǐng)確保使用--ignore-installed選項(xiàng)來防止出現(xiàn)easy_install的錯(cuò)誤提示。

$ source activate tensorflow
(tensorflow)$  # Your prompt should change

現(xiàn)在,像普通Pip安裝一樣安裝TensorFlow。首先選擇正確的二進(jìn)制文件進(jìn)行安裝:

# Ubuntu/Linux 64-bit, CPU only, Python 2.7
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.12.0rc1-cp27-none-linux_x86_64.whl

# Ubuntu/Linux 64-bit, GPU enabled, Python 2.7
# Requires CUDA toolkit 8.0 and CuDNN v5. For other versions, see "Installing from sources" below.
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-0.12.0rc1-cp27-none-linux_x86_64.whl

# Mac OS X, CPU only, Python 2.7:
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-0.12.0rc1-py2-none-any.whl

# Mac OS X, GPU enabled, Python 2.7:
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/gpu/tensorflow_gpu-0.12.0rc1-py2-none-any.whl

# Ubuntu/Linux 64-bit, CPU only, Python 3.4
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.12.0rc1-cp34-cp34m-linux_x86_64.whl

# Ubuntu/Linux 64-bit, GPU enabled, Python 3.4
# Requires CUDA toolkit 8.0 and CuDNN v5. For other versions, see "Installing from sources" below.
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-0.12.0rc1-cp34-cp34m-linux_x86_64.whl

# Ubuntu/Linux 64-bit, CPU only, Python 3.5
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.12.0rc1-cp35-cp35m-linux_x86_64.whl

# Ubuntu/Linux 64-bit, GPU enabled, Python 3.5
# Requires CUDA toolkit 8.0 and CuDNN v5. For other versions, see "Installing from sources" below.
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-0.12.0rc1-cp35-cp35m-linux_x86_64.whl

# Mac OS X, CPU only, Python 3.4 or 3.5:
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-0.12.0rc1-py3-none-any.whl

# Mac OS X, GPU enabled, Python 3.4 or 3.5:
(tensorflow)$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/gpu/tensorflow_gpu-0.12.0rc1-py3-none-any.whl

最后安裝TensorFlow:

# Python 2
(tensorflow)$ pip install --ignore-installed --upgrade $TF_BINARY_URL

# Python 3
(tensorflow)$ pip3 install --ignore-installed --upgrade $TF_BINARY_URL

使用方法

在環(huán)境環(huán)境激活后,您現(xiàn)在可以測(cè)試您的安裝。

當(dāng)您完成使用TensorFlow后,退出環(huán)境。

(tensorflow)$ source deactivate

$  # Your prompt should change back

要使用TensorFlow,您需要重新激活conda環(huán)境:

$ source activate tensorflow
(tensorflow)$  # Your prompt should change.
# Run Python programs that use TensorFlow.
...
# When you are done using TensorFlow, deactivate the environment.
(tensorflow)$ source deactivate

安裝IPython

要使用帶有IPython的TensorFlow環(huán)境,可能需要將IPython安裝到環(huán)境中:

$ source activate tensorflow
(tensorflow)$ conda install ipython

同樣,像pandas一樣的其他Python包可能需要安裝到環(huán)境中才能與TensorFlow一起使用。

Docker安裝

Docker是一種在Linux操作系統(tǒng)上運(yùn)行的自建版本的虛擬機(jī)。當(dāng)您通過Docker安裝和運(yùn)行TensorFlow時(shí),將與機(jī)器上預(yù)先安裝存在的包完全隔離。

我們提供4個(gè)Docker鏡像:

  • gcr.io/tensorflow/tensorflow:TensorFlow CPU二進(jìn)制鏡像。
  • gcr.io/tensorflow/tensorflow:latest-develCPU二進(jìn)制鏡像加源碼。
  • gcr.io/tensorflow/tensorflow:latest-gpu:TensorFlow GPU二進(jìn)制鏡像。
  • gcr.io/tensorflow/tensorflow:latest-devel-gpu:GPU二進(jìn)制鏡像加源代碼。

我們也有標(biāo)簽latest替換為已發(fā)布的版本(例如, 0.12.0-rc1-gpu)。

Docker的安裝如下:

  • 在您的機(jī)器上安裝Docker。
  • 創(chuàng)建一個(gè)Docker group以允許啟動(dòng)容器。
  • 啟動(dòng)包含TensorFlow映像的Docker容器。首次啟動(dòng)時(shí),鏡像會(huì)自動(dòng)下載。

有關(guān)在您的計(jì)算機(jī)上安裝Docker的說明,請(qǐng)參閱安裝Docker

Docker安裝完成后,啟動(dòng)包含TensorFlow映像的Docker容器。

$ docker run -it -p 8888:8888 gcr.io/tensorflow/tensorflow

該選項(xiàng)-p 8888:8888用于將Docker容器內(nèi)部端口發(fā)布到主機(jī),在這種情況下可以確保Jupyter notebook的連接。

端口映射的格式是hostPort:containerPort。您可以為主機(jī)端口指定任何有效的端口號(hào),但必須將8888用于容器端口部分。

如果您正在使用具有GPU支持的容器,則必須傳遞一些附加選項(xiàng)來將GPU設(shè)備公開到容器。

NVidia GPU支持安裝最新的NVidia驅(qū)動(dòng)程序和nvidia-docker

$ nvidia-docker run -it -p 8888:8888 gcr.io/tensorflow/tensorflow:latest-gpu

如果您運(yùn)行nvidia-docker有任何問題,就使用默認(rèn)配置運(yùn)行,我們會(huì)在安裝位置中植入一個(gè)帶選項(xiàng)的腳本,如下列命令行所示的。

$ path/to/repo/tensorflow/tools/docker/docker_run_gpu.sh -p 8888:8888 gcr.io/tensorflow/tensorflow:latest-gpu

有關(guān)詳細(xì)信息,請(qǐng)參閱TensorFlow docker readme

您現(xiàn)在可以在Docker容器內(nèi)測(cè)試您的安裝了。

測(cè)試TensorFlow的安裝

啟用GPU支持(LINUX,選項(xiàng))

如果您安裝了TensorFlow的GPU版本,還必須安裝Cuda Toolkit 8.0和cuDNN v5。請(qǐng)看Cuda安裝

您還需要設(shè)置LD_LIBRARY_PATH和CUDA_HOME環(huán)境變量。將以下命令添加到您的~/.bash_profile文件中。下面的命令假設(shè)您的CUDA安裝在/usr/local/cuda目錄下:

export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64"
export CUDA_HOME=/usr/local/cuda

從命令行運(yùn)行TensorFlow

如果發(fā)生錯(cuò)誤,請(qǐng)參閱常見問題

打開terminal并鍵入以下內(nèi)容:

$ python
...
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a + b))
42
>>>

從源代碼安裝

從源代碼安裝時(shí),您將構(gòu)建一個(gè)pip wheel,然后使用pip安裝。

Windows上從源代碼安裝TensorFlow,您可以在Windows上使用BazelTensorFlow CMake build的支持。

克隆TensorFlow倉庫

$ git clone https://github.com/tensorflow/tensorflow

請(qǐng)注意,上述代碼將安裝主分支上最新的TensorFlow。如果要安裝特定的分支(如發(fā)行版分支),請(qǐng)傳遞-b <branchname>給git clone命令和--recurse-submodules給TensorFlow所依賴的r0.8及更早版本的protobuf庫。

Linux環(huán)境準(zhǔn)備

安裝Bazel

首先按照教程安裝bazel的依賴。然后下載適合您操作系統(tǒng)的最新穩(wěn)定版的bazel,最后按照下面腳本執(zhí)行:

$ chmod +x PATH_TO_INSTALL.SH
$ ./PATH_TO_INSTALL.SH --user

注意把 PATH_TO_INSTALL.SH 替換為你下載的安裝包的文件路徑。

安裝其他依賴

# For Python 2.7:
$ sudo apt-get install python-numpy python-dev python-wheel python-mock
# For Python 3.x:
$ sudo apt-get install python3-numpy python3-dev python3-wheel python3-mock

可選:安裝CUDA(在Linux上啟用GPU支持)

為了編譯并運(yùn)行具有GPU支持的TensorFlow,需要安裝NVIDIA的Cuda Toolkit(>=7.0)和cuDNN(>=v3)。

TensorFlow GPU支持需要具有NVIDIA計(jì)算能力(> = 3.0)的GPU卡。支持的顯卡包括:

  • NVidia Titan

  • NVidia Titan X

  • NVidia K20

  • NVidia K40

...

檢查您的GPU卡的NVIDIA計(jì)算能力:https://developer.nvidia.com/cuda-gpus

下載并安裝Cuda Toolkit:https://developer.nvidia.com/cuda-downloads

如果使用的是二進(jìn)制版本,請(qǐng)安裝8.0版。

安裝Toolkit到如下路徑:/usr/local/cuda。

下載并安裝cuDNN:https://developer.nvidia.com/cudnn

下載cuDNN v5。

解壓縮并將cuDNN文件復(fù)制到Toolkit目錄中。假設(shè)安裝了Toolkit到/usr/local/cuda,請(qǐng)運(yùn)行以下命令(cuDNN版本設(shè)置為您下載的版本):

tar xvzf cudnn-8.0-linux-x64-v5.1-ga.tgz
sudo cp -P cuda/include/cudnn.h /usr/local/cuda/include/
sudo cp -P cuda/lib64/libcudnn* /usr/local/cuda/lib64/
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

可選:安裝OpenCL(僅限實(shí)驗(yàn)和Linux系統(tǒng))

為了通過OpenCL支持構(gòu)建或運(yùn)行TensorFlow,需要安裝OpenCL(> = 1.2)和ComputeCpp(> = 0.1.1)。

TensorFlow只能利用支持OpenCL 1.2的加速器。支持的加速器包括:

  • AMD Fiji

  • AMD Hawaii

...

請(qǐng)注意,此支持目前是實(shí)驗(yàn)性的,生產(chǎn)不應(yīng)依賴于它(后去會(huì)逐漸成熟)。

下載并安裝OpenCL驅(qū)動(dòng)程序

安裝所需功能的OpenCL取決于你的環(huán)境。在Unbuntu 14.04,正常按照以下步驟進(jìn)行安裝:

sudo apt-get install ocl-icd-opencl-dev opencl-headers

您還需要為加速器本身安裝驅(qū)動(dòng)程序。我們已經(jīng)測(cè)試了在Ubuntu 14.04上安裝以下的AMD Fiji和Hawaii GPU驅(qū)動(dòng)程序:

sudo apt-get install fglrx-core fglrx-dev
下載并安裝ComputeCpp編譯器

Codeplay的網(wǎng)站下載編譯器,解壓縮并將文件復(fù)制到如下的路徑/usr/local/computecpp:

tar -xvzf ComputeCpp-CE-0.1.1-Ubuntu.14.04-64bit.tar.gz
sudo mkdir /usr/local/computecpp
sudo cp -R ComputeCpp-CE-0.1.1-Linux /usr/local/computecpp
sudo chmod -R a+r /usr/local/computecpp/
sudo chmod -R a+x /usr/local/computecpp/bin

Mac環(huán)境準(zhǔn)備

我們建議使用homebrew來安裝bazel依賴項(xiàng),并使用easy_install或pip安裝python依賴項(xiàng)。

依賴

按照這里的說明安裝bazel的依賴項(xiàng)。然后可以使用homebrew來安裝bazel:

$ brew install bazel

您可以使用easy_install或pip安裝python依賴項(xiàng)。使用easy_install。

$ sudo easy_install -U six
$ sudo easy_install -U numpy
$ sudo easy_install wheel

我們還推薦使用IPython。

$ sudo easy_install ipython

可選:為Mac設(shè)置GPU支持

如果您打算構(gòu)建GPU支持,則需要確保您通過homebrew安裝GNU coreutils:

$ brew install coreutils

接下來,您將需要確保您已經(jīng)安裝了CUDA Toolkit。需要從NVIDIA或使用Homebrew Cask擴(kuò)展下載適用于您的OSX版本的軟件包 :

$ brew tap caskroom/cask
$ brew cask install cuda

一旦安裝了CUDA Toolkit,您將需要添加以下內(nèi)容到~/.bash_profile文件中來設(shè)置所需的環(huán)境變量:

export CUDA_HOME=/usr/local/cuda
export DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:$CUDA_HOME/lib"
export PATH="$CUDA_HOME/bin:$PATH"

最后,您還將安裝CUDA Deep Neural Network (cuDNN v5)庫。一旦您下載它到本地,您可以解壓縮并將根目錄和庫移動(dòng)到本地的CUDA Toolkit文件夾:

$ sudo mv include/cudnn.h /Developer/NVIDIA/CUDA-8.0/include/
$ sudo mv lib/libcudnn* /Developer/NVIDIA/CUDA-8.0/lib
$ sudo ln -s /Developer/NVIDIA/CUDA-8.0/lib/libcudnn* /usr/local/cuda/lib/

要驗(yàn)證CUDA安裝,您可以構(gòu)建并運(yùn)行deviceQuery以確保安裝成功。

$ cp -r /usr/local/cuda/samples ~/cuda-samples
$ pushd ~/cuda-samples
$ make
$ popd
$ ~/cuda-samples/bin/x86_64/darwin/release/deviceQuery

如果需要編譯TensorFlow需要Xcode 7.3并且安裝了CUDA 7.5,但是需要注意的是,Xcode 7.3尚不兼容CUDA 7.5。所以您可以升級(jí)到CUDA 8.0,或者安裝并設(shè)置Xcode 7.2為默認(rèn)值:

$ sudo xcode-select -s /Application/Xcode-7.2/Xcode.app

配置安裝

從源碼樹的根路徑運(yùn)行configure腳本。配置腳本時(shí)候會(huì)詢問您的Python解釋器的路徑,并允許(可選)配置CUDA庫。

此步驟用于定位python和numpy的頭文件。如果您安裝了支持CUDA的GPU和Toolkit,則支持構(gòu)建GPU支持。當(dāng)提示是否構(gòu)建TensorFlow的GPU支持,選擇Y選項(xiàng)。

例如:

$ ./configure
Please specify the location of python. [Default is /usr/bin/python]:
Do you wish to build TensorFlow with Google Cloud Platform support? [y/N] N
No Google Cloud Platform support will be enabled for TensorFlow
Do you wish to build TensorFlow with GPU support? [y/N] y
Do you wish to build TensorFlow with OpenCL support? [y/N] N
GPU support will be enabled for TensorFlow
Please specify which gcc nvcc should use as the host compiler. [Default is /usr/bin/gcc]:
Please specify the Cuda SDK version you want to use, e.g. 7.0. [Leave empty to use system default]: 8.0
Please specify the location where CUDA 8.0 toolkit is installed. Refer to README.md for more details. [Default is /usr/local/cuda]:
Please specify the cuDNN version you want to use. [Leave empty to use system default]: 5
Please specify the location where cuDNN 5 library is installed. Refer to README.md for more details. [Default is /usr/local/cuda]:
Please specify a list of comma-separated Cuda compute capabilities you want to build with.
You can find the compute capability of your device at: https://developer.nvidia.com/cuda-gpus.
Please note that each additional compute capability significantly increases your build time and binary size.

Setting up Cuda include
Setting up Cuda lib
Setting up Cuda bin
Setting up Cuda nvvm
Setting up CUPTI include
Setting up CUPTI lib64
Configuration finished

這將創(chuàng)建一個(gè)規(guī)范的符號(hào)鏈接到您的Cuda庫。每次您更改Cuda路徑時(shí),您需要在調(diào)用bazel構(gòu)建命令之前再次運(yùn)行此步驟。對(duì)于cuDNN庫,R3使用“7.0”,R4使用“4.0.7”。

如果需要構(gòu)建對(duì)OpenCL的支持,請(qǐng)?jiān)跇?gòu)建TensorFlow時(shí)選擇OpenCL支持,并提供ComputeCpp編譯器的位置(例如/usr/local/computecpp)。

已知的問題

  • 盡管可以在同一個(gè)源碼樹下編譯開啟 Cuda 支持和禁用 Cuda 支持的版本, 我們還是推薦在 在切換這兩種不同的編譯配置時(shí), 使用 "bazel clean" 清理環(huán)境.。

  • 在執(zhí)行 bazel 編譯前必須先運(yùn)行 configure, 否則編譯會(huì)失敗并提示錯(cuò)誤信息. 未來, 我們可能考慮將 configure 步驟包含在編譯過程中, 以簡(jiǎn)化整個(gè)過程, 前提是 bazel 能夠提供新的特性支持這樣。

創(chuàng)建pip包并安裝

從源代碼構(gòu)建時(shí),您仍然會(huì)構(gòu)建一個(gè)pip包并進(jìn)行安裝。

請(qǐng)注意,默認(rèn)情況下,源的構(gòu)建需要大量內(nèi)存資源,如果要限制RAM使用情況,可以在調(diào)用bazel時(shí)添加--local_resources 2048,.5,1.0。

$ bazel build -c opt //tensorflow/tools/pip_package:build_pip_package

# To build with GPU support:
$ bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package

$ bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

# The name of the .whl file will depend on your platform.
$ sudo pip install /tmp/tensorflow_pkg/tensorflow-0.12.0rc1-py2-none-any.whl

優(yōu)化CPU性能

為了與盡可能廣泛的機(jī)器兼容,TensorFlow默認(rèn)僅在x86機(jī)器上使用SSE4.1 SIMD指令。大多數(shù)現(xiàn)代的PC和Mac支持更高級(jí)的指令,所以如果你正在構(gòu)建一個(gè)只能在自己的機(jī)器上運(yùn)行的二進(jìn)制文件,那么你可以通過--copt=-march=native在你的bazel build命令中使用這些二進(jìn)制文件 。例如:

$ bazel build --copt=-march=native -c opt //tensorflow/tools/pip_package:build_pip_package

如果您正在分發(fā)二進(jìn)制文件但知道要運(yùn)行的計(jì)算機(jī)的功能,則可以手動(dòng)選擇正確的說明--copt=-march=avx。例如,您可能還想使用多個(gè)參數(shù)啟用多個(gè)功能 --copt=-mavx2 --copt=-mfma。

如果在不支持SIMD的計(jì)算機(jī)上運(yùn)行使用SIMD指令構(gòu)建的二進(jìn)制文件,則執(zhí)行該代碼時(shí)會(huì)發(fā)現(xiàn)非法指令錯(cuò)誤。

設(shè)置TensorFlow的發(fā)展

如果您正在使用TensorFlow,則可以在交互式python shell中測(cè)試更改,而無需重新安裝TensorFlow。

要設(shè)置TensorFlow的所有文件從鏈接到系統(tǒng)目錄,請(qǐng)?jiān)赥ensorFlow根目錄下運(yùn)行以下命令:

bazel build -c opt //tensorflow/tools/pip_package:build_pip_package

# To build with GPU support:
bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package

mkdir _python_build
cd _python_build
ln -s ../bazel-bin/tensorflow/tools/pip_package/build_pip_package.runfiles/org_tensorflow/* .
ln -s ../tensorflow/tools/pip_package/* .
python setup.py develop

請(qǐng)注意,此設(shè)置仍需要您在每次更改C ++文件時(shí)重建//tensorflow/tools/pip_package:build_pip_package目標(biāo);添加,刪除或移動(dòng)任何python文件; 或者更改bazel構(gòu)建規(guī)則。

還要注意,bazel test并不總是通過這些符號(hào)鏈接正確解決依賴關(guān)系,因此測(cè)試結(jié)果可能不可靠。解決方法是_python_build在運(yùn)行之前刪除bazel test目錄。

訓(xùn)練您的第一個(gè)TensorFlow神經(jīng)網(wǎng)絡(luò)模型

首先從GitHub 克隆TensorFlow models repo。運(yùn)行以下命令:

$ cd models/tutorials/image/mnist
$ python convolutional.py
Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.
Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.
Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.
Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.
Extracting data/train-images-idx3-ubyte.gz
Extracting data/train-labels-idx1-ubyte.gz
Extracting data/t10k-images-idx3-ubyte.gz
Extracting data/t10k-labels-idx1-ubyte.gz
Initialized!
Epoch 0.00
Minibatch loss: 12.054, learning rate: 0.010000
Minibatch error: 90.6%
Validation error: 84.6%
Epoch 0.12
Minibatch loss: 3.285, learning rate: 0.010000
Minibatch error: 6.2%
Validation error: 7.0%
...
...

常見問題

GPU 相關(guān)問題

如果在嘗試運(yùn)行一個(gè) TensorFlow 程序時(shí)出現(xiàn)以下錯(cuò)誤:

ImportError: libcudart.so.7.0: cannot open shared object file: No such file or directory

請(qǐng)確認(rèn)你正確安裝了GPU支持。

Protobuf庫相關(guān)問題

TensorFlow的pip包依賴于protobuf 3.1.0版本的pip軟件包。可以從PyPI(運(yùn)行時(shí)pip install protobuf)下載的Protobuf的pip軟件包,Python能利用它實(shí)現(xiàn)原型序列化/反序列化的,它比C ++實(shí)現(xiàn)慢10倍到50倍。Protobuf還支持包含基于快速C ++的原語解析的Python包的二進(jìn)制擴(kuò)展。此擴(kuò)展在只有Python標(biāo)準(zhǔn)的PIP包中不可用。我們?yōu)閜rotobuf創(chuàng)建了一個(gè)包含二進(jìn)制擴(kuò)展名的自定義二進(jìn)制pip包。按照以下說明安裝自定義二進(jìn)制protobuf pip軟件包:

# Ubuntu/Linux 64-bit:
$ pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/protobuf-3.0.0-cp27-none-linux_x86_64.whl

# Mac OS X:
$ pip install --upgrade https://storage.googleapis.com/tensorflow/mac/cpu/protobuf-3.0.0-cp27-cp27m-macosx_10_11_x86_64.whl

對(duì)于Python 3.5

# Ubuntu/Linux 64-bit:
$ pip3 install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/protobuf-3.0.0-cp35-cp35m-linux_x86_64.whl

# Mac OS X:
$ pip3 install --upgrade https://storage.googleapis.com/tensorflow/mac/cpu/protobuf-3.0.0-cp35-cp35m-macosx_10_11_x86_64.whl

如果您的系統(tǒng)/配置未列在上面,您可以使用以下說明來構(gòu)建您自己的protobuf wheel文件。安裝之前,請(qǐng)參閱這里

然后:

$ git clone https://github.com/google/protobuf.git
$ cd protobuf
$ ./autogen.sh
$ CXXFLAGS="-fPIC -g -O2" ./configure
$ make -j12
$ export PROTOC=$PWD/src/protoc
$ cd python
$ python setup.py bdist_wheel --cpp_implementation --compile_static_extension
$ pip uninstall protobuf
$ pip install dist/<wheel file name>

在安裝TensorFlow之后,通過pip安裝上面的軟件包,因?yàn)闃?biāo)準(zhǔn)地進(jìn)行pip安裝tensorflow,只能安裝python支持的pip軟件包。上述pip包將覆蓋現(xiàn)有的protobuf包。
請(qǐng)注意,二進(jìn)制pip包最大支持已經(jīng)大于64MB的protobuf,應(yīng)該修復(fù)以下錯(cuò)誤:

[libprotobuf ERROR google/protobuf/src/google/protobuf/io/coded_stream.cc:207] A
protocol message was rejected because it was too big (more than 67108864 bytes).
To increase the limit (or to disable these warnings), see
CodedInputStream::SetTotalBytesLimit() in google/protobuf/io/coded_stream.h.

Pip安裝問題

Cannot import name 'descriptor'

ImportError: Traceback (most recent call last):
  File "/usr/local/lib/python3.4/dist-packages/tensorflow/core/framework/graph_pb2.py", line 6, in <module>
    from google.protobuf import descriptor as _descriptor
ImportError: cannot import name 'descriptor'

如果升級(jí)到較新版本的TensorFlow時(shí)出現(xiàn)上述錯(cuò)誤,請(qǐng)嘗試卸載TensorFlow和protobuf(如果已安裝)并重新安裝TensorFlow(也請(qǐng)安裝正確的protobuf依賴項(xiàng))。

找不到setup.py

如果,在pip install,你遇到錯(cuò)誤如下:

...
IOError: [Errno 2] No such file or directory: '/tmp/pip-o6Tpui-build/setup.py'

解決方案:升級(jí)您的PIP版本:

pip install --upgrade pip

這可能需要sudo,取決于以前如何安裝PIP的。

SSLError:SSL_VERIFY_FAILED

如果在從網(wǎng)址安裝pip的過程中遇到如下錯(cuò)誤:

...
SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed

解決方案:通過curl或wget手動(dòng)下載wheel文件,并在本地pip安裝。

Operation not permitted

...
Installing collected packages: setuptools, protobuf, wheel, numpy, tensorflow
Found existing installation: setuptools 1.1.6
Uninstalling setuptools-1.1.6:
Exception:
...
[Errno 1] Operation not permitted: '/tmp/pip-a1DXRT-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/_markerlib'

解決方案:在pip命令中添加--ignore-installed選項(xiàng)。

Cannot remove entries from nonexistent file: easy-install.pth

Cannot remove entries from nonexistent file <path-to-anaconda-instalation>/anaconda[version]/lib/site-packages/easy-install.pth
  1. 升級(jí)安裝工具:pip install --upgrade -I setuptools

  2. 安裝TensorFlow再添加--ignore-installed選項(xiàng):pip install --ignore-installed --upgrade <tensorflow_url>

步驟1可能已經(jīng)解決了問題,但如果問題仍然存在,請(qǐng)執(zhí)行步驟2。

在 Linux 上

如果出現(xiàn)錯(cuò)誤:

...
 "__add__", "__radd__",
             ^
SyntaxError: invalid syntax

解決方案: 確認(rèn)正在使用的 Python 版本為 Python 2.7.

在 Mac OS X 上

如果出現(xiàn)錯(cuò)誤:

import six.moves.copyreg as copyreg
ImportError: No module named copyreg

解決方案: TensorFlow 使用的 protobuf 依賴 six-1.10.0. 但是, Apple 的默認(rèn) python 環(huán)境 已經(jīng)安裝了 six-1.4.1, 該版本可能很難升級(jí). 這里提供幾種方法來解決該問題:

  • 升級(jí)全系統(tǒng)的 six:
$ sudo easy_install -U six
  • 通過隔離環(huán)境安裝TensorFlow:

使用VIRTUALENV或者使用Docker安裝。

  • 通過Homebrew或 MacPorts安裝隔離的Python環(huán)境,并在該版本的Python中重新安裝TensorFlow。

3. 基本用法

使用 TensorFlow, 你必須明白 TensorFlow:

  • 使用圖(graph)來表示計(jì)算任務(wù)

  • 在被稱之為會(huì)話(Session)的上下文(context)中執(zhí)行圖

  • 使用 tensor 表示數(shù)據(jù)

  • 通過變量(Variable)維護(hù)狀態(tài)

  • 使用feed和fetch可以為任意的操作(arbitrary operation)賦值或者從其中獲取數(shù)據(jù)

概述

TensorFlow是一個(gè)編程系統(tǒng),使用圖(graph)來表示計(jì)算任務(wù)。圖中的節(jié)點(diǎn)稱為op(operation)。一個(gè)op取零個(gè)或多個(gè)Tensors來執(zhí)行計(jì)算,并產(chǎn)生零個(gè)或多個(gè)Tensors。在TensorFlow術(shù)語中,一個(gè)Tensor是一個(gè)類型化的多維數(shù)組。例如,您可以將一小組的圖像表示為一個(gè)4維的浮點(diǎn)數(shù)數(shù)組,這4個(gè)維度分別是[batch, height, width, channels]。

一個(gè)TensorFlow圖(graph)描述了計(jì)算的過程。為了進(jìn)行計(jì)算圖(graph)必須在會(huì)話(Session)中啟動(dòng)。一個(gè)會(huì)話(Session)將圖(graph)的ops分發(fā)到諸如GPUs或者CPUs的設(shè)備上,同時(shí)提供執(zhí)行op的方法。這些方法后,將產(chǎn)生的tensor返回。在Python中,返回的tensor是numpy的ndarry對(duì)象;在C或者C++中,返回的tensor是tensorflow::Tensor 實(shí)例。

計(jì)算圖(graph)

TensorFlow 程序通常被組織成一個(gè)構(gòu)建階段和一個(gè)執(zhí)行階段。 在構(gòu)建階段,op的執(zhí)行步驟被描述成一個(gè)圖(graph),在執(zhí)行階段, 使用會(huì)話執(zhí)行執(zhí)行圖中的op。

例如, 通常在構(gòu)建階段創(chuàng)建一個(gè)圖(graph)來表示和訓(xùn)練神經(jīng)網(wǎng)絡(luò), 然后在執(zhí)行階段反復(fù)執(zhí)行圖(graph)中的訓(xùn)練op。

TensorFlow支持C,C++,Python編程語言。目前,TensorFlow的Python 庫更加易用,它提供了大量的輔助函數(shù)來簡(jiǎn)化構(gòu)建圖的工作,但這些函數(shù)尚未被C和C++庫支持。

三種語言的會(huì)話庫(session libraries)是一樣的。

構(gòu)建圖(graph)

構(gòu)建圖(graph)的第一步是創(chuàng)建一個(gè)不需要任何輸入的源op,力圖常量(constant)。源op的輸出傳遞給其它op進(jìn)行計(jì)算。

Python庫中的op構(gòu)造函數(shù)返回表示構(gòu)造的ops的輸出的對(duì)象。您可以將這些作為輸入傳遞給其他op構(gòu)造函數(shù)。

Python的TensorFlow庫有一個(gè)默認(rèn)圖(default graph),op構(gòu)造器可以為其增加節(jié)點(diǎn)。這個(gè)默認(rèn)圖對(duì)許多程序來說已經(jīng)足夠用了。閱讀Graph類文檔來了解如何管理多個(gè)圖。

import tensorflow as tf

# Create a constant op that produces a 1x2 matrix.  The op is
# added as a node to the default graph.
#
# The value returned by the constructor represents the output
# of the constant op.
matrix1 = tf.constant([[3., 3.]])

# Create another constant that produces a 2x1 matrix.
matrix2 = tf.constant([[2.],[2.]])

# Create a matmul op that takes 'matrix1' and 'matrix2' as inputs.
# The returned value, 'product', represents the result of the matrix
# multiplication.
product = tf.matmul(matrix1, matrix2)

上述默認(rèn)圖現(xiàn)在有三個(gè)節(jié)點(diǎn):兩個(gè)常量(constant)op, 和一個(gè)矩陣乘法(matmul)op。為了真正進(jìn)行矩陣相乘運(yùn)算,并得到矩陣乘法的結(jié)果,你必須在會(huì)話里啟動(dòng)這個(gè)圖。

在一個(gè)會(huì)話(Session)中啟動(dòng)圖(graph)

構(gòu)造階段完成后,才能啟動(dòng)圖。啟動(dòng)圖的第一步是創(chuàng)建一個(gè)Session對(duì)象,如果無任何創(chuàng)建參數(shù),會(huì)話構(gòu)造器將啟動(dòng)默認(rèn)圖。

欲了解完整的會(huì)話 API,請(qǐng)閱讀Session類

# Launch the default graph.
sess = tf.Session()

# To run the matmul op we call the session 'run()' method, passing 'product'
# which represents the output of the matmul op.  This indicates to the call
# that we want to get the output of the matmul op back.
#
# All inputs needed by the op are run automatically by the session.  They
# typically are run in parallel.
#
# The call 'run(product)' thus causes the execution of three ops in the
# graph: the two constants and matmul.
#
# The output of the matmul is returned in 'result' as a numpy `ndarray` object.
result = sess.run(product)
print(result)
# ==> [[ 12.]]

# Close the Session when we're done.
sess.close()

Session對(duì)象在使用完后需要關(guān)閉以釋放資源。除了顯式調(diào)用close外,也可以使用with語句來自動(dòng)完成關(guān)閉動(dòng)作。

with tf.Session() as sess:
  result = sess.run([product])
  print(result)

在實(shí)現(xiàn)上,TensorFlow將圖(graph)定義轉(zhuǎn)換成分布式執(zhí)行的操作,以充分利用可用的計(jì)算資源(如CPU或GPU)。一般你不需要顯式指定使用CPU還是GPU,TensorFlow能自動(dòng)檢測(cè)。如果檢測(cè)到GPU,TensorFlow會(huì)盡可能地利用找到的第一個(gè)GPU來執(zhí)行操作。

如果機(jī)器上有超過一個(gè)可用的GPU,除第一個(gè)外的其它GPU默認(rèn)是不參與計(jì)算的。為了讓TensorFlow使用這些GPU,你必須將op明確指派給它們執(zhí)行。with...Device語句用來指派特定的CPU或GPU執(zhí)行操作:

with tf.Session() as sess:
  with tf.device("/gpu:1"):
    matrix1 = tf.constant([[3., 3.]])
    matrix2 = tf.constant([[2.],[2.]])
    product = tf.matmul(matrix1, matrix2)
    ...

設(shè)備用字符串進(jìn)行標(biāo)識(shí)。目前支持的設(shè)備包括:

  • "/cpu:0":機(jī)器的CPU
  • "/gpu:0":機(jī)器的第一個(gè) GPU,如果有的話
  • "/gpu:1":機(jī)器的第二個(gè) GPU,以此類推

閱讀使用GPU章節(jié),了解TensorFlow GPU使用的更多信息。

在分布式會(huì)話(Session)中啟動(dòng)圖(graph)

要?jiǎng)?chuàng)建TensorFlow集群,請(qǐng)啟動(dòng)集群中的每臺(tái)計(jì)算機(jī)上TensorFlow服務(wù)器。當(dāng)您在客戶端中實(shí)例化一個(gè)會(huì)話(Session)時(shí),可以將其中一臺(tái)機(jī)器的網(wǎng)絡(luò)位置傳遞給集群:

with tf.Session("grpc://example.org:2222") as sess:
  # Calls to sess.run(...) will be executed on the cluster.
  ...

則該機(jī)器成為會(huì)話(Session)的主機(jī)。主人在集群(工作人員)中的其他機(jī)器上分發(fā)圖(graph),就像利用本地機(jī)器的可用計(jì)算資源來實(shí)現(xiàn)圖(graph)。

您可以使用“with tf.device():”語句直接指定圖形中指定部分的工作人員:

with tf.device("/job:ps/task:0"):
  weights = tf.Variable(...)
  biases = tf.Variable(...)

有關(guān)分布式會(huì)話和集群的更多信息,請(qǐng)參閱TensorFlow分布式會(huì)話和集群

交互式使用

文檔中的Python示例使用一個(gè)會(huì)話Session來啟動(dòng)圖,并調(diào)用Session.run()方法執(zhí)行操作。

為了便于使用諸如IPython之類的Python交互環(huán)境,可以使用InteractiveSession代替Session類, 使用Tensor.eval()和Operation.run()方法代替Session.run()。這樣就可以避免使用一個(gè)變量來保存會(huì)話。

# Enter an interactive TensorFlow Session.
import tensorflow as tf
sess = tf.InteractiveSession()

x = tf.Variable([1.0, 2.0])
a = tf.constant([3.0, 3.0])

# Initialize 'x' using the run() method of its initializer op.
x.initializer.run()

# Add an op to subtract 'a' from 'x'.  Run it and print the result
sub = tf.sub(x, a)
print(sub.eval())
# ==> [-2. -1.]

# Close the Session when we're done.
sess.close()

Tensor

TensorFlow程序使用tensor數(shù)據(jù)結(jié)構(gòu)來代表所有的數(shù)據(jù),計(jì)算圖(graph)的時(shí)候,操作間傳遞的數(shù)據(jù)都是tensor。你可以把TensorFlow的tensor 看作是一個(gè)n維的數(shù)組或列表。一個(gè)tensor包含一個(gè)靜態(tài)類型rank和一個(gè)shape。想了解TensorFlow關(guān)于這些概念的信息,參見Rank,Shape和Type

變量(Variables)

變量(Variables)保持圖(graph)執(zhí)行過程中的狀態(tài)。下面的例子演示了如何使用變量(Variables)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的計(jì)數(shù)器。參見變量(Variables)章節(jié)了解更多細(xì)節(jié)。

# Create a Variable, that will be initialized to the scalar value 0.
state = tf.Variable(0, name="counter")

# Create an Op to add one to `state`.

one = tf.constant(1)
new_value = tf.add(state, one)
update = tf.assign(state, new_value)

# Variables must be initialized by running an `init` Op after having
# launched the graph.  We first have to add the `init` Op to the graph.
init_op = tf.global_variables_initializer()

# Launch the graph and run the ops.
with tf.Session() as sess:
  # Run the 'init' op
  sess.run(init_op)
  # Print the initial value of 'state'
  print(sess.run(state))
  # Run the op that updates 'state' and print 'state'.
  for _ in range(3):
    sess.run(update)
    print(sess.run(state))

# output:

# 0
# 1
# 2
# 3

代碼中assign()操作是圖(graph)所描繪表達(dá)式的一部分, 正如add()操作一樣。所以在調(diào)用run()執(zhí)行表達(dá)式之前,它并不會(huì)真正執(zhí)行賦值操作。

通常會(huì)將一個(gè)統(tǒng)計(jì)模型中的參數(shù)表示為一組變量。例如,你可以將一個(gè)神經(jīng)網(wǎng)絡(luò)的權(quán)重作為某個(gè)變量存儲(chǔ)在一個(gè)tensor中。在訓(xùn)練過程中,通過重復(fù)運(yùn)行訓(xùn)練圖,更新這個(gè)tensor.

Fetch

為了獲取操作的輸出內(nèi)容,可以在使用Session對(duì)象的run()調(diào)用執(zhí)行圖時(shí),傳入一些tensor,這些tensor會(huì)幫助你獲取結(jié)果。在之前的例子里,我們只取回了單個(gè)節(jié)點(diǎn)state,但是你也可以取回多個(gè)tensor:

input1 = tf.constant([3.0])
input2 = tf.constant([2.0])
input3 = tf.constant([5.0])
intermed = tf.add(input2, input3)
mul = tf.mul(input1, intermed)

with tf.Session() as sess:
  result = sess.run([mul, intermed])
  print(result)

# output:
# [array([ 21.], dtype=float32), array([ 7.], dtype=float32)]

需要獲取的多個(gè)tensor值,在op的一次運(yùn)行中會(huì)一起獲得(而不是逐個(gè)去獲取tensor)。

Feed

上述示例在計(jì)算圖中引入了tensor,以常量或變量的形式存儲(chǔ)。TensorFlow還提供了feed機(jī)制,該機(jī)制可以臨時(shí)替代圖(graph)中的任意操作中的tensor,可以對(duì)圖(graph)中任何操作提交補(bǔ)丁,直接插入一個(gè)tensor。

feed使用一個(gè)tensor值臨時(shí)替換一個(gè)操作的輸出結(jié)果。你可以提供feed數(shù)據(jù)作為run()調(diào)用的參數(shù)。feed只在調(diào)用它的方法內(nèi)有效。方法結(jié)束,feed就會(huì)消失。最常見的用例是將某些特殊的操作指定為feed操作,標(biāo)記方法是使用tf.placeholder()為這些操作創(chuàng)建占位符。

input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
output = tf.mul(input1, input2)

with tf.Session() as sess:
  print(sess.run([output], feed_dict={input1:[7.], input2:[2.]}))

# output:
# [array([ 14.], dtype=float32)]

如果沒有正確提供feed,placeholder()操作將會(huì)產(chǎn)生錯(cuò)誤。MNIST完全連接feed教程(source code) 給出了一個(gè)大規(guī)模的使用feed的例子。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,197評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,415評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,104評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,884評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,647評(píng)論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,130評(píng)論 1 323
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,208評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,366評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,887評(píng)論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,737評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,939評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,478評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,174評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,586評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,827評(píng)論 1 283
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,608評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,914評(píng)論 2 372

推薦閱讀更多精彩內(nèi)容