美文网首页
78. TensorFlow教程(二)入门实践

78. TensorFlow教程(二)入门实践

作者: 十里江城 | 来源:发表于2019-12-04 21:10 被阅读0次

本文内容:

  • 搭建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版本:

image

pip --version:

image
  • 安装virtualenv并激活:
    使用sudo pip install virtualenv安装virtualenv, 由于virtualenv是系统级应用,故使用sudo
    查看版本:virtualenv --version: 16.7.8
    virtualenv安装成功。

然后,在当前目录下创建名为'venv'的虚拟环境:
virtualenv --system-site-packages -p python3.7 ./venv
当前目录出现'venv'的虚拟环境:

image.png

最后,使用source venv/bin/activate激活环境,进入'venv'虚拟环境:

image.png
  • 安装适配的TensorFlow软件包
    在虚拟环境中安装指定版本的TensorFlow: pip install tensorflow==1.13.1
    image

pip list显示安装包TensorFlow的版本号:

image.png

使用python命令进入Python的交互式环境查看TensorFlow是否安装成功:

image
未报错说明成功引入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 当前使用的核显示在右上角: 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,安装成功:

image.png

下载数据集:

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:

image.png

安装"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"

image.png

TensorFlow Docker容器启动成功。

  • 访问localhost:8888成功:


    image.png

实现在docker中使用TensorFlow,相当于将notebooks挂载到Docker中,类似java的虚拟机。

相关文章

网友评论

      本文标题:78. TensorFlow教程(二)入门实践

      本文链接:https://www.haomeiwen.com/subject/ruulgctx.html