TensorFlow:常用函数介绍

2023-11-11

学习网址:Tensorflow中文社区 http://www.tensorfly.cn/

一、tensorflow框架笔记

1.Variable 

      一个Variable代表一个可修改的张量,存在在TensorFlow的用于描述交互性操作的图中。它们可以用于计算输入值,也可以在计算中被修改。对于各种机器学习应用,一般都会有模型参数,如w、b,可以用Variable表示。

2. session

Tensorflow依赖于一个高效的C++后端来进行计算。与后端的这个连接叫做session。

3.InteractiveSession 

InteractiveSession类,它能让你在运行图的时候,插入一些计算图,这些计算图是由某些操作(operations)构成的。

为了便于使用诸如 IPython 之类的 Python 交互环境, 可以使用 InteractiveSession 代替 Session 类,用Tensor.eval() 和 Operation.run() 方法代替 Session.run(). 这样可以避免使用一个变量来持有会话.

4. RNN

  • BasicRNNCell - 香草RNN细胞。
  • GRUCell- 门控复发单元。
  • BasicLSTMCell- 基于递归神经网络正则化的LSTM单元。没有窥视孔连接或细胞剪切。
  • LSTMCell - 一个更复杂的LSTM细胞,允许可选的窥视孔连接和细胞剪切。
  • MultiRNNCell - 将多个单元格组合成多层单元格的包装器。
  • DropoutWrapper - 一个包装添加到单元格的输入和/或输出连接丢失。
  • CoupledInputForgetGateLSTMCell- LSTMCell基于LSTM:搜索空间奥德赛的输入和忘记门的扩展。
  • TimeFreqLSTMCell - 基于建模时频模式的时频LSTM单元与LSTM与卷积结构的LVCSR任务
  • GridLSTMCell - 来自网格长期短期记忆的单元格。
  • AttentionCellWrapper- 将注意力集中在基于长期短期记忆网络的机器阅读的现有RNN小区上。
  • LSTMBlockCell- 一个更快的基本LSTM单元版本(注意:这个是在lstm_ops.py)

5. tf.nn.xw_plus_b()函数 

    相当于:tf.matmul(x, weights) + biases

tf.nn.xw_plus_b(
    x,
    weights,
    biases,
    name=None
)
  • x:2D Tensor。维度通常为:batch,in_units
  • weights:2D Tensor。维度通常为:in_units,out_units
  • biases:1D Tensor。维度为:out_units
  • name:操作的名称(可选)。如果未指定,则使用“xw_plus_b”。

6. 常用CNN

(1)tf.nn.atrous_conv2d()空洞卷积或者扩张卷积

     如何理解空洞卷积(dilated convolution)?

    其实用一句话概括就是:在不用pooling的情况下扩大感受野(pooling层会导致信息损失)

7. 区别

普通会话:

sess = tf.Session()

sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

 交互式会话:

sess = tf.InteractiveSession()

# Operation.run() 
train_step.run(feed_dict={x: batch[0], y_: batch[1]})

# Tensor.eval() 
accuracy.eval(feed_dict={x: mnist.test.images, y_: mnist.test.labels})

8. dropout--tf.placeholder()

用一个placeholder来代表一个神经元的输出在dropout中保持不变的概率。这样我们可以在训练过程中启用dropout,在测试过程中关闭dropout。

keep_prob = tf.placeholder("float")
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

 9.feed_dict中加入额外的参数keep_prob来控制dropout比例

for i in range(20000):
  batch = mnist.train.next_batch(50)

  # 每100轮,检测下精度:测试过程中关闭dropout
  if i%100 == 0:
    train_accuracy = accuracy.eval(feed_dict={
        x:batch[0], y_: batch[1], keep_prob: 1.0})
    print("step %d, training accuracy %g"%(i, train_accuracy))

  train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})  # 训练过程中启用dropout

