自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(69)
  • 收藏
  • 关注

原创 tensorflow list_files需要注意的点

但是这里面有个比较坑的点:我们点开list_files的源码,会发现调用了gen_io_ops.matching_files。tensorflow 读取tfrecord的时候 list_files几乎是避不开的函数,在tensorflow的官方文档中写了,list_files 支持正则表达式。不过这也不代表我们没办法读多个目录,list_files的入参可以是一个路径字符串,也可以是一个list,其中的每个元素都可以是一个路径正则表达式。

2024-04-16 20:14:13 342

原创 tensorflow源码精读之graph

本节介绍tensorflow中的graph,在c_api.cc中有创建graph的例子,我们从这个为切入点,探索graph的使用。

2023-01-29 17:32:54 1277

原创 tensorflow 之 graph

首先看graph 的初始化,tensorflow::Graph是一个类,定义和初始化的方法都在tensorflow/core/graph/graph.cc 和 tensorflow/core/graph/graph.h。本节介绍tensorflow中的graph,在c_api.cc 中有创建graph的例子,可以从这个为切入点,探索graph的使用。通过调用TF_Graph来创建一个图,TF_Graph的定义在tensorflow/c/c_api_internal.h。

2023-01-28 17:11:22 830

原创 c++ constexpr 关键字

constexpr 用于修饰一个函数,表示在编译期间就能得到其返回值,而不是在运行期间得到。而宏是在预编译期间就做了置换。1. constexpr 函数体必须有return 函数,且只能有return函数。2. constexpr 不允许出现变量,因为是在编一阶段。上面代码虽然不会报错,但是会报警告。

2023-01-17 10:18:52 397

原创 c++ 类成员初始化和函数对象

上面的例子中,对于FeatureValue的类成员初始化比较好理解,把2 赋给sss,因为sss本就是int。然后后面Feature 是比较反常的,kkk是一个类,但是却可以直接用这种方式进行初始化。类成员可以在构造函数中进行初始化,具体写法是。且这种写法可以连续传递。

2023-01-17 00:51:31 183

原创 c++ 宏中的... , __VA_ARGS__, __COUNTER__, #、##、#@

新的C99规范支持了可变参数的宏,省略号表示可变的参数,而__VA_ARGS__一般用于宏的右边表示被省略的参数。把宏字符串话,换句话说就是把宏两两边加上“”,例如。例如我们新建一个文件test_macro.cc。然后下面的命令做预编译。即可得到宏的真实定义。

2023-01-16 19:33:12 505

原创 tensorflow之graph_def

图是我们最熟悉的基本结构,从我们一开始使用tensorflow就会接触到这个概念,graph的类结构同样定义咋一个proto中tensorflow/core/framework/graph.proto。在文件tensorflow/core/graph/graph_def_builder.h 中是graphDef的定义中,除了proto定义的属性,还提供了一个子类options。在图构建完成以后,会把图做一些分割,相同的节点会放在一个子图中,然后在运行图的过程中,运行各个子图。

2023-01-13 19:39:41 510

原创 tensorflow 之 Node, NodeDef, NodeProperties

我们知道graph其实就是一张图,这张图的特殊之处在于,每个图下游个数不确定,而且图上每个节点的输出流入到哪个节点的顺序是固定的,例如图上节点1有output1 和 output2 ,那么output1 和output2 流向的节点是固定的,而不能反过来。input: 并非具体的input数值,是类似 的格式,node:src_output其中,node是输入节点的名称,src_output 是上个节点的第几个输出,例如"node:0"。node的主要属性有四个name,op,input,device。

2023-01-13 18:13:14 850

原创 tensorflow kernel注册

