Python 如何禁用“警告”;tensorflow:方法(在\u列\u批处理\u端)与批处理更新()相比速度较慢。请检查您的回电;
我正在尝试以keras风格使用tensorflow 2.0实现,因此我需要每一步更新SWA模型权重。我已经编写了一个自定义回调来实现这一点,但我每一步都会收到警告。以下是一些细节: 我的自定义回调:Python 如何禁用“警告”;tensorflow:方法(在\u列\u批处理\u端)与批处理更新()相比速度较慢。请检查您的回电;,python,tensorflow,keras,warnings,tensorflow2.0,Python,Tensorflow,Keras,Warnings,Tensorflow2.0,我正在尝试以keras风格使用tensorflow 2.0实现,因此我需要每一步更新SWA模型权重。我已经编写了一个自定义回调来实现这一点,但我每一步都会收到警告。以下是一些细节: 我的自定义回调: 类CustomCallback(tf.keras.callbacks.Callback): 定义初始值(自、有效数据、输出路径、swaα=0.99、每评估一次=500、评估批次=16、折叠=无): self.valid\u输入=有效的\u数据[0] self.valid\u输出=有效的\u数据[1
类CustomCallback(tf.keras.callbacks.Callback):
定义初始值(自、有效数据、输出路径、swaα=0.99、每评估一次=500、评估批次=16、折叠=无):
self.valid\u输入=有效的\u数据[0]
self.valid\u输出=有效的\u数据[1]
self.eval\u batch=eval\u batch
self.swa_alpha=swa_alpha
self.fold=折叠
self.output\u path=输出路径
self.rho_值=-1#记录报告的最佳rho
self.eval\u every=eval\u every
列车上的def开始(self,logs={}):
self.swa_weights=self.model.get_weights()
批处理端上的def(self、batch、logs={}):
#更新swa参数
alpha=最小值(1-1/(批次+1),自清洗alpha)
当前_权重=self.model.get_权重()
对于i,枚举中的层(self.model.layers):
self.swa_权重[i]=alpha*self.swa_权重[i]+(1-alpha)*当前_权重[i]
#验证
如果批次>0且批次%self.eval_every==0:
#验证
val\u pred=self.model.predict(self.valid\u输入,批次大小=self.eval\u批次)
rho_val=compute_spearmanr(self.valid_outputs,val_pred)#度量
#设置swa参数并进行验证
self.model.set_权重(self.swa_权重)
swa_val_pred=self.model.predict(self.valid_输入,批次大小=self.eval_批次)
swa_rho_val=compute_spearmanr(自有效输出,swa_val_pred)
#重置原始参数
self.model.set_权重(当前_权重)
#检查是否保存模型并更新最佳rho值
如果rho_val>self.rho_值:
self.rho_值=rho_值
self.model.save_权重(f'{self.output_path}/fold-{fold}-best.h5')
del当前重量
gc.collect()
输出如下所示:
WARNING:tensorflow:Method (on_train_batch_end) is slow compared to the batch update (11.428264). Check your callbacks.
WARNING:tensorflow:Method (on_train_batch_end) is slow compared to the batch update (11.464315). Check your callbacks.
WARNING:tensorflow:Method (on_train_batch_end) is slow compared to the batch update (11.502968). Check your callbacks.
WARNING:tensorflow:Method (on_train_batch_end) is slow compared to the batch update (11.518413). Check your callbacks.
我每一步都会收到警告,这意味着在不运行验证代码的情况下,更新SWA参数的代码(self.model.get_weights()
和下面的for
循环)足够慢
我知道更新参数非常慢,因为model.get_weights()
和model.set_weights()
都会对参数进行深度复制(根据我的实验,新的numpy数据数组的新列表)
我认为我的SWA实现没有问题(如果有任何bug,请告诉我),所以我只想禁用警告
我所尝试的:
os.environ[“TF_CPP_MIN_LOG_LEVEL”]=“2”
和os.environ[“TF_CPP_MIN_LOG_LEVEL”]=“3”
以禁用警告model.fit()
中的verbose
设置为2
和0
,即model.fit(…,verbose=2,…)
和model.fit(…,verbose=0,…)
有什么想法吗?提前谢谢你的帮助 这不是一个非常令人满意的答案,但TF_CPP_MIN_LOG_级别不工作是一个已知问题: 我可以在
tensorflow==2.1.0-rc1
上重现您的问题,这里有一个玩具示例:
import os
import time
os.environ['TF_CPP_MIN_LOG_LEVEL'] = "2"
import tensorflow as tf
tf.get_logger().setLevel("WARNING")
tf.autograph.set_verbosity(2)
print(tf.__version__)
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10, activation='softmax')
])
class CustomCallback(tf.keras.callbacks.Callback):
def on_train_batch_end(self, batch, logs=None):
time.sleep(3)
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=1, callbacks=[CustomCallback()])
标准建议(os.environ['TF\u CPP\u MIN\u LOG\u LEVEL']
,TF.get\u logger().setLevel(“警告”)
或TF.autograph.set\u verbosity(2)
)都不起作用,我怀疑您必须等到上述问题得到解决 您是否尝试过tf.get_logger().setLevel(“错误”)而不是警告(实际上您是否希望隐藏警告)?TF2.20每晚都在工作。
2.1.0
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
11493376/11490434 [==============================] - 31s 3us/step
Train on 60000 samples
WARNING:tensorflow:Method (on_train_batch_end) is slow compared to the batch update (3.002797). Check your callbacks.
32/60000 [..............................] - ETA: 1:57:38 - loss: 2.4674 - accuracy: 0.0938WARNING:tensorflow:Method (on_train_batch_end) is slow compared to the batch update (3.002938). Check your callbacks.
...