# 训练过程中关闭dropout
print("test accuracy %g"%accuracy.eval(feed_dict={
    x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))

10.tensorflow.compat.v1

TensorFlow 2.0中提供了tensorflow.compat.v1代码包来兼容原有1.x的代码,可以做到几乎不加修改的运行。 TensorFlow 2.0中提供了命令行迁移工具,来自动的把1.x的代码转换为2.0的代码。

参考:https://cloud.tencent.com/developer/article/1414830

11. 保存检查点(checkpoint):加载、恢复模型

为了得到可以用来后续恢复模型以进一步训练或评估的检查点文件(checkpoint file),我们实例化一个tf.train.Saver

saver = tf.train.Saver()

在训练循环中,将定期调用saver.save()方法,向训练文件夹中写入包含了当前所有可训练变量值得检查点文件。

saver.save(sess, FLAGS.train_dir, global_step=step)

这样,我们以后就可以使用saver.restore()方法,重载模型的参数,继续训练。

saver.restore(sess, FLAGS.train_dir)

tf.train.Saver类

       功能:保存和恢复变量

       有关变量,保存和恢复的概述,请参见变量

       将Saver类添加ops 从而在checkpointes里save和restore变量 。它还提供了运行这些操作的便捷方法。

       Checkpoints是专有格式的二进制文件,它将变量名称映射到张量值。测试Checkpoints内容的最佳方式是使用Saver来加载。

        Savers可以使用提供的计数器自动为Checkpoint文件名编号,这使您可以在训练模型时在不同的步骤中保留多个Checkpoints。例如,您可以使用训练步骤编号对Checkpoint文件名进行编号。为避免填满磁盘,储存器会自动管理Checkpoint文件。例如,他们只能保留N个最新文件,或每N小时训练一个Checkpoint。

  • max_to_keep:表示要保留的最近文件的最大数量。创建新文件时,将删除旧文件。如果为None或0,则不会从文件系统中删除任何Checkpoint,但只有最后一个Checkpoint保留在checkpoint文件中。默认为5(即保留最近的5个Checkpoint文件。)
  • keep_checkpoint_every_n_hours:除了保留最新的 max_to_keep检查点文件之外,您可能还希望每N小时的训练保留一个Checkpoint文件。如果您想稍后分析模型在长时间训练期间的进展情况,这将非常有用。例如,传递keep_checkpoint_every_n_hours=2确保每2小时训练保留一个检查点文件。默认值10,000小时可有效禁用该功能。

12. tf.contrib.crf

(1)tf.contrib.crf.crf_log_likelihood()

        在一个条件随机场里面计算标签序列的log-likelihood

        函数的目的:使用crf 来计算损失,里面用到的优化方法是:最大似然估计

参数:max_seq_len = 一个句子的字数

  • inputs: 一个形状为 [batch_size, max_seq_len, num_tags] 的tensor,也就是每个标签的预测概率值,这个值根据实际情况选择计算方法,CNN,RNN...都可以,一般使用BILSTM处理之后输出转换为他要求的形状作为CRF层的输入。
  • ​​​tag_indices: 一个形状为[batch_size, max_seq_len] 的矩阵,其实就是真实标签序列
  • sequence_lengths:一个形状为[batch_size] 的向量,表示batch中每个序列的长度。这是一个样本真实的序列长度,因为为了对齐长度会做些padding,但是可以把真实的长度放到这个参数里
  • transition_params: 形状为[num_tags, num_tags] 的转移矩阵,可以没有,没有的话这个函数也会算出来。

返回:

  • log_likelihood: 标量,log-likelihood
  • transition_params: 形状为[num_tags, num_tags] 的转移矩阵,转移概率,如果输入没输,它就自己算个给返回。

示例代码https://www.cnblogs.com/lovychen/p/8490397.html

(2)tf.contrib.crf.viterbi_decode

          viterbi_decode(score,transition_params) 
         通俗一点,作用就是返回最好的标签序列,这个函数只能够在测试时使用,在tensorflow外部解码。

参数:

  • score: 一个形状为[seq_len, num_tags] matrix of unary potentials. 
    transition_params: 形状为[num_tags, num_tags] 的转移矩阵
    

返回:

  • viterbi: 一个形状为[seq_len] 显示了最高分的标签索引的列表. 
    viterbi_score: A float containing the score for the Viterbi sequence.

(3)tf.contrib.crf.crf_decode

crf_decode(potentials,transition_params,sequence_length) 
        在tensorflow内解码

参数:

  • potentials: 一个形状为[batch_size, max_seq_len, num_tags] 的tensor,
  • transition_params: 一个形状为[num_tags, num_tags] 的转移矩阵
  • sequence_length: 一个形状为[batch_size] 的 ,表示batch中每个序列的长度

返回:

  • decode_tags:一个形状为[batch_size, max_seq_len] 的tensor,类型是tf.int32,表示最好的序列标记。
  • best_score: 一个形状为[batch_size] 的tensor,包含每个序列解码标签的分数。

13. Early stopping早停止

       tf.contrib.estimator.stop_if_no_decrease_hook()

tf.contrib.estimator.stop_if_no_decrease_hook(
    estimator,
    metric_name,
    max_steps_without_decrease,
    eval_dir=None,
    min_steps=0,
    run_every_secs=60,
    run_every_steps=None
)

其中metric_name用来指明监控的变量(比如loss或者accuracy) 

二. tf 常用函数

1.tf.argmax ()

tf.argmax是一个非常有用的函数,它能给出某个tensor对象在某一维上的其数据最大值所在的索引值。

2. tf.cast()

    把布尔值转换成浮点数,如

tf.cast(correct_prediction, "float")

[True, False, True, True] 会变成 [1,0,1,1]

3.tf.truncated_normal()

tf.truncated_normal初始函数将根据所得到的均值和标准差,生成一个随机分布,从截断的正态分布中输出随机值。

tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)

        从截断的正态分布中输出随机值。 shape表示生成张量的维度,mean是均值,stddev是标准差。这个函数产生正太分布,均值和标准差自己设定。这是一个截断的产生正太分布的函数,就是说产生正太分布的值如果与均值的差值大于两倍的标准差,那就重新生成。和一般的正太分布的产生随机数据比起来,这个函数产生的随机数与均值的差距不会超过两倍的标准差,但是一般的别的函数是可能的。

