首页 > 技术文章 > TensorFlow 2

megachen 2021-06-01 11:01 原文

  • 数据类型
    • Tf.constant: 常量
    • Tf.bool
    • Tf.string
    • Tf.Variable(tensor): 使得tensor可以求导
  • tensor属性
    • Tensor.device: 查看设备
    • Tensor.gpu(): 切换设备
    • Tensor.cpu(): 切换设备
    • Tensor.numpy(): 返回numpy数据
    • Tensor.shape: 类型
    • Tensor.ndim: 维度
    • Tf.rank(): 范围维度
    • Tf.cast(tensor, dtype): dtype转换
    • Tf.is_tensor(data): 判断是否为tensor
    • Tensor.trainable: 是否可以训练, 这里的tensor一般为tf.Variable
  • numpy与tensor转换
    • Tf.convert_to_tensor(numpy, dtype)
    • Tensor.numpy()
    • Int(tensor)/float(tensor): 如果tensor.shape == ()
  • 创建tensor
    • Tf.constant(data)
    • Tf.convert_to_tensor(numpy)
    • Tf.random.normal(shape, mean, stddev)
    • Tf.random.truncated_normal(shape, mean, stddev)
    • Tf.random.uniform(shape)
    • Tf.random.shuffle(idx): idx进行shuffle
  • 切片
    • numpy一样
    • 选择切片
      • Tf.gather(a, b): 根据b给出的数据取a对应下表的数据
      • Tf.gather_nd(): nd表示多个维度
      • Tf.boolean_mask(tensor, masks, axis)
      • Tf.where(condition, a, b): conditionTrue, a, 否则b
  • 维度变换
    • Tf.reshape: 不改变数据,但是改变理解方式
    • Tf.transpose: 修改数据,从而修改TensorShape
    • Tf.expand_dims(tensor, axis)axis处增加1维度
    • Tf.squeeze: 去掉维度为1的
    • Tf.tile(tensor, []): 第二个参数表示各个维度需要复制的个数
    • Tf.broadcast_to(tensor, target): 将tensor维度和target一样并返回
    • Tf.pad(tensor, [[a, b], [c, d]]): tensor各个维度进行padding,第一个[a, b]是第一个维度,左边填充a0,右边填充b0,第二个是第二个维度,左边填充c0,右边填充d0
  • 拼接
    • Tf.concat
    • Tf.stack
    • Tf.split:一般用于交叉验证
  • 统计
    • Tf.norm(tensor, ord, axis)
    • Tf.reduce_max/min/avg/sum
    • Tf.argmax
  • 排序
    • Tf.sort
    • Tf.argsort
    • Tf.top_k
  • 裁切值
    • Tf.maximum
    • Tf.minimum
    • Tf.clip_by_value
    • Tf.clip_by_norm:常用于解决梯度爆炸
    • Tf.clip_by_global_norm
  • 其他
    • Tf.meshgrid
  • 内建激活
    • Tf.sigmoid
    • Tf.nn.softmax
    • Tf.nn.relu
  • 内建损失函数
    • Tf.losses.MSE
    • Tf.losses.categorical_crossentropy(target_one_hot, pred)或者tf.losses.categorical_crossentropy(target_one_hot, logits, from_logits=True)推荐使用第二种方式

   

  • Tf.losses.BinaryCrossEntropy()(target_one_hot, pred)
  • 自动微分
    • `tf.GradientTape`上下文中会构建动态图,使用tape.gradient计算梯度,但是上下文中不记录=赋值的tensor,需要使用tensor.assign进行赋值,或者再tf.Variable

   

  • 数据集
    • Tf.data.Dataset.from_tensor_slice((x, y)).shuffle(1000000000).map(preprocess_func(x, y)).batch(32)
    • Tf.keras.datasets.mnist.load_data()
  • 构建模型
    • `net = tf.keras.layer.Dense(10)` => `net.build(input_shape=(None, 32))` 这样net才会有weightbias
    • `net.summary()`net.build之后调用,可以看net结构
  • Tensorboard 使用
    • `summary_writer = tf.summary.create_file_writer(log_dir)`
    • `with summary_writer.as_default():`中写`tf.summary.scalar`和`tf.summary.image`
  • Keras
    • `compile`
    • `fit`
    • `evaluate`
    • `predict`
    • 自定义layer和model
      • 重写init和call,继承Layer或者Model类
    • 保存模型
      • `model.save_weights(path)`和`model.load_weights(path)`
      • `model.save(path)`和`tf.keras.models.load_model(path)`
    • 正则化
      • 在使用layers时,有参数kernel_regularizer=keras.regularizer.l2(lamda)
  • 注意
    • keras进行fit的时候,没有采用eager模式,而是采用静态图的模式,因此在train_step中很多操作都受到了限制
    • 如果想keras.fit采用eager模式,在compile之后,使用`model.run_eagerly = True`即可切换到eager模式

   

推荐阅读