我正在使用
量化感知训练
我参考了网上的lstm代码,想放入
QAT
放入lstm,但是遇到了ValueError。
ValueError Traceback(最近一次调用last) 在<细胞系:6>() 4返回层 5 ----> 6 注释模型 = tf.keras.models.clone_model( 7 型号, 8clone_model(模型,input_tensors,clone_function)中的clone_function = apply_quantization_to_dense,
/usr/local/lib/python3.10/dist-packages/tf_keras/src/models/cloning.py 第544章 第545章 --> 546 引发值错误( 第547章 第548章收到类型为“Sequential”的模型,其中clone_function=<function apply_quantization_to_dense at 0x78b727ec4040>和input_tensors=None```
这是我的代码
Here's my code
import keras
from keras.layers import LSTM
from keras.layers import Dense, Activation
from keras.datasets import mnist
from keras.models import Sequential
from keras.optimizers import Adam
learning_rate = 0.001
training_iters = 20
batch_size = 128
display_step = 10
n_input = 28
n_step = 28
n_hidden = 128
n_classes = 10
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(-1, n_step, n_input)
x_test = x_test.reshape(-1, n_step, n_input)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
y_train = keras.utils.to_categorical(y_train, n_classes)
y_test = keras.utils.to_categorical(y_test, n_classes)
model = Sequential()
model.add(LSTM(n_hidden,
batch_input_shape=(None, n_step, n_input),
unroll=True))
model.add(Dense(n_classes))
model.add(Activation('softmax'))
adam = Adam(lr=learning_rate)
model.summary()
model.compile(optimizer=adam,
loss='categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train,
batch_size=batch_size,
epochs=training_iters,
verbose=1,
validation_data=(x_test, y_test))
scores = model.evaluate(x_test, y_test, verbose=0)
print('LSTM test score:', scores[0])
print('LSTM test accuracy:', scores[1])
def apply_quantization_to_dense(layer):
if isinstance(layer, tf.keras.layers.LSTM):
return tfmot.quantization.keras.quantize_annotate_layer(layer)
return layer
annotated_model = tf.keras.models.clone_model(
model,
clone_function=apply_quantization_to_dense,
)
qat_model = tfmot.quantization.keras.quantize_apply(annotated_model)
qat_model.summary()
错误信息“ValueError:仅顺序模型或功能模型支持参数 clone_function 和 input_tensors”表明,正尝试将
tf.keras.models.clone_model
与
clone_function
参数一起使用,而该参数仅适用于顺序模型或功能模型。当前的模型是一个顺序模型,但
clone_function
参数仅在想使用
tf.keras.models.clone_model
的功能性 API 时使用。
在的情况下,因为要对密集层进行量化,所以可以直接修改模型定义,而不是使用
clone_model
。以下是如何操作的方法:
import tensorflow_model_optimization as tfmot
# ...(的现有代码)...
# 创建模型
model = Sequential()
model.add(LSTM(n_hidden,
batch_input_shape=(None, n_step, n_input),
unroll=True))
# 对密集层应用量化
model.add(tfmot.quantization.keras.quantize_annotate_layer(Dense(n_classes)))
model.add(Activation('softmax'))
# ...(的现有代码)...
# 无需使用 clone_model,直接编译和训练量化模型
adam = Adam(lr=learning_rate)
model.summary()
model.compile(optimizer=adam,
loss='categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train,
batch_size=batch_size,
epochs=training_iters,
verbose=1,
validation_data=(x_test, y_test))
# ...(的现有代码)...
在此代码中:
-
我们直接在创建
Dense
层时使用tfmot.quantization.keras.quantize_annotate_layer
对其进行量化。 -
我们不再需要
apply_quantization_to_dense
函数,因为我们直接在模型定义中应用量化。 -
我们不再需要使用
clone_model
,因为我们直接修改原始模型。
通过这些更改,应该能够在的 LSTM 模型中使用量化感知训练,而不会遇到
ValueError
。请注意,可能需要根据的特定需求和 TensorFlow 版本调整量化过程。请参阅 TensorFlow 模型优化文档以获取最新信息和示例。