4. tf.reverse反序

    import tensorflow as tf
    import numpy as np
    t=[[1,2,3],[4,5,6]]
    t0=tf.reverse(t,[0])
    t1=tf.reverse(t,[1])
    t21=tf.reverse(t,[0,1])
    t22=tf.reverse(t,[1,0])
    sess=tf.Session()
    print(sess.run(t0))
    print(sess.run(t1))
    print(sess.run(t21))
    print(sess.run(t22))

运行结果如下: 

按行(axis=0)变换,上下行交换位置
[[4 5 6]
[1 2 3]]
axis=1按照横轴变换,前后列交换位置
[[3 2 1]
[6 5 4]]
先纵轴变换,后横轴变换
[[6 5 4]
[3 2 1]]
先横轴后纵轴变换
[[6 5 4]
[3 2 1]]

5. tf.concat()

tensorflow中用来拼接张量的函数tf.concat(),用法:

tf.concat([tensor1, tensor2, tensor3,...], axis)

先给出tf源代码中的解释:

  t1 = [[1, 2, 3], [4, 5, 6]]
  t2 = [[7, 8, 9], [10, 11, 12]]
  tf.concat([t1, t2], 0)  # [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]
  tf.concat([t1, t2], 1)  # [[1, 2, 3, 7, 8, 9], [4, 5, 6, 10, 11, 12]]
 
  # tensor t3 with shape [2, 3]
  # tensor t4 with shape [2, 3]
  tf.shape(tf.concat([t3, t4], 0))  # [4, 3]
  tf.shape(tf.concat([t3, t4], 1))  # [2, 6]

   这里解释了当axis=0和axis=1的情况,怎么理解这个axis呢?其实这和numpy中的np.concatenate()用法是一样的。

  • axis=0     代表在第0个维度拼接
  • axis=1     代表在第1个维度拼接 

     对于一个二维矩阵,第0个维度代表最外层方括号所框下的子集,第1个维度代表内部方括号所框下的子集。维度越高,括号越小。

对于这种情况,我可以再解释清楚一点: 

        对于[ [ ], [ ]]和[[ ], [ ]],低维拼接等于拿掉最外面括号,高维拼接是拿掉里面的括号(保证其他维度不变)。注意:tf.concat()拼接的张量只会改变一个维度,其他维度是保存不变的。比如两个shape为[2,3]的矩阵拼接,要么通过axis=0变成[4,3],要么通过axis=1变成[2,6]。改变的维度索引对应axis的值。

这样就可以理解多维矩阵的拼接了,可以用axis的设置来从不同维度进行拼接。 

       对于三维矩阵的拼接,自然axis取值范围是[0, 1, 2]。

       对于axis等于负数的情况:

       负数在数组索引里面表示倒数(countdown)。比如,对于列表ls = [1,2,3]而言,ls[-1] = 3,表示读取倒数第一个索引对应值。

