• Tensor--tensorflow的数据类型


    在tensorflow2.0版本之前,1.x版本的tensorflow的基本数据类型有计算图(Computation Graph)和张量(Tensor)两种,但tensorflow2.0之后的版本取消了Graph和Session的概念。今天简单记录一下Tensor的相关内容。

    从Tensorflow的命名就不难看出,Tensor(张量)在整个tensorflow的框架体系中都是一个重要的概念,它可以称为Tensorflow的数据模型,因为Tensor是tensorflow管理数据的形式,换句话说,在tensorflow中,所有的数据都可以借助张量的形式来表示。在张量出现之前,我们比较熟悉这样两种数据类型:list和np.array。list就不多说了,对于大量数据list的表现并不是很好,假设有一个维度[64,24,24,3]的数据,它在深度学习中其实是一个比较小的数据,但是对于list来说却是一个很庞大的数据,占用的内存空间更是无法估量。而为了解决大数据的吞吐,对于相同类型的数据载体,np.numpy有很好的表现,但是numpy是在tensorflow之前出现的一个科学计算库,对GPU并不支持,也不支持自动求导,为了更好的解决深度学习中的问题,tensorflow开始出现。

    在数学中,一个0维的数据(dim=0),即1.1,2.2等等被称为一个标量(scalar),一个一维的数据(dim=1),即[1.1],[2.2,3.3,……]等被称作向量(vector),一个维度大于2的数据,如[[1,2],[3,4]]被称为矩阵(matrix),而Tensor一般是指维度大于2的向量(矩阵),但是在tensorflow中,以上所有的类型都可以被称为tensor。

    创建不同类型的数据:

    # int型
    a = tf.constant(1)
    # float型
    b = tf.constant(1.)
    # double型
    c = tf.constant(2.,dtype=tf.float64)
    # bool型
    d = tf.constant([True,False])
    # string型
    e = tf.constant('hello world')

    得到结果如下:

    常用属性如下:

    # 使用numpy声明一个数据
    a=np.arange(5)
    # 将其转化为tensor
    aa=tf.convert_to_tensor(a)
    # 强制类型转换 int——float
    bb=tf.cast(aa,dtype=tf.float32)
    # .numpy()将tensor返回numpy显示数据
    print(aa.numpy())

    得到

    如何创建一个tensor:

    # 通过numpy创建数据转换
    a = tf.convert_to_tensor(np.ones([2,3]))
    # list转换
    b = tf.convert_to_tensor([1,2])
    # 初始化全为0的tensor(tf.ones()用法同tf.zeros())
    c = tf.zeros([2,2])
    # 以指定tensor的shape为基础创建新的tensor(同tf.zeros(c.shape))
    d = tf.zeros_like(c)
    # 填充任意元素
    e = tf.fill([2,2],9)
    # 随机化初始化:
    # 正态分布,mean指定均值,stddev指定方差
    f = tf.random.normal([2,2],mean=1,stddev=1)
    # 截断正态分布
    g = tf.random.truncated_normal([2,2],mean=1,stddev=1)
    # 均匀分布
    h = tf.random.uniform([2,2],minval=0,maxval=1)

    捎带提一点打乱顺序函数的用法:

    # 随机打散
    i = tf.range(10)
    i = tf.random.shuffle(i)
    x = tf.random.uniform([10],maxval=10,dtype=tf.int32)
    y = tf.random.uniform([10],maxval=10,dtype=tf.int32)
    print(i.numpy())
    print("x:",x.numpy())
    print("y:",y.numpy())
    # .gather指定按照某一索引序列取值
    x = tf.gather(x,i)
    y = tf.gather(y,i)
    print("x:",x.numpy())
    print("y:",y.numpy())

    可以看到按照同一打乱序列取值后,x和y仍然是一一对应的关系

    tensor中scalar最常用的部分:loss和accuracy

    损失(loss)和精度(accuracy)在前面回归和mnist实战都已经提过,这里不再解释其概念,简单说明一下loss的求值方法

    # 生成一组数据用来模拟四张图片的网络输出
    out = tf.random.uniform([4,10])
    print(out)
    # 模拟四张图片对应的label
    y = tf.range(4)
    print(y)
    # 使用one_hot对label进行编码
    y = tf.one_hot(y,depth=10)
    print(y)
    # 调用keras的api来计算损失(MSE均方误差)
    loss = tf.keras.losses.mse(y,out)
    print(loss)
    # 求loss的均值
    loss = tf.reduce_mean(loss)
    print(loss)

  • 相关阅读:
    c++ 单步查看汇编代码【转】
    c++ 类内部函数调用虚函数
    grep和sed替换文件中的字符串【转】
    vim 正则替换【转】
    linux 文件编码问题
    shell截取字符串的一些简单方法
    chrome 安装页面编码选择插件
    namespace main
    【转】c++ 多线程
    使用git提交到github,每次都要输入用户名和密码的解决方法
  • 原文地址:https://www.cnblogs.com/zdm-code/p/12207339.html
Copyright © 2020-2023  润新知