Tensorflow知识点总结(二)

大部分内容整理自《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来实现,可参考该博客,相关例程都有实现

发布了24 篇原创文章 · 获赞 24 · 访问量 4万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章