axis=-1表示倒数第一个维度,对于三维矩阵拼接来说,axis=-1等价于axis=2。同理,axis=-2代表倒数第二个维度,对于三维矩阵拼接来说,axis=-2等价于axis=1。

       一般在维度非常高的情况下,我们想在最'高'的维度进行拼接,一般就直接用countdown机制,直接axis=-1就搞定了。

6. tf.app.run()

      解析命令行参数,调用main 函数 main(sys.argv)

7. tf.ConfigProto()

    主要的作用是配置tf.Session的运算方式,比如gpu运算或者cpu运算

     https://blog.csdn.net/u012436149/article/details/53837651

     https://blog.csdn.net/qq_31261509/article/details/79746114

8. tf.train.get_checkpoint_state

     函数功能:找出训练时保存的模型,其中有model_checkpoint_path和all_model_checkpoint_paths两个属性

   ckpt.model_checkpoint_path:可以找出所有模型中最新的模型

   ckpt.all_model_checkpoint_paths:可以找出所有模型

 tf.train.checkpoint_exists(...): 检查是否存在具有指定前缀的V1或V2检查点(弃用)。

9. tensorflow之计算梯度minimize和梯度修剪:compute_gradients与apply_gradients

9.1 minimize的使用

opt = tf.tf.train.GradientDescentOptimizer(learning_rate=0.1)
train_op = opt.minimize(loss)

        minimize的内部存在两个操作:(1)计算各个变量的梯度 (2)用梯度更新这些变量的值

def minimize(self, loss, global_step=None, var_list=None, name=None):
 
    grads_and_vars = self.compute_gradients(loss, var_list=var_list)
 
    vars_with_grad = [v for g, v in grads_and_vars if g is not None]

    if not vars_with_grad:
      raise ValueError(
          "No gradients provided for any variable, check your graph for ops"
          " that do not support gradients, between variables %s and loss %s." %
          ([str(v) for _, v in grads_and_vars], loss))
 
    return self.apply_gradients(grads_and_vars, global_step=global_step, name=name)

9.2 梯度修剪:主要避免训练梯度爆炸和消失问题

  tf.train.XXXOptimizer

  apply_gradientscompute_gradients是所有的优化器都有的方法。

(1)computer_gradients(loss, val_list)

      计算出各个变量的偏导数(梯度),是为了防止梯度爆炸和梯度消失。通过对gradient的修正,来进行避免。

      val_list:进行求偏导的变量的列表,默认为graph中收集的变量列表

compute_gradients(
    loss,
    var_list=None,
    gate_gradients=GATE_OP,
    aggregation_method=None,
    colocate_gradients_with_ops=False,
    grad_loss=None
)

   计算loss中可训练的var_list中的梯度,相当于minimize()的第一步返回(gradient, variable)对的list

(2)apply_gradients(grads_and_vars, global_step=None, name=None)

        该函数的作用是将compute_gradients()返回的值作为输入参数对variable进行更新。

apply_gradients(
    grads_and_vars,
    global_step=None,
    name=None
)

   minimize()的第二部分,返回一个执行梯度更新的ops。 

(3)tf.clip_by_value

      输入一个张量t,把t中的每一个元素的值都压缩在clip_value_min和clip_value_max之间。小于min的让它等于min,大于max的元素的值等于max。

tf.clip_by_value(
    t,                 # grad
    clip_value_min,
    clip_value_max,
    name=None          # val
)

例子: 

#Now we apply gradient clipping. For this, we need to get the gradients,
#use the `clip_by_value()` function to clip them, then apply them:

threshold = 1.0
optimizer = tf.train.GradientDescentOptimizer(learning_rate)
grads_and_vars = optimizer.compute_gradients(loss)

#list包括的是:梯度和更新变量的元组对
capped_gvs = [(tf.clip_by_value(grad, -threshold, threshold), var) 
             for grad, var in grads_and_vars]

#执行对应变量的更新梯度操作
training_op = optimizer.apply_gradients(capped_gvs)

(4)tf.clip_by_norm

指对梯度进行裁剪,通过控制梯度的最大范式,防止梯度爆炸的问题,是一种比较常用的梯度规约的方式。

