[tensorflow]高级/中级/低级api(划分和介绍)

4 阅读4分钟

让我详细解释TensorFlow的API层次结构:

1/TensorFlow API层次结构

<1>高级API - 最高抽象层

# 主要模块
- tf.keras        # 最高级的模型构建API
- tf.estimator    # 简化的工作流程(旧版)

<2>中级API - 你提到的这些模块

# 这些不是"低级"API,而是中级API
- tf.data     # 数据管道(封装了复杂的队列、多线程等)
- tf.image    # 图像处理(封装了底层图像操作)
- tf.io       # 文件I/O(封装了底层文件操作)
- tf.nn       # 神经网络核心组件(中间层抽象)
- tf.layers   # 层抽象(已废弃,大部分并入keras)

<3>低级API - 最底层的操作

# 真正的低级API
- tf.raw_ops          # 原始的C++操作包装
- tf.Tensor           # 张量对象
- tf.Operation        # 计算图操作
- tf.Graph            # 计算图
- tf.Session          # 执行环境(TensorFlow 1.x风格)

2/中级 vs 低级API的对比示例

<1>中级API示例(tf.data)

import tensorflow as tf

# 中级API:简洁易用,隐藏了底层复杂性
dataset = tf.data.Dataset.range(10)
dataset = dataset.batch(3)  # 一行代码完成批处理

for batch in dataset:
    print(batch.numpy())

<2>低级API实现相同功能

import tensorflow as tf
import threading
import queue

# 低级API:需要手动管理更多细节
class CustomBatchDataset:
    def __init__(self, data, batch_size):
        self.data = data
        self.batch_size = batch_size
        self.queue = queue.Queue()
        self.thread = threading.Thread(target=self._produce_batches)
        self.thread.start()
    
    def _produce_batches(self):
        for i in range(0, len(self.data), self.batch_size):
            batch = tf.constant(self.data[i:i+self.batch_size])
            self.queue.put(batch)
        self.queue.put(None)  # 结束信号
    
    def __iter__(self):
        while True:
            batch = self.queue.get()
            if batch is None:
                break
            yield batch

# 使用低级API的实现
data = list(range(10))
custom_dataset = CustomBatchDataset(data, 3)

for batch in custom_dataset:
    print(batch.numpy())

3/详细分类表

类别模块/类特点使用场景
高级APItf.keras.Model声明式编程,最少代码快速原型、标准模型
tf.keras.Sequential简单线性堆叠简单网络结构
tf.keras.layers.*预定义层标准神经网络层
中级APItf.data.Dataset数据管道抽象数据预处理和加载
tf.image.*图像操作封装图像增强和转换
tf.io.*文件I/O抽象读写不同格式数据
tf.nn.*神经网络操作自定义层和操作
tf.losses.*损失函数自定义损失
低级APItf.Tensor多维数组对象所有计算的基石
tf.Operation计算节点图构建
tf.Graph计算图静态图定义
tf.Session执行上下文TensorFlow 1.x执行
tf.raw_ops.*原始操作直接调用C++操作

4/实际开发中的选择策略

import tensorflow as tf
import numpy as np

def create_model_with_different_apis(input_shape, num_classes):
    """
    演示使用不同级别API构建模型
    """
    
    # 1. 高级API (推荐)
    def high_level_api():
        model = tf.keras.Sequential([
            tf.keras.layers.Dense(64, activation='relu'),
            tf.keras.layers.Dense(num_classes, activation='softmax')
        ])
        return model
    
    # 2. 中级API (更多控制)
    def mid_level_api():
        class CustomModel(tf.keras.Model):
            def __init__(self):
                super().__init__()
                # 使用中级API的层
                self.dense1 = tf.keras.layers.Dense(64)
                self.dense2 = tf.keras.layers.Dense(num_classes)
                
            def call(self, inputs):
                # 使用tf.nn进行自定义激活
                x = tf.nn.relu(self.dense1(inputs))
                # 使用tf.math进行自定义操作
                x = self.dense2(x)
                return tf.nn.softmax(x)
        
        return CustomModel()
    
    # 3. 混合API (高级+中级)
    def hybrid_api():
        inputs = tf.keras.Input(shape=input_shape)
        
        # 高级API层
        x = tf.keras.layers.Dense(64)(inputs)
        
        # 中级API操作
        x = tf.nn.relu(x)
        x = tf.keras.layers.Dropout(0.5)(x)
        
        # 自定义操作 (中级)
        x = tf.keras.layers.Dense(num_classes)(x)
        outputs = tf.nn.softmax(x)
        
        return tf.keras.Model(inputs=inputs, outputs=outputs)
    
    # 4. 接近低级API的实现 (不推荐日常使用)
    def near_low_level_api():
        # 手动管理变量和操作
        W1 = tf.Variable(tf.random.normal([input_shape[0], 64]))
        b1 = tf.Variable(tf.zeros([64]))
        W2 = tf.Variable(tf.random.normal([64, num_classes]))
        b2 = tf.Variable(tf.zeros([num_classes]))
        
        @tf.function
        def model_fn(x):
            # 使用tf.linalg.matmul而不是tf.matmul
            h1 = tf.linalg.matmul(x, W1) + b1
            h1 = tf.nn.relu(h1)
            logits = tf.linalg.matmul(h1, W2) + b2
            return tf.nn.softmax(logits)
        
        return model_fn
    
    return {
        'high_level': high_level_api(),
        'mid_level': mid_level_api(),
        'hybrid': hybrid_api(),
        'near_low': near_low_level_api()
    }

# 测试不同API级别的模型
models = create_model_with_different_apis((784,), 10)
test_input = tf.random.normal((32, 784))

for name, model in models.items():
    print(f"\n{name} API:")
    if callable(model):
        output = model(test_input)
    else:
        output = model.predict(test_input, verbose=0)
    print(f"Output shape: {output.shape}")

5/总结判断标准

中级API的特征:

  1. 有明确的抽象(如Dataset、ImageProcessor)
  2. 隐藏了底层并发、内存管理等细节
  3. 提供便捷的方法和配置选项
  4. 仍然相对易用但比高级API更灵活

低级API的特征:

  1. 直接操作计算图、张量、会话
  2. 需要手动管理资源
  3. 代码更冗长但控制更精细
  4. 通常用于框架开发或特殊需求

你的理解:

  • 基本正确:tf.data、tf.image、tf.io确实比keras"低级"
  • 不够精确:它们不是真正的"低级API",而是"中级API"
  • 💡 更好表述:它们是领域特定的中级API,提供了比原始操作更高级的抽象,但比全功能模型API更低级

在实际开发中,通常的路径是:先用高级API(keras)快速实现,遇到限制时用中级API(tf.data, tf.nn等)增强功能,极少情况下才需要用到低级API。