日志:2021_3_4 tensorflow基础(待续)

一、tf.placeholder() 占位符

tf.placeholder(
       dtype,
       shape=None,
       name=None
   )

函数参数:

dtype:数据类型。常用的是tf.float32,tf.float64等数值类型

shape:数据形状。默认是None,就是一维值,也可以是多维(比如[2,3], [None, 3]表示列是3,行不定)

name:名称

返回:Tensor类型。

二、OP节点

节点概念
TensorFlow用图来表示相关计算任务,图中的节点称为 operation,缩写成op。一个节点获得0个或者多个张量(tensor)。图必须会在会话(Session)中被启动,会话将图的节点(op)分发到CPU或GPU之类的设备上,同时提供执行节点(op)的方法,这些方法执行后,将产生的张量(tensor)返回。

三、constant(常量)

constant是tensorflow的常量节点,通过constant方法创建,其是计算图中的起始节点,是传入数据。

创建方式:

cons = tf.constant(value=[1,2],dtype=tf.float32,shape=(1,2),name='testConstant',verify_shape=False)

参数说明:

value:初始值,必填,必须是一个张量(1或[1,2,3]或[[1,2,3],[2,2,3]]或……)。

dtype:数据类型,选填,默认为value的数据类型,传入参数为tensotflow下的枚举值(float32,float64….)。

shape:数据形状,选填,默认为value的shape,设置时不得比value小,可以比value阶数,纬度更高,超过部分按value提供最后一个数字填充。

name:常量,选填,默认值不重复,根据创建顺序为(Const,Const_1,Const_2…….)。

verify_shape:是否验证value的shape和指定shape相符,若设为True则进行验证,不相符时会抛出异常。

四、Variable(变量)

variable是tensorflow的变量节点,通过Variable方法创建,并且需要传递初始值,在使用前需要通过tensorflow方法进行初始化。

#创建方式:
v1 = tf.Variable(tf.zeros([3, 10]), dtype=tf.float64, name='v1')

# 创建变量
name_variable = tf.Variable(value, name)

# 初始化单个变量
init_op=variable.initializer()

# 初始化所有变量
init_op=tf.initialize_all_variables()

# 更新操作
update_op=tf.assign(variable to be updated, new_value)

五、张量(tensor)

1、概念
张量表示从向量空间到实数域的多重线性映射。在TensorFlow中用tensor数据结构来表示所有的数据,计算图中,操作间传递的数据都是tensor。

2、张量的阶和维数(shape)
在TensorFlow中,张量的维数被描述为“阶”,张量以list形式存储。list中有几重中括号,对应的张量就表示几阶。
如test = [[1,2,3],[1,2,3],[1,2,3]],test就是一个二阶张量。一阶张量,相当于一个向量;二阶张量,相当于一个矩阵。

例如,t=[ [1,2,3],[4,5,6],[7,8,9] ]来说,它的shape==>[3,3],shape可以理解成:当脱去最外层的一对中括号后,里面有3个小list,然后每个小list里又有3个元素,所以该张量的shape==>[3,3]。

如[ [1,2,3],[4,5,6] ] 的shape=[2,3](因为当脱去最外层的一对中括号后,里面有2个小list,然后每个小list里又有3个元素,所以该张量的shape==>[2,3]。

六、Graph

Graph:要组装的结构,由许多操作组成,其中的每个连接点代表一种操作
在这里插入图片描述

七、tf.assign函数

tf.assign

通过将 “value” 赋给 “ref” 来更新 “ref”.

#函数原型
assign (
      ref ,
      value ,
      validate_shape = None ,
      use_locking = None ,
      name = None
  )

参数说明:

ref:一个可变的张量.应该来自变量节点.节点可能未初始化.

value:张量.必须具有与 ref 相同的类型.是要分配给变量的值.

validate_shape:一个可选的 bool.默认为 True.如果为 true, 则操作将验证 “value” 的形状是否与分配给的张量的形状相匹配;如果为 false, “ref” 将对 “值” 的形状进行引用.

use_locking:一个可选的 bool.默认为 True.如果为 True, 则分配将受锁保护;否则, 该行为是未定义的, 但可能会显示较少的争用.

name:操作的名称(可选).

tf.assign_add

通过向 “ref” 添加 “value” 来更新 “ref”.

#函数原型
assign_add (
      ref ,
      value ,
      use_locking = None ,
      name = None
  )

tf.assign_sub

通过从 “ref” 中减去 “value” 来更新 “ref”.

#函数原型
assign_sub (
      ref ,
      value ,
      use_locking = None ,
      name = None
  )

此操作在更新完成后输出 “ref”,这使得更易于链接需要使用重置值的操作.

tf.tf.multiply()

这个函数实现的是元素级别的相乘,也就是两个相乘的数元素各自相乘,而不是矩阵乘法.
示例:

input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)

