大部分内容整理自《Tensorflow实战Google深度学习框架》
Tensorflow的配置见前面的博文https://blog.csdn.net/jiugeshao/article/details/76370137
这里Tensorflow的版本为tensorflow-gpu1.2.0
计算图
Tensorflow是一个通过计算图的形式来表述计算的编程系统,Tensorflow中每一个计算都是计算图上的一个节点,而节点之间的连线描述了计算之间的依赖关系,节点表示数学操作,代表一个计算,计算的结果就保存在张量之中,边线则表示节点相互联系的多位数据数组,即张量,Flow表达了张量之间通过计算相互转化的过程。Tensorflow会将常量转化成一种永远输出固定值的运算。张量的类型不匹配会报错
Tensorflow程序一般分为两个阶段:
- 定义计算图中所有的计算
- 执行计算
如下是定义计算图
import tensorflow as tf
g1 = tf.Graph()
with g1.as_default():
a = tf.constant([11.0, 42.0], name="a")
d = tf.constant([11.0, 42.0], name = "d")
result1 = a - d
v = tf.get_variable("v",initializer=tf.zeros_initializer()(shape=[1]))
print("a,v: ",a,v)
print("a.dtype: ",a.dtype)
print("tf.graphkeys.variable: ", tf.GraphKeys.VARIABLES)
执行结果为:
a,v: Tensor("a:0", shape=(2,), dtype=float32) <tf.Variable 'v:0' shape=(1,) dtype=float32_ref>
a.dtype: <dtype: 'float32'>
tf.graphkeys.variable: variables
Tensorflow使用会话模式有两种,第一种:
使用会话是可以像with tf.Session(graph=g1) as sess:指定具体会话
import tensorflow as tf
import numpy as np
import tensorboard
a = tf.constant([1.0, 2.0], name="a")
b = tf.constant([2.0, 3.0], name="b")
print("a: ",a)
result = a + b
print("result: " ,result)
with tf.Session() as sess:
print("sess.run(result): ",sess.run(result))
print(tf.get_default_graph())
计算结果为:
a: Tensor("a:0", shape=(2,), dtype=float32)
result: Tensor("add:0", shape=(2,), dtype=float32)
sess.run(result): [3. 5.]
<tensorflow.python.framework.ops.Graph object at 0x000001D9946E4898>
第二种:
import tensorflow as tf
n1 = tf.constant(["1234", "6789"])
n2 = tf.string_to_number(n1, out_type=tf.float32)
sess = tf.Session()
result = sess.run(n2)
print(result)
结果为:[1234. 6789.]
详细的一些配置,扩展可以用时再查找。需要了解tf.add_to_collection使用, 共享变量的使用方法,配合Variable_scope一起使用的get_Variable方式,feed机制,生成张量的操作,变量初始化和tf.assign(有副作用),用tensorflow也能实现机器学习,如线性回归问题,
2. 可以手动实验Tensorflow游乐场及神经网络简介
3. tensorboard可视化
这里比较下keras和tensorflow加载mnist数据集的方式:
(1)#使用keras自带的mnist工具
from keras.datasets import mnist
import numpy
from keras import backend as K
X_train, y_train), (X_test, y_test) = mnist.load_data()
该会去去找一链接来下载数据库,但由于一般电脑都没有设置翻墙功能,可以提前下载mnist.npz,然后放到
C:\Users\76764\.keras\datasets目录下,这边的76764是用户名,可以视自己的电脑而定,该文件我已经上传至网盘
(2) 直接读本地的mnist文件,如下格式文件:
import numpy as np
from keras.datasets import mnist
def load_mnist(path, kind='train'):
"""Load MNIST data from `path`"""
labels_path = os.path.join(path,
'%s-labels.idx1-ubyte'
% kind)
images_path = os.path.join(path,
'%s-images.idx3-ubyte'
% kind)
print("labels_path: ",labels_path)
print("images_path: ", images_path)
with open(labels_path, 'rb') as lbpath:
magic, n = struct.unpack('>II',
lbpath.read(8))
labels = np.fromfile(lbpath,
dtype=np.uint8)
with open(images_path, 'rb') as imgpath:
magic, num, rows, cols = struct.unpack('>IIII',
imgpath.read(16))
images = np.fromfile(imgpath,
dtype=np.uint8).reshape(len(labels), 784)
return images, labels
path = ".\\mnist"
X_train, y_train = load_mnist(path, kind='train')
path = ".\\mnist"
X_test, y_test = load_mnist(path, kind='t10k')
print("X_train: ",X_train.T.shape, X_train.dtype)
print('y_train: ',y_train.T.shape, y_train.dtype)
print("X_test: ",X_test.shape, X_test.dtype)
print("y_test: ",y_test.shape, y_test.dtype)
path为保存有上面提到的文件的文件夹名
(3)读取如下的minist本地图片
import os
import cv2
import numpy as np
import pydot
import graphviz
ef loadData(path, number):
data = np.empty((number, 1, 28, 28), dtype="float32") # empty与ones差不多原理,但是数值随机,类型随后面设定
labels = np.empty((number,), dtype="uint8")
listImg = os.listdir(path)
count = 0
for img in listImg:
imgData = cv2.imread(path + '/' + img, 0) # 数据
l = int(img.split('.')[0]) # 答案
arr = np.asarray(imgData, dtype="float32") # 将img数据转化为数组形式
data[count, :, :, :] = arr # 将每个三维数组赋给data
labels[count] = l # 取该图像的数值属性作为标签
count = count + 1
path, " loaded ", count
if count >= number:
break
return data, labels
# 从图片文件加载数据
trainData, trainLabels = loadData('./mnistCnn-others_code/mnist', 22000)
testData, testLabels = loadData('./mnistCnn-others_code/mnist', 1)
在使用tensorflow的过程中经常需要可视化计算图,可以通过tensorboard来实现,可参考该博客,相关例程都有实现