【问题标题】:TensorFlow 2 Quantization Aware Training (QAT) with tf.GradientTapeTensorFlow 2 量化感知训练 (QAT) 与 tf.GradientTape
【发布时间】:2021-03-31 00:12:17
【问题描述】:

谁能指出可以学习如何在 TensorFlow 2 上使用 tf.GradientTape 执行量化感知训练 (QAT) 的参考资料?

我只看到使用 tf.keras API 完成此操作。我不使用tf. keras,我总是使用tf.GradientTape 构建自定义培训,以提供对培训过程的更多控制。我现在需要量化模型,但我只看到有关如何使用 tf. keras API 进行量化的参考。

【问题讨论】:

    标签: tensorflow keras quantization


    【解决方案1】:

    在官方示例here 中,他们展示了使用model. fit 进行的QAT 训练。这是一个使用tf.GradientTape()量化感知训练演示。但是为了完整的参考,让我们在这里做两个。


    基础模型训练。这直接来自official doc。更多详情,请查看那里。

    import os
    import tensorflow as tf
    from tensorflow import keras
    import tensorflow_model_optimization as tfmot
    
    # Load MNIST dataset
    mnist = keras.datasets.mnist
    (train_images, train_labels), (test_images, test_labels) = mnist.load_data()
    
    # Normalize the input image so that each pixel value is between 0 to 1.
    train_images = train_images / 255.0
    test_images = test_images / 255.0
    
    # Define the model architecture.
    model = keras.Sequential([
      keras.layers.InputLayer(input_shape=(28, 28)),
      keras.layers.Reshape(target_shape=(28, 28, 1)),
      keras.layers.Conv2D(filters=12, kernel_size=(3, 3), activation='relu'),
      keras.layers.MaxPooling2D(pool_size=(2, 2)),
      keras.layers.Flatten(),
      keras.layers.Dense(10)
    ])
    
    # Train the digit classification model
    model.compile(optimizer='adam',
                  loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
                  metrics=['accuracy'])
    model.summary()
    model.fit(
      train_images,
      train_labels,
      epochs=1,
      validation_split=0.1,
    )
    
    10ms/step - loss: 0.5411 - accuracy: 0.8507 - val_loss: 0.1142 - val_accuracy: 0.9705
    <tensorflow.python.keras.callbacks.History at 0x7f9ee970ab90>
    

    QAT .fit.

    现在,对基本模型执行 QAT

    # -----------------------
    # ------------- Quantization Aware Training -------------
    import tensorflow_model_optimization as tfmot
    
    quantize_model = tfmot.quantization.keras.quantize_model
    # q_aware stands for for quantization aware.
    q_aware_model = quantize_model(model)
    
    # `quantize_model` requires a recompile.
    q_aware_model.compile(optimizer='adam',
                  loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
                  metrics=['accuracy'])
    
    q_aware_model.summary()
    train_images_subset = train_images[0:1000] 
    train_labels_subset = train_labels[0:1000]
    q_aware_model.fit(train_images_subset, train_labels_subset,
                      batch_size=500, epochs=1, validation_split=0.1)
    
    
    356ms/step - loss: 0.1431 - accuracy: 0.9629 - val_loss: 0.1626 - val_accuracy: 0.9500
    <tensorflow.python.keras.callbacks.History at 0x7f9edf0aef90>
    

    检查性能

    _, baseline_model_accuracy = model.evaluate(
        test_images, test_labels, verbose=0)
    
    _, q_aware_model_accuracy = q_aware_model.evaluate(
       test_images, test_labels, verbose=0)
    
    print('Baseline test accuracy:', baseline_model_accuracy)
    print('Quant test accuracy:', q_aware_model_accuracy)
    
    Baseline test accuracy: 0.9660999774932861
    Quant test accuracy: 0.9660000205039978
    

    QATtf.GradientTape().

    这是基础模型上的 QAT 训练部分。请注意,我们还可以在基础模型上执行自定义训练。

    batch_size = 500
    
    train_dataset = tf.data.Dataset.from_tensor_slices((train_images_subset,
                                                         train_labels_subset))
    train_dataset = train_dataset.batch(batch_size=batch_size, 
                                        drop_remainder=False)
    
    loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
    optimizer = tf.keras.optimizers.Adam()
    
    for epoch in range(1):
        for x, y in train_dataset:
            with tf.GradientTape() as tape:
                preds = q_aware_model(x, training=True)
                loss = loss_fn(y, preds)
            grads = tape.gradient(loss, q_aware_model.trainable_variables)
            optimizer.apply_gradients(zip(grads, q_aware_model.trainable_variables))
            
    _, baseline_model_accuracy = model.evaluate(
        test_images, test_labels, verbose=0)
    
    _, q_aware_model_accuracy = q_aware_model.evaluate(
       test_images, test_labels, verbose=0)
    
    print('Baseline test accuracy:', baseline_model_accuracy)
    print('Quant test accuracy:', q_aware_model_accuracy)
    
    Baseline test accuracy: 0.9660999774932861
    Quant test accuracy: 0.9645000100135803
    

    【讨论】:

    • 感谢 M.Innat 的全面回答。我会试试你的建议并在这里报告。我遇到的问题是,我使用的模型仅建立在 TF 函数上,例如 tf.keras.layers.Dense,而不是 keras.Sequential。我什至不熟悉使用 keras.Sequential,尽管我知道它应该更容易。我要做的是将使用 tf.keras.layers.Dense 构建的模型翻译成 keras.Sequential,然后按照您的建议进行操作。
    • 欢迎提问。如果我能帮上忙,我肯定会的。 -)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    相关资源
    最近更新 更多