我们来看构造函数,Device函数, Build函数的定义。在宏中,调用了函数Name,然后是设置了device,然后调用了build(). 联想到opDefBuilder的用法,我们可以猜到,Name应该是生成了一个类似于kernelDefBuiler的对象,.Device() 函数类似于opDefBuilderWrapper中函数,返回对象自身,然后通过builder创建一个kernelDef 类。调用了函数 InitInternal,这个函数后面再讲,我们先弄明白几个入参的含义。

2023-01-11 15:55:07 490

原创 tensorflow的op注册源码精读

在自定义的算子时,经常遇到一些函数和宏,这里介绍一下常见的函数和宏。

2023-01-11 14:00:11 1062

原创 用cmake工具 自定义tensorflow算子

自定义tensorflow算子有两种方式:1. 下载tensorflow源码,在源码中添加cpp代码,然后编译安装。这种方法的优点是自定义的算子一起被打包进tensorflow,形式比较统一。当然缺点也很明显,其他人想调用该算子时,需要重新安装tensorflow2. 代码独立编译成动态链接库,然后再tensorflow中调用。这种方式的优点是非常灵活,编译开发的工作量比较小。还有一种方式是把算子编译成第三方库,这种方式一般比较少用,所以下面就第二种方式讲解一下自定义算子的过程。

2023-01-10 17:22:15 562 1

原创 cmake 工具 三 add_libary, set_target_properties,target_link_libary,link_directories, link_libary

一起通过一个例子学一下 add_libary, set_target_properties,link_libary, target_link_libary 四个命令首先创建如下的文件:其中 build用于cmake编译,防止大量编译的中间文件污染代码文件夹具体可见int_plus 的作用就是两个数相加,int_con就是两个数相减,特别简单,这里不放代码了。

2022-11-15 20:32:19 1935

原创 docker 快速入门

下面是自己的理解,可能不精准,但是非常有利于我自己理解和使用docker。这对于普通使用者来说足够了。有了这些基础的认知,我们再来看docker的一些命令就好理解了。

2022-11-13 22:44:05 5306

原创 c++ 中的pair和tuple

我们知道unordered_map的每一个键值对都回被当成pair来处理,这里简单介绍一下pair和tuple的用法。pair和tuple都是结构体,可以装载不同的数据类型。这两个数据结构最常见的用法是函数中返回多个值。pair 是可以讲不同数据类型组合成一个数据的结构体,因为只有2个数据所以整体用法非常简单。

2022-11-02 13:05:20 576

原创 c++ 常用STL 之unordered_map

中总结了关联式容器和set。这一篇介绍一下unordered_map的用法。之所以介绍unordered_map而不是map,是因为unordered_map在效率上有明显的优势|unordered_map还是从初始化,增,删,改, 查入手。

2022-11-01 22:56:57 954

原创 c++ 常用STL 之set

关联式容器则大不一样,此类容器在存储元素值的同时,还会为各元素额外再配备一个值(又称为“键”,其本质也是一个 C++ 基础数据类型或自定义类型的元素),它的功能是在使用关联式容器的过程中,如果已知目标元素的键的值,则直接通过该键就可以找到目标元素,而无需再通过遍历整个容器的方式。应用最灵活的还是用迭代器初始化,同样的,用迭代器初始化,不要求迭代器是set的迭代器,任何迭代器都可以。因为元素是有序的插入到set中的,所以,set是无序的,不能用下表或者at函数来取某一个值。size() 获取set的大小。

2022-11-01 13:02:44 1164

原创 c++ 匿名函数和lambda函数

对于只使用一次的函数对象类,能否直接在使用它的地方定义呢?使用 Lambda 表达式可以减少程序中函数对象类的数量,使得程序更加优雅。时,往往会大量用到函数对象,为此要编写很多函数对象类。有的函数对象类只用来定义了一个对象,而且这个对象也只使用了一次,编写这样的函数对象类就有点浪费。而且,定义函数对象类的地方和使用函数对象的地方可能相隔较远,看到函数对象,想要查看其 operator() 成员函数到底是做什么的也会比较麻烦。中也可以不使用定义在外面的变量。其中,“外部变量访问方式说明符”可以是。

