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

猜你喜欢

转载自blog.csdn.net/qq_32806793/article/details/83118048