Keras-Tensorflow 2.0-Python中的回调异常

Keras-Tensorflow 2.0-Python中的回调异常,python,python-3.x,keras,callback,Python,Python 3.x,Keras,Callback,下面的代码在与Keras打包的MNIST数据上运行一个顺序Keras模型,非常直接 在运行下面的代码时,我遇到了一个异常 代码易于复制 import tensorflow as tf class myCallback(tf.keras.callbacks.Callback): def on_epoch_end(self, epoch, logs={}): if(logs.get('acc')>0.99): print("\nReached

下面的代码在与Keras打包的MNIST数据上运行一个顺序Keras模型,非常直接

在运行下面的代码时,我遇到了一个异常

代码易于复制

import tensorflow as tf

class myCallback(tf.keras.callbacks.Callback):
      def on_epoch_end(self, epoch, logs={}):
        if(logs.get('acc')>0.99):
          print("\nReached 99% accuracy so cancelling training!")
          self.model.stop_training = True

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

callbacks = myCallback()

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(x_train, y_train, epochs=10, callbacks=[callbacks])
例外情况是:

Epoch 1/10
59296/60000 [============================>.] - ETA: 0s - loss: 0.2005 - accuracy: 0.9400

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-26-f5e673b24d24> in <module>()
     23               metrics=['accuracy'])
     24 
---> 25 model.fit(x_train, y_train, epochs=10, callbacks=[callbacks])

C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\site-packages\tensorflow\python\keras\engine\training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs)
    871           validation_steps=validation_steps,
    872           validation_freq=validation_freq,
--> 873           steps_name='steps_per_epoch')
    874 
    875   def evaluate(self,

C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\site-packages\tensorflow\python\keras\engine\training_arrays.py in model_iteration(model, inputs, targets, sample_weights, batch_size, epochs, verbose, callbacks, val_inputs, val_targets, val_sample_weights, shuffle, initial_epoch, steps_per_epoch, validation_steps, validation_freq, mode, validation_in_fit, prepared_feed_values_from_dataset, steps_name, **kwargs)
    406     if mode == ModeKeys.TRAIN:
    407       # Epochs only apply to `fit`.
--> 408       callbacks.on_epoch_end(epoch, epoch_logs)
    409     progbar.on_epoch_end(epoch, epoch_logs)
    410 

C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\site-packages\tensorflow\python\keras\callbacks.py in on_epoch_end(self, epoch, logs)
    288     logs = logs or {}
    289     for callback in self.callbacks:
--> 290       callback.on_epoch_end(epoch, logs)
    291 
    292   def on_train_batch_begin(self, batch, logs=None):

<ipython-input-26-f5e673b24d24> in on_epoch_end(self, epoch, logs)
      3 class myCallback(tf.keras.callbacks.Callback):
      4       def on_epoch_end(self, epoch, logs={}):
----> 5         if(logs.get('acc')>0.99):
      6           print("\nReached 99% accuracy so cancelling training!")
      7           self.model.stop_training = True

TypeError: '>' not supported between instances of 'NoneType' and 'float'
1/10纪元
59296/60000[======================>.]-预计到达时间:0s-损失:0.2005-准确度:0.9400
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在()
23指标=[‘准确度’])
24
--->25 model.fit(x_-train,y_-train,epochs=10,callbacks=[callbacks])
C:\Program Files(x86)\Microsoft Visual Studio\Shared\Anaconda3\u 64\lib\site packages\tensorflow\python\keras\engine\training.py(self、x、y、批处理大小、历元、冗余、回调、验证拆分、验证数据、随机、类权重、样本权重、初始历元、每个历元的步骤、验证步骤、验证频率、最大队列大小、工人、使用多处理、**kwargs)
871验证步骤=验证步骤,
872验证频率=验证频率,
-->873个步骤(名称=“每个时代的步骤”)
874
875 def评估(自我,
C:\Program Files(x86)\Microsoft Visual Studio\Shared\Anaconda3\u 64\lib\site packages\tensorflow\python\keras\engine\training\u arrays.py在model\u迭代中(模型、输入、目标、样本权重、批量大小、年代、详细程度、回调、val_输入、val_目标、val_样本权重、无序、初始历元、每历元步长、验证步骤、验证频率、模式、验证拟合、从数据集准备的反馈值、步骤名称、**kwargs)
406如果模式==ModeKeys.TRAIN:
407时代只适用于“适合”。
-->408回调。在epoch\u结束时(epoch,epoch\u日志)
409程序条。在划时代结束时(划时代,划时代日志)
410
C:\Program Files(x86)\Microsoft Visual Studio\Shared\Anaconda3\u 64\lib\site packages\tensorflow\python\keras\callbacks.py在\u epoch\u端(self、epoch、logs)
288日志=日志或{}
289对于self.callbacks中的回调:
-->290回调。在第二个历元结束时(历元,日志)
291
292列上的def批次开始(自身、批次、日志=无):
in on_epoch_end(self、epoch、logs)
3类myCallback(tf.keras.callbacks.Callback):
4个def在_epoch_end上(self、epoch、logs={}):
---->5如果(logs.get('acc')>0.99):
6打印(“\n已达到99%的准确率,因此取消培训!”)
7 self.model.stop_training=True
TypeError:“NoneType”和“float”实例之间不支持“>”

我认为它可能来自您调用函数的方式:

如果你的功能是

class myCallback(tf.keras.callbacks.Callback):
...
应该这样称呼:

model.fit(x_train, y_train, epochs=10, callbacks=[myCallback()])

问题是
logs.get('acc')>0.99
。在您这边
logs.get('acc')
由于某种原因是
None

只需执行:

None>0.99
您将得到相同的错误。您可能从Python 2迁移了您的代码,而这实际上是可行的:)

你可以简单地用

if(logs.get('acc') is None): # in this case you cannot compare...
或者您可以使用
try
:…
,除了
:块之外


顺便说一句,同样的代码在我这方面工作得很好。

在model.compile函数中,您定义了度量=['accurity']。您需要在logs.get即logs.get('accurity')中使用'accurity'.

只是随着tensorflow升级到2.x版,字典标签“acc”已更改为“Accurance”,因此按如下方式替换第5行就可以了


如果(logs.get('accurity')>0.99):

只需更改logs.get('accurity')-->logs.get('acc')。它应该工作得很好!

出于某种原因,我在回调类中使用了
['acc']
,在度量中使用
['accurity']
,它工作得很好


我也遇到了同样的问题。我把它改成了“acc”,效果很好。我做了以下更改

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['acc'])
在回调中

class myCallback(tf.keras.callbacks.Callback):
    def on_epoch_end(self, epoch, logs={}):
        if(logs.get("acc") >= 0.99):
            print("Reached 99% accuracy so cancelling training!")
            self.model.stop_training = True

在Jupyter笔记本中,我不得不使用“acc”,但在google Colab中,我想这取决于安装的tensorflow版本。

可能您使用的是tensorflow 1.,因此您可以尝试:
if(logs.get('acc')>0.998)

metrics=['acc']

您是否尝试过
if(logs.get('accurity')>0.99):
在创建回调时,如果我们需要培训的准确度阈值,以前的TF版本有logs.get('acc'),但在这个版本中我们需要使用logs.get('accurity'))为了让它工作。没有任何关于此更改的文档。错误是因为
日志。get('acc')
必须与
model.compile中的度量值匹配(optimizer='adam',loss='sparse\u Category\u crossentropy',metrics=['Accurance'])
这里也一样,不知道为什么会这样,但这个解决方案对我来说很有效。也许Colab中安装的版本与笔记本不同。