In [1]:
# windows only hack for graphviz path
import os
for path in os.environ['PATH'].split(os.pathsep):
if path.endswith("Library\\bin"):
os.environ['PATH']+=os.pathsep+os.path.join(path, 'graphviz')
In [2]:
import tensorflow as tf
import numpy as np
# 下面兩個是用來輔助圖形化
from IPython.display import display
from tfdot import tfdot
In [3]:
tf.constant(42)
Out[3]:
In [4]:
tf.constant(42.)
Out[4]:
In [5]:
tf.constant([42])
Out[5]:
In [6]:
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.],[2.]])
matrix1, matrix2
Out[6]:
In [7]:
product = tf.matmul(matrix1, matrix2)
product
Out[7]:
In [8]:
tfdot()
Out[8]:
這些東西的單位叫做 graph
In [9]:
graph = tf.get_default_graph()
graph
Out[9]:
In [10]:
product.graph
Out[10]:
In [11]:
# 從 graph 得到 tensor
graph.get_tensor_by_name('MatMul:0')
Out[11]:
In [12]:
graph.get_operations()
Out[12]:
In [13]:
product.op
Out[13]:
In [14]:
# 運算的輸出節點
product.op.outputs
Out[14]:
In [15]:
# 運算的輸入節點
list(product.op.inputs)
Out[15]:
In [16]:
# 建立逐項相乘的參考方式
%run -i q_constant_mul.py
# 用
# %load q_constant_mul.py
# 可以看內容
In [17]:
# 建立一個 Session
sess = tf.Session()
# 在這個 Session 中執行 product 並且印出結果。
print(sess.run(product))
# 結束這個 Session
sess.close()
In [18]:
with tf.Session() as sess:
print(sess.run(product))
# 也可以用
print(product.eval())
In [19]:
# 計算所有結果
%run -i q_run_all_op.py
In [20]:
with tf.Session() as sess:
with tf.device("/cpu:0"):
print(sess.run(product))
In [21]:
# 參考答案
%run -i q_sum.py
In [22]:
# 重新設定環境
tf.reset_default_graph()
# 設定 default session
sess = tf.InteractiveSession()
常數太無聊, 試試看可以改變輸入的運算
In [23]:
# place holder, 先佔位子
a = tf.placeholder(tf.float32, name="this_is_a")
b = tf.placeholder(tf.float32, name="this_is_b")
s = tf.add(a, b)
display(tfdot())
s
Out[23]:
直接執行
s.eval()
會爆掉,因為佔了位子沒人來
所以要放東西進去
In [24]:
s.eval({a:2, b: 5})
Out[24]:
或者
In [25]:
sess.run(s, {a:[1,2], b:[3,4]})
Out[25]:
In [26]:
sess.close()
In [27]:
# 重新設定 graph 環境和 default session
tf.reset_default_graph()
sess = tf.InteractiveSession()
# 計數器
state = tf.Variable(0, name="state")
# 新的節點 計數器+1
new_value = tf.add(state, tf.constant(1, name='one'), name='new_value')
# 更新 state
update = tf.assign(state, new_value)
# 變數初始化,這也是一個節點
init_op = tf.global_variables_initializer()
tfdot()
Out[27]:
上面都是靜態的,下面才開始在 session 中執行
In [28]:
init_op.run()
# or sess.run(init_op)
print(state.eval())
In [29]:
for _ in range(300):
#執行更新
print(update.eval())
In [30]:
state.eval()
Out[30]:
In [31]:
sess.run([update]*10)
Out[31]:
In [32]:
sess.close()
In [33]:
# 重設環境
tf.reset_default_graph()
sess = tf.InteractiveSession()
# 第一個變數 weights
weights = tf.Variable(tf.random_normal((10,), stddev=0.35), name='weights')
# 想要讓 w2 的初始值設定成和 weights 一樣
w1 = tf.Variable(weights.initialized_value(), name ='w1')
# 想將 w_twice 設定為 weights 的兩倍
w2 = tf.Variable(weights.initialized_value()*tf.constant(2., name='two'), name="w2")
tfdot()
Out[33]:
In [34]:
init_op = tf.global_variables_initializer()
init_op.run()
for v in tf.global_variables():
print(v.name, v)
print(v.eval())
In [35]:
sess.close()