2022-10-31 11:33:41 122

原创 c++ 常用STL 之vector

vector是一个有序容器,下面总结一下vector的用法,主要是初始化,增删改查四个方面。vector是c++ 最常用的容器之一,下面介绍一下一些比较常见的用法。

2022-10-30 21:10:58 552

原创 c++ 中头文件

而有了#ifdef 以后,在第二次复制的时候由于宏INT_PLUS_H已经存在,所以会认为int_plus.h文件是空的,不会重复复制。但实际写代码时,我们可能会调用非常多的函数,同一个函数也可能被不同的代码反复调用,每次调用我们都写一个同名函数不仅繁琐而且容易出错。我们只需要在主程序中定义一个同名的函数就行,在编译时,会把各个.cc文件全部编译成二进制,然后通过函数名链接起来。头文件是一个给出函数,对象、结构体的定义的文件,一般不在头文件中写具体的逻辑代码。例如在上面的例子中,会写成。..........

2022-08-08 22:39:16 2723

原创 CMAKE 工具 之 add_executable,include_directories和 AUX_SOURCE_DIRECTORY

在上一章里面,我们用cmake做了一个最简单的项目,这一节我们尝试一写比较常见的cmake配置。这次我们构建如下的目录结构。

2022-08-03 23:56:44 2050

原创 cmake 构建工具 一 hello world

指定需要编译的源文件指定头文件的搜索目录指定库文件的搜索目录需要链接的动态库和静态库指定需要额外定义的宏或者取消定义的宏来控制编译指定编译优化选项指定语言标准等等直接使用gcc/g++命令在使用代码文件不多,库直接的依赖关系不复杂的情况下是可以接受的。但是在一些大型项目中,源文件上千上万,各个文件和库直接的依赖关系复杂,如果还手动输入编译命令的话,复杂度就会变得很大。简单来讲,代码变成可执行文件,叫做编译(compile);

2022-07-18 09:57:30 1099

原创 kafka的数据分区和消费者数量的关系

kafka数据分区策略包括,轮询分区,随机分区,还有一些其他的分区策略,作为使用者,我们就不去深入探究了轮询策略也称 Round-robin 策略,即顺序分配。比如一个主题下有 3 个分区,那么第一条消息被发送到分区 0,第二条被发送到分区 1,第三条被发送到分区 2,以此类推。当生产第 4 条消息时又会重新开始,即将其分配到分区 0,就像下面这张图展示的那样。随机策略也称 Randomness 策略。所谓随机就是我们随意地将消息放置到任意一个分区上,如下面这张图所示。其中轮询分

2022-03-13 17:06:09 6899

原创 深入理解feature_column

此前对觉得feature_column用起来非常抽象,所以一直不想用。但是迁移到tf2 以后发现很多场景不得不用,所以深入研究了一下。本文从tensorflow的源码入手,分析了featurecolumn的用法。首先就是这张老生常谈的图:feature_coumn的根父类是FeatureColumn,从FeatureColumn 派生出两个子类categorical column 和 dense column。然后衍生出途中最下面的其他的子类。...

2022-03-08 23:19:42 2671

原创 c++ 中的符号* 和 &

* 和 & 是c++中非常常见的一对符号。但实际使用中有极其多的变化需要注意。先说* , 严格地说,符号*其实有2个作用:1. 当* 出现在声明变量或者函数的时候,意为该变量或者函数为一个指针2. 其他场景* 意为对变量取数值而不能单纯的把*理解成取值,否则会出现矛盾例如int a = 20;int *b = &a;std::cout << *b << std::endl;从第二行来看,我们把a的地址赋给了*b,但是明显第三行打印出来

2022-02-06 21:35:55 25126 4

原创 tf中的scope探索,以及tf.variable_scope和 tf.VariableScope的关系和区别