output = tf.multiply(input1,input2)

八、softmax()函数

Softmax从字面上来说,可以分成soft和max两个部分。max故名思议就是最大值的意思。Softmax的核心在于soft,而soft有软的含义,与之相对的是hard硬。很多场景中需要我们找出数组所有元素中值最大的元素,实质上都是求的hardmax。下面使用Numpy模块以及TensorFlow深度学习框架实现hardmax。

使用Numpy模块实现hardmax:

import numpy as np

a = np.array([1, 2, 3, 4, 5]) # 创建ndarray数组
a_max = np.max(a)
print(a_max) # 5

使用TensorFlow实现hardmax:

import tensorflow as tf

print(tf.__version__) # 2.0.0
a_max = tf.reduce_max([1, 2, 3, 4, 5])
print(a_max) # tf.Tensor(5, shape=(), dtype=int32)

通过上面的例子可以看出hardmax最大的特点就是只选出其中一个最大的值,即非黑即白。但是往往在实际中这种方式是不合情理的,比如对于文本分类来说,一篇文章或多或少包含着各种主题信息,我们更期望得到文章对于每个可能的文本类别的概率值(置信度),可以简单理解成属于对应类别的可信度。所以此时用到了soft的概念,Softmax的含义就在于不再唯一的确定某一个最大值,而是为每个输出分类的结果都赋予一个概率值,表示属于每个类别的可能性。

下面给出Softmax函数的定义(以第i个节点输出为例):
在这里插入图片描述

其中 z i z_i zi为第i个节点的输出值,C为输出节点的个数,即分类的类别个数。通过Softmax函数就可以将多分类的输出值转换为范围在[0, 1]和为1的概率分布。


@Time : 2020/10
@Author : zhzhang
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在Java中,泛型是一种强类型机制,它可以让你在编译时检查类型错误,从而提高代码的安全性和可读性。在使用泛型时,我们经常会遇到父类和子类的泛型转换问题。 首先,我们需要明确一点:子类泛型不能转换成父类泛型。这是因为Java中的泛型是不协变的。例如,如果有一个类A和它的子类B,那么List<A>和List<B>之间是不存在继承关系的。 下面我们来看一个例子: ```java public class Animal { //... } public class Dog extends Animal { //... } public class Test { public static void main(String[] args) { List<Animal> list1 = new ArrayList<>(); List<Dog> list2 = new ArrayList<>(); list1 = list2; // 编译错误 } } ``` 在这个例子中,我们定义了Animal类和它的子类Dog。然后我们定义了两个List,分别是List<Animal>和List<Dog>。如果将List<Dog>赋值给List<Animal>,会出现编译错误。这是因为List<Animal>和List<Dog>之间不存在继承关系。 那么,如果我们想要让子类泛型转换成父类泛型,应该怎么办呢?这时我们可以使用通配符来解决问题。通配符可以表示任意类型,包括父类和子类。例如,我们可以将List<Dog>赋值给List<? extends Animal>,这样就可以实现子类泛型转换成父类泛型了。 下面我们来看一个使用通配符的例子: ```java public class Animal { //... } public class Dog extends Animal { //... } public class Test { public static void main(String[] args) { List<Animal> list1 = new ArrayList<>(); List<Dog> list2 = new ArrayList<>(); list1 = list2; // 编译错误 List<? extends Animal> list3 = new ArrayList<>(); list3 = list2; // 正确 } } ``` 在这个例子中,我们定义了List<? extends Animal>来表示任意继承自Animal的类型。然后我们将List<Dog>赋值给List<? extends Animal>,这样就可以实现子类泛型转换成父类泛型了。 总结一下,Java中的泛型是不协变的,子类泛型不能转换成父类泛型。如果需要实现子类泛型转换成父类泛型,可以使用通配符来解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值