tf.convert_to_tensor() tf.nn.embedding_lookup tf.cast() KMeans解釋和實現
阿新 • • 發佈:2018-11-10
tf.convert_to_tensor()
tf.convert_to_tensor(
value,
dtype=None,
name=None,
preferred_dtype=None
)
將給定value轉換為Tensor。 此函式將各種型別的Python物件轉換為Tensor 物件。它接受Tensor物件,numpy陣列,Python列表和Python標量。 引數: value:需要轉換的 dtype:返回張量的可選元素型別。如果缺少,則從value的型別推斷出型別。 name:如果Tensor建立了new,則使用可選名稱。 返回: 一個基於value的輸出操作(ops),輸出一個tensor(自己的理解)
例如:
import numpy as np
def my_func(arg):
arg = tf.convert_to_tensor(arg, dtype=tf.float32)
return tf.matmul(arg, arg) + arg
#以下3句話是等價的
value_1 = my_func(tf.constant([[1.0, 2.0], [3.0, 4.0]]))
value_2 = my_func([[1.0, 2.0], [3.0, 4.0]])
value_3 = my_func(np.array([[1.0, 2.0], [3.0, 4.0]], dtype=np.float32) )
tf.nn.embedding_lookup
tf.nn.embedding_lookup(
params,
ids,
partition_strategy='mod',
name=None,
validate_indices=True,
max_norm=None
)
tf.nn.embedding_lookup函式的用法主要是選取一個張量params裡面 ,ids索引對應的元素。
tf.nn.embedding_lookup(params, id):params,id就是張量對應的索引
import tensorflow as tf;
import numpy as np;
c = np.random.random([10,1])
b = tf.nn.embedding_lookup(c, [1, 3])
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
print(c)
print("\n")
print(sess.run(b))
輸出:
[[ 0.23976515]
[ 0.77505197]
[ 0.08798201]
[ 0.20635818]
[ 0.37183035]
[ 0.24753178]
[ 0.17718483]
[ 0.38533808]
[ 0.93345168]
[ 0.02634772]]
[[ 0.77505197]
[ 0.20635818]]
tf.cast()
tf.cast:用於改變某個張量的資料型別
tf.cast(
x,
dtype,
name=None
)
返回:
與x具有相同shape,型別為dtype的tensor
KMeans:
用於建立一個Kmeans演算法的物件
_init__(
inputs,
num_clusters,
initial_clusters=RANDOM_INIT,
distance_metric=SQUARED_EUCLIDEAN_DISTANCE,
use_mini_batch=False,
mini_batch_steps_per_iteration=1,
random_seed=0,
kmeans_plus_plus_num_retries=2,
kmc2_chain_length=200
)
kmeans= KMeans(inputs=X,num_clusters=k,distance_metric="cosine",use_mini_batch=True)
引數:
inputs:輸入張量或輸入張量列表。假設資料點先前已被隨機置換。
num_clusters:一個整數張量,指定簇的數量。如果initial_clusters是張量或numpy陣列,則忽略此引數。
distance_metric:用於群集的距離度量。支援的選項:“squared_euclidean”,“cosine”。
use_mini_batch:如果為true,請使用小批量k-means演算法。
mini_batch_steps_per_iteration:更新的叢集中心同步回主副本的步驟數。
其有一個方法很重要:training_graph(這裡注意:這裡實際返回的引數比官方說的返回引數多一個cluster_centers_vars)
(all_scores,cluster_idx,scores,cluster_centers_initialized,
cluster_centers_vars,init_op,training_op)=kmeans.training_graph()
注意這裡的 all_scores cluster_idx scores 都是tuple型別的
千萬注意!!! 使用之前 一定要使用資料初始化 KMeans,即執行這句話
sess.run(init_op,fee的_dict={X:你自己需要輸入的資料})
注意這裡是專門為了初始化KMeans的,所以你在你還要在這句話之前初始化圖中所有的
變數,即執行這句話 sess.run(tf.global_variable_initializer())
以上知識點都出現下面的程式碼中(通過程式碼可以非常好的理解):
實現了一個 KMeans演算法:
程式可以直接跑起來
from __future__ import print_function
import tensorflow as tf
import numpy as np
from tensorflow.contrib.factorization import KMeans
# Import MNIST data
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("../mnist_data/", one_hot=True)
full_data_x = mnist.train.images
num_steps=20
batch_size=1024
k=25
num_classes=10
num_features=784
X=tf.placeholder(tf.float32,shape=[None,num_features])
Y=tf.placeholder(tf.float32,shape=[None,num_classes])
kmeans= KMeans(inputs=X,num_clusters=k,distance_metric="cosine",use_mini_batch=True)
(all_scores,cluster_idx,scores,cluster_centers_initialized,
cluster_centers_vars,init_op,training_op)=kmeans.training_graph()
cluster_idx=cluster_idx[0]#因為是tuple
all_scores=all_scores[0]#因為是tuple
avg_distance=tf.reduce_mean(scores[0])
init=tf.global_variables_initializer()
# Start TensorFlow session# Start
sess = tf.Session()
# Run the initializer
sess.run(init)
sess.run(init_op,feed_dict={X: full_data_x})
# Training
for i in range(1, num_steps + 1):
_, d, idx,allscores = sess.run([training_op, avg_distance, cluster_idx,all_scores],
feed_dict={X: full_data_x})
if i % 10 == 0 or i == 1:
print("Step %i, Avg Distance: %f" % (i, d))
counts=np.zeros(shape=[k,num_classes])
for i,id in enumerate(idx):
counts[id] += mnist.train.labels[i]
labels_map=[np.argmax(c) for c in counts]
print(labels_map)
labels_map_xhm=np.argmax(counts,axis=1)
print(labels_map)
labels_map=tf.convert_to_tensor(labels_map)
cluster_label=tf.nn.embedding_lookup(labels_map,cluster_idx) #這是重點
c_p=tf.equal(cluster_label,tf.cast(tf.argmax(Y,axis=1),tf.int32))
acc=tf.reduce_mean(tf.cast(c_p,tf.float32))
# Test Model
test_x, test_y = mnist.test.images, mnist.test.labels
print("Test Accuracy:", sess.run(acc, feed_dict={X: test_x, Y: test_y}))