本文内容:
- 搭建TensorFlow开发环境
- 使用TensorFlow实现"hello"程序
- 在交互式环境中使用TensorFlow
- 在容器中使用TensorFlow
搭建TensorFlow开发环境
TensorFlow支持的硬件平台:
image
TensorFlow支持的操作系统:
image
Ubuntu16.04、Windows7、macOS10.12.6、树莓派9.0及各版本以上
树莓派:2012.3发售的卡片式电脑。
使用pip安装TensorFlow步骤:
- 安装或更新brew
- 获取get-pip.py文件并安装pip:
使用python get-pip.py
安装pip
检查安装:
python --version
python版本:
pip --version
:
- 安装virtualenv并激活:
使用sudo pip install virtualenv
安装virtualenv, 由于virtualenv是系统级应用,故使用sudo
查看版本:virtualenv --version
: 16.7.8
virtualenv安装成功。
然后,在当前目录下创建名为'venv'的虚拟环境:
virtualenv --system-site-packages -p python3.7 ./venv
当前目录出现'venv'的虚拟环境:
最后,使用source venv/bin/activate
激活环境,进入'venv'虚拟环境:
- 安装适配的TensorFlow软件包
在虚拟环境中安装指定版本的TensorFlow:pip install tensorflow==1.13.1
image
pip list
显示安装包TensorFlow的版本号:
使用python
命令进入Python的交互式环境查看TensorFlow是否安装成功:
未报错说明成功引入TensorFlow,安装成功,使用'exit()' 退出交互式环境。
最后,使用deactivate
离开该虚拟环境。
使用TensorFlow实现"hello"程序
支持AVX2指令集的CPU:
image
有python交互式界面与jupyter两种实现:
- 使用终端python交互式界面实现:
打开终端进入指定目录,source venv/bin/activate
进入虚拟环境,python
进入python交互式环境,两种方式sess.run(hello)
与print(sess.run(hello))
均可实现常量"hello"的打印:
image
其中,创建会话"tf.Session() "后才能申请到资源。
以下提示表示此cpu不支持AVX2指令集,提示可关闭:
image
- jupyter notebook环境实现:
首先安装jupyter:pip install jupyter
创建名为"venv"的kernel:python -m ipykernel install --user --name=venv
使用jupyter kernelspec list
查看核:
image.png
其中可用核中的"venv"核, 使用jupyter kernelspec remove python3
可删除"python3"的核。
启动notebook: jupyter notebook
:
选用相应的核:
image 当前使用的核显示在右上角: image
在交互式环境中使用TensorFlow:
打印"hello"程序如下:
import tensorflow as tf
hello = tf.constant('hello')
print(tf.Session().run(hello))
tf.Session().run(hello)
结果如下:
image.png
多层感知机模型示例与MNIST数据集简介:
image
在虚拟环境venv中安装包,如keras: pip install keras
,安装成功:
下载数据集:
from __future__ import print_function
from tensorflow.examples.tutorials.mnist import input_data
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
import keras
# 导入MNIST数据集
mnist = input_data.read_data_sets("/tmp/data/", one_hot = True)
print(input_data)
证书认证失败则添加以下code:
image.png
神经网络如下:
image
使用该神经网络求取准确率的步骤如下:
- 获取数据
- 定义神经网络的超参数
- 定义权重、偏置和神经网络
- 构建模型
- 训练与结果
步骤详解:
- 获取数据:
from __future__ import print_function
from tensorflow.examples.tutorials.mnist import input_data
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
import keras
# 导入MNIST数据集
mnist = input_data.read_data_sets("/tmp/data/", one_hot = True)
print(input_data)
显示获取数据:
image.png
- 定义神经网络的超参数:
import tensorflow as tf
# 超参数
learning_rate = 0.1
num_steps = 500
batch_size = 128
display_step = 100
# 神经网络参数
# 第一二层神经元个数
n_hidden_1 = 256
n_hidden_2 = 256
# MNIST输入数据的图像大小与类别数
num_input = 784
num_classes = 10
# 输入到数据流图中的训练数据
# None表示边长
# 实际X: 128*784 实际Y: 128*10
X = tf.placeholder("float", [None, num_input])
Y = tf.placeholder("float", [None, num_classes])
- 定义权重、偏置和神经网络:
# 权重和偏置
# tf.random_normal: 从服从正态分布的数值中取出指定个值
weights = {
'h1': tf.Variable(tf.random_normal([num_input, n_hidden_1])),
'h2':tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])),
'out': tf.Variable(tf.random_normal([n_hidden_2, num_classes]))
}
biases = {
'b1': tf.Variable(tf.random_normal([n_hidden_1])),
'b2': tf.Variable(tf.random_normal([n_hidden_2])),
'out': tf.Variable(tf.random_normal([num_classes]))
}
# 定义神经网络
def neural_net():
# 第一二层隐藏层均为256个神经元
layer_1 = tf.add(tf.matmul(X, weights['h1']), biases['b1'])
layer_2 = tf.add(tf.matmul(layer_1, weights['h2']), biases['b2'])
# 输出层 输出128*10维度的图片
out_layer = tf.matmul(layer_2, weights['out']) + biases['out']
return out_layer
- 构建模型:
# 构建模型
logits = neural_net()
# 定义损失函数
# 使用softmax_cross_entropy_with_logits计算损失函数
# logits: 表示模型输出的十个预测值都非零,某个数字上概率超过阈值(如0.8)则认为正确,logists通过此种方式判断与真实值的差距
loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = logits, labels = Y))
# 定义优化器
optimizer = tf.train.AdamOptimizer(learning_rate = learning_rate)
train_op = optimizer.minimize(loss_op)
# 定义预测准确率
# equal(): 取logits中最大值与真实的Y进行比较
correct_pred = tf.equal(tf.argmax(logits, 1), tf.argmax(Y, 1))
# reduce_mean(): 计算张量沿着指定数轴上的平均值 cast: 强制数据类型转换
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))
# 初始化所有的变量,赋默认值,使之合法
init = tf.global_variables_initializer()
- 训练与结果:
# 前向与后向传播
# 使用session()可回收资源
with tf.Session() as sess:
# 初始化
sess.run(init)
for step in range(1, num_steps + 1):
# 一次读取batch_size对数据
batch_x, batch_y = mnist.train.next_batch(batch_size)
# 执行训练操作
sess.run(train_op, feed_dict = {X: batch_x, Y: batch_y})
# 每display_step次输出一次状态
if step % display_step == 0 or step == 1:
# 计算损失值和准确率,各保留四位与三位小数
loss, acc = sess.run([loss_op, accuracy], feed_dict = {X: batch_x, Y: batch_y})
print("Step: " + str(step) + ", Minibatch Loss = {:.4f}".format(loss) + \
", Training Accuracy = {:.3f}".format(acc))
print('Optimization Finished!')
# 计算测试数据的准确率
print('Testing Accuracy: ', sess.run(accuracy, feed_dict = {X: mnist.test.images, Y: mnist.test.labels}))
训练过程与测试结果如下:
image.png
测试准确率为85.61%
在容器中使用TensorFlow
image在docker中使用TensorFlow:
容器具有隔离性,night-jupyter具有轻量的性质。
-
mac上安装docker:
image.png -
运行docker:
image.png -
拉取TensorFlow docker镜像:
docker pull tensorflow/tensorflow:nightly-jupyter
:
安装"nightly-jupyter"完成
- 启动TensorFlow docker容器:
使用命令:
docker run -it --rm -p 8888:8888 -v $PWD:/tf/notebooks tensorflow/tensorflow:nightly-jupyter
其中:
-it
是交互式参数设置
--rm
是文件系统的清理操作
-p
是指从容器内部的8888端口映射到本地host上的8888端口,使之可以从本地访问容器内部的8888端口
$pwd
设置将当前目录$PWD映射为容器内部的"/tf/notebooks"
TensorFlow Docker容器启动成功。
-
访问localhost:8888成功:
image.png
实现在docker中使用TensorFlow,相当于将notebooks挂载到Docker中,类似java的虚拟机。
网友评论