tf.clip_by_norm(
    t,
    clip_norm,  # 裁剪率
    axes=None,
    name=None
)

       其作用在于将传入的梯度张量t的L2范数进行了上限约束,约束值即为clip_norm,如果t的L2范数超过了clip_norm,则变换为t * clip_norm / l2norm(t),如此一来,变换后的t的L2范数便小于等于clip_norm了。

10. tf.reduce_sum()之类函数

(1)tf.reduce_sum() 求和函数,在 tensorflow 里面,计算的都是 tensor,可以通过调整 axis =0,1 的维度来控制求和维度

reduce_sum ( 
    input_tensor , 
    axis = None , 
    keep_dims = False , 
    name = None , 
    reduction_indices = None
 )
  • input_tensor:要减少的张量,应该有数字类型。
  • axis:表示在那个维度进行sum操作。
  • keep_dims:如果为true,则保留长度为1的缩小尺寸。表示是否保留原始数据的维度,False相当于执行完后原始数据就会少一个维度
  • name:操作的名称(可选)。
  • reduction_indices:axis的废弃的名称。为了跟旧版本的兼容,现在已经不使用了。

      tf.reduce_sum函数中reduction_indices参数表示函数的处理维度。
          reduction_indices参数的值默认的时候为None,默认把所有的数据求和,即结果是一维的。
          reduction_indices参数的值为0,是第0维对应位置相加。
          reduction_indices参数的值为1,是第1维对应位置相加。
返回值及注意:

       此函数计算一个张量的各个维度上元素的总和。v
       函数中的input_tensor是按照axis中已经给定的维度来减少的;除非 keep_dims 是true,否则张量的秩将在axis的每个条目中减少1;如果keep_dims为true,则减小的维度将保留为长度1。
      如果axis没有条目,则缩小所有维度,并返回具有单个元素的张量.

11. tf.assign()

     tf.assign(A, new_number): 这个函数的功能主要是把A的值变为new_number

12.logging模块

参考:https://www.cnblogs.com/liujiacai/p/7804848.html

logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点:

  1. 可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息;
  2. print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出。

13.  model.char_lookup.read_value()、model.char_lookup.assign(emb_weights)

      read_value()、assign()是tf.Variable的函数

参考:变量常量类型 https://blog.csdn.net/xierhacker/article/details/53103979

assign(value, use_locking=False)

作用:为变量指定一个新的值

read_value()

作用:返回这个变量的值,在当前的上下文中读取。返回的是一个含有这个值的Tensor

14. tf.train.import_meta_graph

import_meta_graph(
 meta_graph_or_file,
 clear_devices=False,
 import_scope=None,
 **kwargs
)

从文件中将保存的graph的所有节点加载到当前的default graph中,并返回一个saver。也就是说,我们在保存的时候,除了将变量的值保存下来,其实还有将对应graph中的各种节点保存下来,所以模型的结构也同样被保存下来了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TensorFlow:常用函数介绍 的相关文章