“withtf.variable_scope("scope_name") as vs:”上面这句是我们最常用的语句之一,用来定义一个域,以方便对变量进行操作,tf.variable_scope("scope_name") 会得到一个variable_scope的类。但是,如果我们用函数tf.get_variable_scope() 来获取当前域。会得到yyy = tf.variable_scope('scope_name')print(yyy)sss = tf.get_variable_.

2021-10-20 02:30:58 866

原创 os.path.join() 命令

拼接路径,后面的路径不能以"/" 开头,否则不会拼接

2020-09-10 10:56:46 233 1

原创 tf.keras.layers 和 tf.layers 的一个区别

创建全连接层的时候tf 1.15 提供了2个函数:tf.keras.layers.Dense和 tf.layers.Dense这2个函数的用法看上去一模一样tf.keras.layers.Dense( units, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regu...

2020-09-03 16:32:47 2977 1

原创 tensorflow 1.15 关于变量的一些思考

tensorflow 1.15 中有2种方法可以定义变量tf.Variable()tf.get_variable()具体用法不在赘述。他们的主要区别在于对于vriable重名的处理,如果tf.Variable() 遇到重名变量,则会在原来的变量名后面加上_1,_2......而get_vairable如果定义到重名变量,则会报错。无论是在后面加上后缀还是报错,我们都可以看出来,tensorflow 1.15 绝不允许出现重名变量,这是为什么呢?这是因为在tensorflow1.15

2020-08-31 17:17:25 611

原创 tensorflow 对tensor维度的理解和操作

tensorflow中经常对tensor的维度和维度操作感觉特别晕,今天做一个整理。首先tensor 的维度从外向里依次是第0维,第1维,第2维。。。。例如aaa = tf.constant([[[1,1,1,1,1,1],[2,2,2,2,2,2],[3,3,3,3,3,3]],[[1,1,1,1,1,1],[2,2,2,2,2,2],[3,3,3,3,3,3]]]最外层的括号里有2个元素[[1,1,1,1,1,1],[2,2,2,2,2,2],[3,3,3,3,3,3]]和[[1,1,

2020-08-30 23:12:29 3275

转载 【转载】tensorflow中的batch_norm以及tf.control_dependencies和tf.GraphKeys.UPDATE_OPS的探究

笔者近来在tensorflow中使用batch_norm时,由于事先不熟悉其内部的原理,因此将其错误使用,从而出现了结果与预想不一致的结果。事后对其进行了一定的调查与研究,在此进行一些总结。一、错误使用及结果笔者最先使用时只是了解到了在tensorflow中tf.layers.batch_normalization这个函数,就在函数中直接将其使用,该函数中有一个参数为training,在训练阶段赋值True,在测试阶段赋值False。但是在训练完成后,出现了奇怪的现象时,在training赋值为Tr

2020-08-30 17:36:35 765 1

原创 tensorflow 1.15一些命令

tf.assign这个函数很简单,但其实它是有return的,返回值和赋值相同,而且返回值是深度拷贝。global_step = tf.Variable(0, name='global_step', trainable=False)print("id_global",id(global_step))with tf.Session() as sess: sess.run(tf.global_variables_initializer()) print("global_step",

2020-08-28 15:52:07 831

原创 tensorflow 1.1x 和 tensorflow2.x 中的api总结

tensorflow2 发布以后,动态图和eager execution成为默认模式。同时api和命令都有了非常大的精简,tensorflow 1.1x的api混乱程度令人发指,如果tf不是谷歌出的,按照这种混乱度绝对成不了主流。尽管很多tensorflow 2 已经发布了很久,但是由于一些历史问题 1.1x 版本仍然有很多人在学习。这里结合两个版本的api,进行一个梳理,标注出一些 tf 2.x 已经被废弃或者不被建议使用的api,这类api在学习tensorflow1 的时候 尽量避开,以减少后

2020-08-27 11:07:43 942

原创 tf.nn.embedding_lookup_sparse 详解

tf.nn.embedding_lookup_sparse和tf.nn.embedding_lookup 都是用于embedding查表的函数。这2个函数跳过把特征onehoe,然后再用onehot的向量与embeedding矩阵做矩阵乘法的过程。下面来看他们的用法:tf.nn.embedding_lookup_sparse( params, sp_ids, sp_weights, combiner=None, max_norm=None, name=None) Args...

2020-08-24 12:41:59 6761 1

原创 tensorflow之dataset详解

dataset是什么?Dataset可以看作是相同类型“元素”的有序 列表。在实际使用时,单个“元素”可以是向量,也可以是字符串、图片,甚至是tuple或者dict。Dataset是google点名建议的读取数据的方式,所以在tf使用中有很重要的地位。这个描述其实已经描述了dataset,他是一个可迭代对象,而且是有序的,而且每个元素的类型相同。在工作中为了方便理解,我一般把它看作java中的List<T>,即声明了泛型的有序集合List。从python的角度看的话,就是规定了所有元素类

2020-08-20 16:46:08 8787

原创 tensorflow ImportError: DLL load failed: 已解决

这个问题多见于tensorflow 2.1以上,因为tensorflow默认调用gpu,所以以来一些动态链接文件,通过下面的链接下载Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017 and 2019. 安装即可解决问题注意:一定要是Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017 and 2019. 其他版本不管用。https://s..

2020-08-19 16:06:37 242

原创 tf.feature_column详解

在tensorflow2.0 环境下的tfrecord读写及tf.io.parse_example和tf.io.parse_single_example的区别中已经降到了从tfrecord 中读取数据需要提供一个dict,里面包含了特征名称和特征的类型,如果我们特征很少,只需要手写这个dict就可以。但是当特征非常多的时候,就需要更方便的工具来生成这个dict。这个工具的就是tf.feature_column,同时tf.feature_column也是一个特征工程的工具,可以用来自动one-ho...

2020-06-19 11:08:52 8540 3

原创 tensorflow2.0 环境下的tfrecord读写及tf.io.parse_example和tf.io.parse_single_example的区别

在文章tfrecord格式的内容解析及样例中我们已经分析了tfrecord 的内容是什么格式,接下来就要学习tfrecord怎么使用,及tfrecord的读写。生成tfrecordtfrecord文件的写入非常简单,仍然用tfrecord格式的内容解析及样例中的例子,我们首先生成一个examplevalue_city = u"北京".encode('utf-8') # 城市value_use_day = 7 #最近7天打开淘宝次数value..

2020-06-17 17:47:43 7721

原创 tfrecord格式的内容解析及样例

TFRecord 是谷歌推荐的一种二进制文件格式,理论上它可以保存任何格式的信息。tfreocrd的核心是其包含一系列的example,每个example可以认为是一条样本(鉴于很多地方样本概念模糊,这里的样本指label+特征)。example是tensorflow中的对象类型,用法是tf.train.example。tf.train.example 只有一个属性features。features也是tensorflow的一个对象类型tf.train.Features,tf.train.Featu

2020-06-16 11:32:18 3729

原创 shell对文本的操作

假设文件名为log统计行数 : wc -l log把每行文本按照某元素split,并逐行打印split后的元素:cat log | awk -F "\t" '{print $0}' $0或者省略$表示打印整行,$1表示打印第一个元素。实际上 "\t" 和空格不需要特殊的说明分隔符,直接cat log | awk '{print $1}' 和cat log | awk -F "\t"...

2019-10-25 16:18:52 324

原创 spark 的广播变量和持久化的使用场景

当一个RDD多次被使用的时候需要持久化,如果用到了partitionBy,则必须要进行持久化当一个RDD与其他RDD连接或者交互操作时需要加工广播变量

2019-10-25 11:09:48 559

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除