TensorFlow(2)-- 张量、变量

import tensorflow as tf

TensorFlow -- 张量

张量的阶:

张量的数据类型:

张量属性

  • graph      张量所属的默认图
  • op           张量的操作名
  • name      张量的字符串描述
  • shape     张量的形状

张量的动态形状与静态形状

  • TensorFlow中,张量具有静态形状和动态形状
  • 静态形状: 创建一个张量,初始状态的形状
  1. tf.Tensor.get_shape:获取静态形状
  2. tf.Tensor.set_shape:更新Tensor对象的静态形状
  • 动态形状:一种描述原始张量在执行过程中的一种形状(动态变化)
  1. tf.reshape:创建一个具有不同形态的新张量
  • 要点:
  1. 转换静态形状的时候,1-D到1-D,2-D到2-D,不等跨阶数改变形状
  2. 对于已经固定或者设置静态形态的张量/变量,不能再次设置静态形状
  3. tf.reshape()动态创建新张量是,元素个数不能不匹配

张量的操作

生成张量-固定值张量

  • tf.zeros(shape, dtype=tf.float32, name=None)    创建所有元素都设置为零的张量,此操作返回具有shape和shape的dtype类型的张量所有元素设置为零
  • tf.zeros_like(tensor, dtype=tf.float32, name=None)    创建所有元素都设置为零的张量,给定一个张量(`tensor`),此操作返回与“tensor”相同的类型和形状,所有元素都设置为零。或者,可以使用“dtype”为返回的张量指定新类型
  • tf.ones(shape, dtype=tf.float32, name=None)    创建一个所有元素都设置为1的张量,此操作返回一个类型为'dtype',形状为'shape',所有元素都设置为1的张量
  • tf.ones_like(tensor, dtype=None, name=None, optimize=True)    创建一个所有元素都设置为1的张量,给定一个张量(`tensor`),此操作返回一个与`tensor`类型和形状相同的张量,所有元素都设置为1,或者,可以为返回的张量指定一个新类型(`dtype`)
  • tf.fill(dims, value, name=None)    创建用标量值填充的张量,此操作创建形状为“dims”的张量并用“value”填充`
  • tf.constant(value, dtype=None, shape=None, name="Const", verify_shape=False)    创建以恶搞常数变量

生成张量-随机张量

  • tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=dtypes.float32, seed=None, name=None)    从截断正态分布中输出随机值,生成的值遵循具有指定平均值和标准偏差的正态分布,但幅度大于平均值的2个标准偏差的值被丢弃并重新拾取
  • tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=dtypes.float32, seed=None, name=None)    从正态分布输出随机值

张量变换-改变类型

提供了如下一些改变张量中数值类型的函数

  • tf.string_to_number(string_tensor, out_type=None, name=None)
  • tf.to_double(x, name="ToDouble")
  • tf.to_float(x, name="ToFloat")
  • tf.to_bfloat16(x, name="ToBFloat16")
  • tf.to_int32(x, name="ToInt32")
  • tf.to_int64(x, name="ToInt64")
  • tf.cast(x, dtype, name=None)

张量变换-形状和变换

可用于确定张量的形状并更改张量的形状

  • tf.shape(input, name=None)
  • tf.size(input, name=None)
  • tf.rank(input, name=None)
  • tf.reshape(tensor, shape, name=None)
  • tf.squeeze(input, squeeze_dims=None, name=None)
  • tf.expand_dims(input, dim, name=None)

切片与扩展

  • tf.concat(values, axis, name="concat")

TensorFlow -- 变量

变量也是一种OP,是一种特殊的张量,能够进行存储持久化,它的值就是张量,默认被训练

变量的创建

tf.Variable(initial_value=None, name=None, trainable=True)

  • 创建一个带值initial_value的新变量
  • tf.Variable().assign(value)    为变量分配一个新值
  • tf.Variable().eval(session=None)    计算并返回此变量的值
  • tf.Variable().name    name属性表示变量名字

变量的初始化

tf.global_variables_initalizer()    添加一个初始化所有变量的OP,在会话中开启

 

代码:

# -*- coding: utf-8 -*-
import os
import tensorflow as tf

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'  # 忽略警告



# tensor  张量

# 形状表示 0阶: (),1阶: (N,)  2阶: (4, 3), 形状不固定:(None, N)
# 形状的参数指定  0阶: 数据   1阶: [N]

# 形状的改变
# 静态形状set_shape():1、当张量的形状固定的时候,不能修改本身的形状
#                     2、对于形状不固定的张量,可以修改其本身的形状,填充None
#                     3、不能跨阶数修改形状(不管本身形状固定不固定
# 动态形状tf.reshape():不是去修改原本的形状,而是去创建一个大小一样,但是形状可以是不一样的张量,元素个数匹配


a = tf.constant(2.0, shape=[4, 3])
b = tf.constant(2.0, shape=[4, 3])
# print(a, b)

plt = tf.placeholder(tf.float32, [None, 3])
print(plt.shape)

# 改变静态形状
plt.set_shape([3, 3])
print(plt.shape)
a_reshape = tf.reshape(a, [3, 4])

with tf.Session() as s:
    print(s.run(plt, feed_dict={plt: [[1,2,3], [3,4,5]]}))
    # print(s.run([a, a_reshape]))
    # print(a.graph)
    # print("-" * 30)
    # print(a.op)
    # print("-" * 30)
    # print(a.name)
    # print("-" * 30)
    # print(a.shape)



# 变量:有特殊用途(存储持久化,能否训练)
# 需要显示初始化:1、添加一个op,2、运行初始化
# 训练的参数,必须使用变量定义

var = tf.Variable(tf.random_normal([3, 4], mean=0.0, stddev=1.0))

con = tf.constant(10.0, tf.float32)

print(var, con)

init_op = tf.global_variables_initializer()

with tf.Session() as s:
    # 运行初始化变量op
    s.run(init_op)
    print(s.run([var, con]))

 

 

 

 

 

 

 

以下是一个使用TensorFlow实现K-Means算法的示例代码: ```python import numpy as np import tensorflow as tf # 生成样本数据 num_points = 200 vectors_set = [] for i in range(num_points): if np.random.random() > 0.5: vectors_set.append([np.random.normal(0.0, 0.9), np.random.normal(0.0, 0.9)]) else: vectors_set.append([np.random.normal(3.0, 0.5), np.random.normal(1.0, 0.5)]) # 将数据转换为TensorFlow的常量张量 vectors = tf.constant(vectors_set) # 定义K-Means算法的簇数 k = 4 # 随机初始化质心 centroids = tf.Variable(tf.slice(tf.random.shuffle(vectors), [0, 0], [k, -1])) # 计算每个样本点到各个质心的距离 expanded_vectors = tf.expand_dims(vectors, 0) expanded_centroids = tf.expand_dims(centroids, 1) distances = tf.reduce_sum(tf.square(tf.subtract(expanded_vectors, expanded_centroids)), 2) assignments = tf.argmin(distances, 0) # 更新质心位置 means = [] for c in range(k): means.append(tf.reduce_mean(tf.gather(vectors, tf.reshape(tf.where(tf.equal(assignments, c)), [1, -1])), reduction_indices=[1])) new_centroids = tf.concat(means, 0) # 初始化变量并运行会话 init_op = tf.global_variables_initializer() sess = tf.Session() sess.run(init_op) # 执行K-Means算法 for step in range(100): _, centroid_values, assignment_values = sess.run([new_centroids, centroids, assignments]) if step % 10 == 0: print("Step {}: Centroids = {}".format(step, centroid_values)) # 关闭会话 sess.close() ``` 这段代码生成了200个二维数据点,并使用K-Means算法将它们分为4个簇。在每一步迭代中,算法会计算每个数据点到各个质心的距离并将每个点分配到距离最近的簇中。然后,算法会根据当前的簇分配来更新质心的位置,并重复以上步骤直到收敛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卞亚超

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值