随机推荐

  • C#初级知识——List和Dictionary(一些笔记)

    C 初级知识 List和Dictionary 一些笔记 文章目录 C 初级知识 List和Dictionary 一些笔记 前言 一 什么是集合结构 二 List集合 1 介绍 2 语法相关 1 创建List泛型集合 2 集合数据操作 3 L
  • linux安装tcpdump

    1 官网下载tcpdump和libpcap压缩包 登录 https www tcpdump org index html latest releases 2 安装相关依赖库 1 yum y install gcc c 2 yum y ins
  • QT ui设计师界面常用操作记录(QTabWidget)

    目录 1 QTabWidget 怎么删除已加入的tab页 怎么修改tab页的名字 1 QTabWidget 怎么删除已加入的tab页 如图所示原来有四个 现在我要删除两个 直接在你要删除的tab页右键 会出现两个选项 选择删除 即可删除 完
  • 2021年四川省大学生网络安全技能大赛EZSQL

    题目一 EZSQL 操作内容 考点 MYSQL8新特性 fuzz之后发现 只能盲注 过滤了select 使用1 and ascii substr database 1 1 gt num 可以盲注出数据库 但是后面就搞不动了 无select注
  • Derby数据库简介

    一 Derby 数据库介绍 Apache Derby 是一个完美的 100 Java 编写的内存数据库 属于 Apache 的一个开源项目 并且是一个容易管理的关系数据库管理系统 可以和一些商业产品的特性进行交付 Apache Derby
  • QT模态与非模态

    含义 模态对话框 Modal Dialog 与非模态对话框 Modeless Dialog 的概念不是Qt所独有的 在各种不同的平台下都存在 又有叫法是称为模式对话框 无模式对话框等 模态窗体是指 在其没有被关闭之前 用户不能与同一个应用程
  • 一次性纸杯包含的测试点

    功能方面 是否能盛水 性能 能盛多少水 能盛多少度的热水和冰水 是否容易变形 是否有隔热性能 杯底设计是否稳固不易倾斜 能够叠加多少个杯子 是否能重复使用 能够使用多少次 杯子的厚度和重量是否符合需求 是否容易被风吹倒 能够存放多少时间 安
  • IDEA 查找第三方jar里的内容

    1 Find in Path Edit gt Find gt Find in Path Scope gt Project and Libraries 说明 maven工程 貌似要下载jar source才行 2 double shift 这
  • MySQL--Group by分组与count计数(进阶)

    MySQL Group by分组与count计数 进阶 1 Group by语法 2 创建表格 3 题目代码部分 4 文末彩蛋 开心一刻 更多关于数据库知识请加关注哟 若需联系和想安装MySQL请加博主 QQ 3327908431 微信 Z
  • 具有对称性质的单参数混沌镜像系统的切换控制

    近年来 混沌已经应用到许多工程领域 例如 信息科学 复杂神经网络 信号处理 通信保密等 因此 许多学者一直探索新的混沌动力学 一些简单的光滑三维二次连续自治系统能生成混沌 1994年 Sportt提出了19个简单的混沌系统 每个系统仅有5项
  • 写一段ocr文字识别的具体实现代码

    OCR文字识别的具体实现代码如下 import cv2 读取图片 img cv2 imread example png 将图片转换为灰度图 gray cv2 cvtColor img cv2 COLOR BGR2GRAY 用Threshol
  • 串——顺序结构

    include
  • Unleashing the Power of Graph Learning through LLM-based Autonomous Agents

    本文是LLM系列文章 针对 Unleashing the Power of Graph Learning through LLM based Autonomous Agents 的翻译 通过基于LLM的自动Agent释放图学习的力量 摘要
  • mysql.的常用命令

    常用功能命令 1 导出整个数据库 1mysqldump u 用户名 p default character set latin1 数据库名 导出的文件名 数据库默认编码是latin1 23mysqldump u wcnc p smgp ap
  • LeetCode题目笔记——1566. 重复至少 K 次且长度为 M 的模式

    文章目录 题目描述 题目难度 简单 方法一 模拟 代码 C 总结 题目描述 给你一个正整数数组 arr 请你找出一个长度为 m 且在数组中至少重复 k 次的模式 模式 是由一个或多个值组成的子数组 连续的子序列 连续 重复多次但 不重叠 模
  • 数据结构学习——链表(C语言版)

    数据结构学习 链表的简单解析 一 何为链表 1 概念 2 特点 二 链表的简单实现 1 头插法 2 尾插法 3 模拟学生管理系统 一 何为链表 1 概念 链表 Linked list 是一种常见的基础数据结构 是一种线性表 但是并不会按线性
  • 公司新招了几个00后,我愿称之为卷王之王

    前几天我们公司一下子也来了几个新人 这些年轻人是真能熬啊 本来我们几个老油子都是每天稍微加会班就打算走了 这几个新人一直不走 搞得我们也不好走 2023年秋招就要开始了 最近内卷严重 各种跳槽裁员 相信很多小伙伴也在准备今年的金九银十的面试
  • java spring boot 判断用户、客户端是移动端,还是pc端

    一 设计流程 一 创建一个API 用这个API的地址 生成二维码图片 这个图片给用户扫的 二 创建二维码链接信息 例 安卓跳转到baidu com ios跳转到taobao com 三 后端系统在用户扫描后 判断用户系统 并跳转到相应地址
  • Python实现删除某列中含有空值的行

    客户需求 查看销售人员不为空值的行 数据存储情况如图 代码实现 import pandas as pd data pd read excel test xlsx sheet name Sheet1 datanota data data 销售
  • TensorFlow:常用函数介绍

    学习网址 Tensorflow中文社区 http www tensorfly cn 一 tensorflow框架笔记 1 Variable 一个Variable代表一个可修改的张量 存在在TensorFlow的用于描述交互性操作的图中 它们