# encoding: utf-8
# 为了 Python3 的兼容,如果你用的 Python2.7
from __future__ import print_function, division
import tensorflow as tf

print('Loaded TF version', tf.__version__, '\n\n')

# Tensor 在数学中是“张量”
# 标量,矢量/向量,张量

# 简单地理解
# 标量表示值
# 矢量表示位置(空间中的一个点)
# 张量表示整个空间

# 一维数组是矢量
# 多维数组是张量, 矩阵也是张量


# 4个重要的类型
# @Variable        计算图谱中的变量
# @Tensor        一个多维矩阵,带有很多方法
# @Graph        一个计算图谱
# @Session        用来运行一个计算图谱


# 三个重要的函数

# Variable 变量
# tf.Variable.__init__(
#    initial_value=None, @Tensor
#    trainable=True,
#    collections=None,
#    validate_shape=True,
#    caching_device=None,
#    name=None,
#    variable_def=None,
#    dtype=None)
# 注意:Variable是一个Class,Tensor也是一个Class

# Constant 常数
# tf.constant(value, dtype=None, shape=None, name='Const')
# return: a constant @Tensor

# Placeholder 暂时变量?
# tf.placeholder(dtype, shape=None, name=None)
# return: 一个还尚未存在的 @Tensor



# 让我们用计算图谱来实现一些简单的函数
# + - * / 四则运算
def basic_operation():
    v1 = tf.Variable(10)
    v2 = tf.Variable(5)
    addv = v1 + v2
    print(addv)
    print(type(addv))
    print(type(v1))

    c1 = tf.constant(10)
    c2 = tf.constant(5)
    addc = c1 + c2
    print(addc)
    print(type(addc))
    print(type(c1))

    # 用来运行计算图谱的对象/实例?
    # session is a runtime
    sess = tf.Session()

    # Variable -> 初始化 -> 有值的Tensor
    tf.initialize_all_variables().run(session=sess)

    print('变量是需要初始化的')
    print('加法(v1, v2) = ', addv.eval(session=sess))
    print('加法(v1, v2) = ', sess.run(addv))
    print('加法(c1, c2) = ', addc.eval(session=sess))
    print('\n\n')
    #这种定义操作,再执行操作的模式被称之为“符号式编程” Symbolic Programming

    # tf.Graph.__init__()
    # Creates a new, empty Graph.
    graph = tf.Graph()
    with graph.as_default():
        value1 = tf.constant([1,2])
        value2 = tf.Variable([3,4])
        mul = value1 / value2

    with tf.Session(graph=graph) as mySess:
        tf.initialize_all_variables().run()
        print('一一对应的除法(value1, value2) = ', mySess.run(mul))
        print('一一对应的除法(value1, value2) = ', mul.eval())

    # tensor.eval(session=sess)
    # sess.run(tensor)


# 省内存?placeholder才是王道
# def use_placeholder():
    graph = tf.Graph()
    with graph.as_default():
        value1 = tf.placeholder(dtype=tf.float64)
        value2 = tf.Variable([3, 4], dtype=tf.float64)
        mul = value1 * value2

    with tf.Session(graph=graph) as mySess:
        tf.initialize_all_variables().run()
        # 我们想象一下这个数据是从远程加载进来的
        # 文件,网络
        # 假装是 10 GB
        value = load_from_remote()
        for partialValue in load_partial(value, 2):
            # runResult = mySess.run(mul, feed_dict={value1: partialValue})
            evalResult = mul.eval(feed_dict={value1: partialValue})
            print('乘法(value1, value2) = ', runResult)
        # cross validation

def load_from_remote():
    return [-x for x in range(1000)]


# 自定义的 Iterator
# yield, generator function
def load_partial(value, step):
    index = 0
    while index < len(value):
        yield value[index:index+step]
        index += step
    return

if __name__ == '__main__':
    basic_operation()
    # use_placeholder()

 

posted on 2017-09-25 22:59  郑哲  阅读(143)  评论(0编辑  收藏  举报