1. 程式人生 > >tf.convert_to_tensor() tf.nn.embedding_lookup tf.cast() KMeans解釋和實現

tf.convert_to_tensor() tf.nn.embedding_lookup tf.cast() KMeans解釋和實現

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}))