【问题标题】:TypeError: '>' not supported between instances of 'NoneType' and 'float'TypeError:“NoneType”和“float”的实例之间不支持“>”
【发布时间】:2020-05-05 05:48:29
【问题描述】:

我有这段代码,它在 python 3 中引发错误,这样的比较可以在 python 2 上工作 怎么改?

import tensorflow as tf 
def train_set():
    class MyCallBacks(tf.keras.callbacks.Callback):
        def on_epoch_end(self,epoch,logs={}):
            if(logs.get('acc')>0.95):
                print('the training will stop !')
                self.model.stop_training=True
    callbacks=MyCallBacks()
    mnist_dataset=tf.keras.datasets.mnist 
    (x_train,y_train),(x_test,y_test)=mnist_dataset.load_data()
    x_train=x_train/255.0
    x_test=x_test/255.0
    classifier=tf.keras.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)
                                    ])
    classifier.compile(
                        optimizer='sgd',
                        loss='sparse_categorical_crossentropy',
                        metrics=['accuracy']
                       )    
    history=classifier.fit(x_train,y_train,epochs=20,callbacks=[callbacks])
    return history.epoch,history.history['acc'][-1]
train_set()

【问题讨论】:

  • 请分享整个错误信息。您从该消息中了解到什么?

标签: python tensorflow machine-learning keras typeerror


【解决方案1】:

张量流 2.0

DESIRED_ACCURACY = 0.979

class myCallback(tf.keras.callbacks.Callback):
    def on_epoch_end(self, epochs, logs={}) :
        if(logs.get('acc') is not None and logs.get('acc') >= DESIRED_ACCURACY) :
            print('\nReached 99.9% accuracy so cancelling training!')
            self.model.stop_training = True

callbacks = myCallback()

【讨论】:

    【解决方案2】:

    看来您的错误类似于Exception with Callback in Keras - Tensorflow 2.0 - Python 尝试用logs.get('accuracy')替换logs.get('acc')

    【讨论】:

      【解决方案3】:

      它在 Python2 中有效,因为在 Python2 中您可以将 Nonefloat 进行比较,但这在 Python3 中是不可能的。

      这一行

      logs.get('acc')
      

      返回None,这就是你的问题。

      快速解决方案是将条件替换为

      if logs.get('acc') is not None and logs.get('acc') > 0.95:
      

      如果logs.get('acc')None,则上述条件将被短路,第二部分logs.get('acc') > 0.95 将不会被评估,因此不会导致上述错误。

      【讨论】:

        【解决方案4】:

        在你的回调中试试这个:

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

        它给了我这个 --- {'loss': 0.18487292938232422, 'acc': 0.94411665} ---

        我有acc,所以我使用了,如果有accuracy,我会使用accuracy。所以记录和你有什么然后使用它。

        TF一直在经历大的变化,所以可以放心,非常安全。

        【讨论】:

          【解决方案5】:

          使用“acc”而不是“accuracy”,您无需更改。

          【讨论】:

          • 这个确切的答案已经添加到这个问题中。你的回答增加了什么?
          【解决方案6】:

          我们与 Coursera 课程在同一条船上

          所以,这是我的代码

          # GRADED FUNCTION: train_mnist
          def train_mnist():
              # Please write your code only where you are indicated.
              # please do not remove # model fitting inline comments.
          
              # YOUR CODE SHOULD START HERE
              class myCallback(tf.keras.callbacks.Callback):
                  def on_epoch_end(self, epoch, logs={}):
                      if (logs.get('acc') > 0.99):
                          print("\n Reached 99% Accuracy!")
                          self.model.stop_training = True
          
              # YOUR CODE SHOULD END HERE
          
              mnist = tf.keras.datasets.mnist
          
              (x_train, y_train),(x_test, y_test) = mnist.load_data(path=path)
              # YOUR CODE SHOULD START HERE
              x_train = x_train/255.0
              x_test = x_test/255.0
              
              callbacks = myCallback()
          
              # YOUR CODE SHOULD END HERE
              model = tf.keras.models.Sequential([
                  # YOUR CODE SHOULD START HERE
                  tf.keras.layers.Flatten(),
                  tf.keras.layers.Dense(128, 'relu'),
                  tf.keras.layers.Dense(10, 'softmax')
              
                  # YOUR CODE SHOULD END HERE
              ])
          
              model.compile(optimizer='adam',
                            loss='sparse_categorical_crossentropy',
                            metrics=['accuracy'])
              
              # model fitting
              history = model.fit(x_train, y_train, epochs=10, callbacks=[callbacks]# YOUR CODE SHOULD START HERE
                        # YOUR CODE SHOULD END HERE
              )
              # model fitting
              return history.epoch, history.history['acc'][-1]
          

          希望对您有所帮助!继续学习

          【讨论】:

            【解决方案7】:

            尝试使用 try-except

            class myCallback(tf.keras.callbacks.Callback):
              def on_epoch_end(self, epoch, logs = {}):
                try:
                  if(logs.get('acc')>0.95):
                    print("\nReached")
                    self.model.stop_training = True
                except:
                  if(logs.get('accuracy')>0.95):
                    print("Reached!!!")
                    self.model.stop_training = True
            

            【讨论】:

              【解决方案8】:

              请首先检查您的行以查看存储的准确性,然后在需要在纪元结束时进行比较时可以正确查找。

              return history.epoch, history.history['acc'][-1]
              

              这里它被称为“acc”,但正如其他人所指出的那样,它可能是“accuracy”

              【讨论】:

                【解决方案9】:

                在这种特殊情况下不要使用accuracy,而是使用acc,因为logs.get() 不适用于accuracy,但通常两者都适用于TF 中的常见回调块。如果有人在学习 Coursera 课程时正在寻找这个问题,这是解决这个问题的最简单的答案。

                【讨论】:

                  【解决方案10】:

                  我遇到了同样的问题,我没有使用“acc”,而是在所有地方都将其更改为“accacy”。因此,似乎最好尝试将“acc”更改为“accuracy”。

                  【讨论】:

                    猜你喜欢
                    • 2021-03-18
                    • 1970-01-01
                    • 2021-05-20
                    • 1970-01-01
                    • 2020-02-12
                    • 1970-01-01
                    • 2018-01-10
                    • 2018-11-22
                    • 2020-06-02
                    相关资源
                    最近更新 更多