TensorFlow 2
- 数据类型
- 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): condition为True, 取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]是第一个维度,左边填充a个0,右边填充b个0,第二个是第二个维度,左边填充c个0,右边填充d个0
- 拼接
- 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才会有weight和bias
- `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模式