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