Tensor(张量)Flow(流) 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。它灵活的架构让你可以在多种平台上展开计算,例如台式计算机中的一个或多个CPU(或GPU),服务器,移动设备等等。TensorFlow 最初由Google大脑小组(隶属于Google机器智能研究机构)的研究员和工程师们开发出来,用于机器学习和深度神经网络方面的研究,但这个系统的通用性使其也可广泛用于其他计算领域。
数据流图(Data Flow Graph)用“结点”(nodes)和“线”(edges)的有向图来描述数学计算。“节点” 一般用来表示施加的数学操作,但也可以表示数据输入(feed in)的起点/输出(push out)的终点,或者是读取/写入持久变量(persistent variable)的终点。“线”表示“节点”之间的输入/输出关系。这些数据“线”可以输运“size可动态调整”的多维数据数组,即“张量”(tensor)。张量从图中流过的直观图像是这个工具取名为“Tensorflow”的原因。一旦输入端的所有张量准备好,节点将被分配到各种计算设备完成异步并行地执行运算。
Anaconda Navigator是Anaconda发行包中包含的桌面图形界面,可以用来方便地启动应用、方便的管理conda包、环境和频道,不需要使用命令行的命令。
conda --version
conda create --name tensorflow python=3.5
命令说明:
tensorflow :创建一个名字为“tensorflow”的Python版本环境
python=3.5:指定Python版本是3.5
python版本很重要
不同版本的Tensorflow对python版本有兼容性问题,用Spyder亲测过 tensorflow1.2.1 python3.5.2 和 tensorflow2.2.0 python 3.7.7
activate tensorflow
说明:
激活名字为:“tensorflow” 的Python版本环境,不然后面写python时,会提示找不到TensorFlow模块。
- 退出tensorflow的环境命令:deactivate
pip install --upgrade --ignore-installed tensorflow
默认安装符合你硬件条件的最新版tensorflow,如果下载中断了,反复连不上,或者要安装特定的版本,可以试试阿里服务器的包: http://mirrors.aliyun.com/pypi/simple/tensorflow/
下载下来,然后离线安装:
pip install --upgrade --ignore-installed 路径(下载到本地的文件路径)
pip是用于安装和管理软件包的包管理器
activate tensorflow
python
import tensorflow as tf
测试一下导入tensorflow,如果没有报错就说明安装成功了,测试了两个版本:
- 查看tensorflow版本命令:pip list
- 返回上一级的命令:exit()
一定要在对应的python环境下进行安装、跑代码等等,系统默认启动后,不是之前创建的python环境,需要切换到之前创建的名字为“tensorflow” 的Python版本环境:activate tensorflow,不然后面跑代码时,不同python的版本对不同包的支持不同,经常出现找不到包的情况。
这次测试用了Spyder开发环境,也可以用Jupyter或者PyCharm,在Anaconda里直接安装,不同版本的python环境安装不同版本的Spyder版本。
简介:
Spyder是Python(x,y)的作者为它开发的一个简单的集成开发环境。和其他的Python开发环境相比,它最大的优点就是模仿MATLAB的“工作空间”的功能,可以很方便地观察和修改数组的值。
这次用tensorflow测试了4个程序,v1.2.1和v2.2.0 的都跑过,代码不能通用,主要是因为v2.0后改动了很多,主要是对库的引用,需要导入就的包,例如:Session等。下面用v2.2.0的版本介绍一下(基于v1.0版本的改动一下就行了):
import tensorflow.compat.v1 as tf
hello = tf.constant('Hello,F\'s TensorFlow!')
print(tf.Session().run(hello))
如果是v1.0,直接是
import tensorflow as tf
import tensorflow.compat.v1 as tf
a = tf.constant([1.0,2.0,3.0],shape=[3],name='a')
b = tf.constant([1.0,2.0,3.0],shape=[3],name='b')
c = a + b
gpu_options =tf.GPUOptions(allow_growth=True,
per_process_gpu_memory_fraction=0.8)#per_process_gpu_memory_fraction=0.8,每个gpu占用0.8的显存
config=tf.ConfigProto(gpu_options=gpu_options,
allow_soft_placement=True,#注意:allow_soft_placement=True表明:计算设备可自行选择,如果没有这个参数,会报错。因为不是所有的操作都可以被放在GPU上,如果强行将无法放在GPU上的操作指定到GPU上,将会报错。
log_device_placement=True)#可以获取到 operations 和 Tensor 被指派到哪个设备(几号CPU或几号GPU)上运行
sess=tf.Session(config=config)
print(sess.run(c))
import tensorflow.compat.v1 as tf
import matplotlib.pyplot as plt
import random
mnint=tf.keras.datasets.mnist
(x_,y_),(x_1,y_1)=mnint.load_data()
#keras的容量是60000
random_num = random.randint(0,59999)
plt.imshow(x_[random_num], cmap="binary")
plt.show()
print(tf.Session().run(tf.constant('random number is : '+str(random_num))))
注意:
如果出现错误:
RuntimeError: The Session graph is empty. Add operations to the graph before calling run().
需要先跑一下:
tf.disable_eager_execution()
跑一次之后可以注释掉。
因为这个例子使用了keras,由于keras本身的会全部占用gpu显存,因此引入了如下限制机制。
限制显存的session由于没有清理,会与模型预测部分的对话发生混淆,致使开始的会话影响到了后面,并且跑其他程序时,会话也会使用同一个默认的空图,导致错误出现,跑一下Disable动态图机制就可以了。
Keras是用Python编写的高级神经网络API,能够在TensorFlow,CNTK或Theano之上运行。它的开发着眼于实现快速实验。能够以最小的延迟将想法付诸实践是进行良好研究的关键。入门了解好地方:https://keras-cn.readthedocs.io/en/latest/for_beginners/concepts/
MNIST是入门级别的手写体数字识别数据集,它包含了60000张图片作为训练数据,10000张图片作为测试数据。
from __future__ import print_function
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K
batch_size = 128
num_classes = 10
epochs = 12
# input image dimensions
img_rows, img_cols = 28, 28
# the data, split between train and test sets
(x_train, y_train), (x_test, y_test) = mnist.load_data()
if K.image_data_format() == 'channels_first':
x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)
x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols)
input_shape = (1, img_rows, img_cols)
else:
x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)
input_shape = (img_rows, img_cols, 1)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')
# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)
model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
activation='relu',
input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss=keras.losses.categorical_crossentropy,
optimizer=keras.optimizers.Adadelta(),
metrics=['accuracy'])
model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(x_test, y_test))
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
import tensorflow.compat.v1 as tf
from tensorflow.examples.tutorials.mnist import input_data
#/WorkSpace/MNIST_data/为数据存放路径,如果网络连不了可以离线下载下来放进去
mnist = input_data.read_data_sets("/WorkSpace/MNIST_data/", one_hot=True)
#输入图像数据占位符
x = tf.placeholder(tf.float32, [None, 784])
#权值和偏差
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
#使用softmax模型
y = tf.nn.softmax(tf.matmul(x, W) + b)
#代价函数占位符
y_ = tf.placeholder(tf.float32, [None, 10])
#交叉熵评估代价
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))
#使用梯度下降算法优化:学习速率为0.5
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
#Session
sess = tf.InteractiveSession()
#初始化变量
tf.global_variables_initializer().run()
#训练模型,训练1000次
for _ in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
#计算正确率
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
print ("Tranining data size: ", mnist.train.num_examples)