Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow “中当前批次的正向传递计算”;获取“U更新”;Keras-SGD优化方法_Tensorflow_Keras_Learning Rate_Stochastic Gradient_Custom Training - Fatal编程技术网

Tensorflow “中当前批次的正向传递计算”;获取“U更新”;Keras-SGD优化方法

Tensorflow “中当前批次的正向传递计算”;获取“U更新”;Keras-SGD优化方法,tensorflow,keras,learning-rate,stochastic-gradient,custom-training,Tensorflow,Keras,Learning Rate,Stochastic Gradient,Custom Training,我试图在Keras SGD优化器的get_梯度方法中实现一个随机armijo规则。 因此,我需要计算另一个向前传球,以检查选择的学习率是否良好。我不想再次计算渐变,但我想使用更新的权重 使用Keras版本2.3.1和Tensorflow版本1.14.0 def get_updates(self, loss, params): grads = self.get_gradients(loss, params) self.updates = [K.update_add(

我试图在Keras SGD优化器的get_梯度方法中实现一个随机armijo规则。 因此,我需要计算另一个向前传球,以检查选择的学习率是否良好。我不想再次计算渐变,但我想使用更新的权重

使用Keras版本2.3.1和Tensorflow版本1.14.0

def get_updates(self, loss, params):
        grads = self.get_gradients(loss, params)
        self.updates = [K.update_add(self.iterations, 1)]

        lr = self.learning_rate
        if self.initial_decay > 0:
            lr = lr * (1. / (1. + self.decay * K.cast(self.iterations,
                                                      K.dtype(self.decay))))
        # momentum
        shapes = [K.int_shape(p) for p in params]
        moments = [K.zeros(shape, name='moment_' + str(i))
                   for (i, shape) in enumerate(shapes)]
        self.weights = [self.iterations] + moments
        for p, g, m in zip(params, grads, moments):
            v = self.momentum * m - lr * g  # velocity
            self.updates.append(K.update(m, v))

            if self.nesterov:
                new_p = p + self.momentum * v - lr * g
            else:
                new_p = p + v

            # Apply constraints.
            if getattr(p, 'constraint', None) is not None:
                 new_p = p.constraint(new_p)

            self.updates.append(K.update(p, new_p))

        ### own changes ###
        if self.armijo:
            inputs = (model._feed_inputs +
                      model._feed_targets +
                      model._feed_sample_weights)
            input_layer = model.layers[0].input
            armijo_function = K.function(inputs=input_layer, outputs=[loss],                                                                                  
                                                updates=self.updates,name='armijo')
            loss_next= armijo_function(inputs)
            [....change updates if learning rate was not good enough...]

        return self.updates
不幸的是,在尝试计算“下一步损失”时,我不理解错误消息:

这里有两个问题:

  • 如何访问我正在处理的当前批?正演计算应只考虑实际的批处理,因为梯度也只属于该批。

  • 有没有更好的办法不使用K函数来更新和评估前向传递以计算该批次的损失函数

有人能帮忙吗?提前谢谢

如何访问我正在处理的当前批?正向计算只考虑实际的批处理,并且梯度也仅属于该批。 为此,您可以在
model.fit()
中使用
batch\u size=Total training records
,这样每个历元只有一个正向传递和反向传播。因此,您可以分析
epoch 1
上的梯度,并修改
epoch 2
的学习率,或者如果您使用自定义训练循环,则相应地修改代码

有没有更好的办法不使用K函数来更新和评估前向传递以计算该批次的损失函数

除了使用tensorflow.keras中的
tensorflow 1.x版中导入后端为K
之外,我想不起还有其他任何选项来计算梯度。最好的选择是将tensorflow更新到最新版本
2.2.0
,并使用
tf.GradientTape

建议通过使用tensorflow.keras的
tensorflow 1.x
中将后端导入为K
来捕获梯度

下面是一个与您的要求几乎相似的示例代码。我使用的是tensorflow 2.2.0版
。您可以从该程序生成您的需求

我们正在程序中执行以下功能-

  • 我们每个时代都在改变学习速度。您可以使用
    model.fit的callbacks参数来实现这一点。在这里,我使用
    tf.keras.callbacks.LearningRateScheduler将每个历元的学习率增加0.01,并使用
    tf.keras.callbacks.Callback在每个历元结束时显示它
  • 在每个历元结束后,使用
    tf.GradientTape()
    计算梯度。我们使用append将每个时代的梯度收集到一个列表中
  • 还根据您的要求设置
    batch\u size=len(序列图像)
  • 注意:由于内存限制,我只对来自Cifar数据集的500条记录进行了培训

    代码-

    %tensorflow_version 2.x
    import tensorflow as tf
    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import Dense, Conv2D, Flatten, Dropout, MaxPooling2D
    from tensorflow.keras.preprocessing.image import ImageDataGenerator
    from tensorflow.keras.optimizers import Adam
    from tensorflow.keras import backend as K
    
    import os
    import numpy as np
    import matplotlib.pyplot as plt
    
    (train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.cifar10.load_data()
    
    train_images = train_images[:500]
    train_labels = train_labels[:500]
    
    test_images = test_images[:50]
    test_labels = test_labels[:50]
    
    model = Sequential([
        Conv2D(16, 3, padding='same', activation='relu', input_shape=(32, 32, 3)),
        MaxPooling2D(),
        Conv2D(32, 3, padding='same', activation='relu'),
        MaxPooling2D(),
        Conv2D(64, 3, padding='same', activation='relu'),
        MaxPooling2D(),
        Flatten(),
        Dense(512, activation='relu'),
        Dense(10)
    ])
    
    lr = 0.01
    adam = Adam(lr)
    
    # Define the Gradient Fucntion
    epoch_gradient = []
    loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
    
    # Define the Required Callback Function
    class GradientCalcCallback(tf.keras.callbacks.Callback):
      def on_epoch_end(self, epoch, logs={}):
        with tf.GradientTape() as tape:
           logits = model(train_images, training=True)
           loss = loss_fn(train_labels, logits)    
        grad = tape.gradient(loss, model.trainable_weights)
        model.optimizer.apply_gradients(zip(grad, model.trainable_variables))
        epoch_gradient.append(grad)
    
    gradcalc = GradientCalcCallback()
    
    # Define the Required Callback Function
    class printlearningrate(tf.keras.callbacks.Callback):
        def on_epoch_begin(self, epoch, logs={}):
            optimizer = self.model.optimizer
            lr = K.eval(optimizer.lr)
            Epoch_count = epoch + 1
            print('\n', "Epoch:", Epoch_count, ', LR: {:.2f}'.format(lr))
    
    printlr = printlearningrate() 
    
    def scheduler(epoch):
      optimizer = model.optimizer
      return K.eval(optimizer.lr + 0.01)
    
    updatelr = tf.keras.callbacks.LearningRateScheduler(scheduler)
    
    model.compile(optimizer=adam, 
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])
    
    epochs = 10 
    
    history = model.fit(train_images, train_labels, epochs=epochs, batch_size=len(train_images), 
                        validation_data=(test_images, test_labels),
                        callbacks = [printlr,updatelr,gradcalc])
    
    # (7) Convert to a 2 dimensiaonal array of (epoch, gradients) type
    gradient = np.asarray(epoch_gradient)
    print("Total number of epochs run:", epochs)
    print("Gradient Array has the shape:",gradient.shape)
    
     Epoch: 1 , LR: 0.01
    Epoch 1/10
    1/1 [==============================] - 0s 427ms/step - loss: 30.1399 - accuracy: 0.0820 - val_loss: 2114.8201 - val_accuracy: 0.1800 - lr: 0.0200
    
     Epoch: 2 , LR: 0.02
    Epoch 2/10
    1/1 [==============================] - 0s 329ms/step - loss: 141.6176 - accuracy: 0.0920 - val_loss: 41.7008 - val_accuracy: 0.0400 - lr: 0.0300
    
     Epoch: 3 , LR: 0.03
    Epoch 3/10
    1/1 [==============================] - 0s 328ms/step - loss: 4.1428 - accuracy: 0.1160 - val_loss: 2.3883 - val_accuracy: 0.1800 - lr: 0.0400
    
     Epoch: 4 , LR: 0.04
    Epoch 4/10
    1/1 [==============================] - 0s 329ms/step - loss: 2.3545 - accuracy: 0.1060 - val_loss: 2.3471 - val_accuracy: 0.1800 - lr: 0.0500
    
     Epoch: 5 , LR: 0.05
    Epoch 5/10
    1/1 [==============================] - 0s 340ms/step - loss: 2.3208 - accuracy: 0.1060 - val_loss: 2.3047 - val_accuracy: 0.1800 - lr: 0.0600
    
     Epoch: 6 , LR: 0.06
    Epoch 6/10
    1/1 [==============================] - 0s 331ms/step - loss: 2.3048 - accuracy: 0.1300 - val_loss: 2.3069 - val_accuracy: 0.0600 - lr: 0.0700
    
     Epoch: 7 , LR: 0.07
    Epoch 7/10
    1/1 [==============================] - 0s 337ms/step - loss: 2.3041 - accuracy: 0.1340 - val_loss: 2.3432 - val_accuracy: 0.0600 - lr: 0.0800
    
     Epoch: 8 , LR: 0.08
    Epoch 8/10
    1/1 [==============================] - 0s 341ms/step - loss: 2.2871 - accuracy: 0.1400 - val_loss: 2.6009 - val_accuracy: 0.0800 - lr: 0.0900
    
     Epoch: 9 , LR: 0.09
    Epoch 9/10
    1/1 [==============================] - 1s 515ms/step - loss: 2.2810 - accuracy: 0.1440 - val_loss: 2.8530 - val_accuracy: 0.0600 - lr: 0.1000
    
     Epoch: 10 , LR: 0.10
    Epoch 10/10
    1/1 [==============================] - 0s 343ms/step - loss: 2.2954 - accuracy: 0.1300 - val_loss: 2.3049 - val_accuracy: 0.0600 - lr: 0.1100
    Total number of epochs run: 10
    Gradient Array has the shape: (10, 10)
    
    输出-

    %tensorflow_version 2.x
    import tensorflow as tf
    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import Dense, Conv2D, Flatten, Dropout, MaxPooling2D
    from tensorflow.keras.preprocessing.image import ImageDataGenerator
    from tensorflow.keras.optimizers import Adam
    from tensorflow.keras import backend as K
    
    import os
    import numpy as np
    import matplotlib.pyplot as plt
    
    (train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.cifar10.load_data()
    
    train_images = train_images[:500]
    train_labels = train_labels[:500]
    
    test_images = test_images[:50]
    test_labels = test_labels[:50]
    
    model = Sequential([
        Conv2D(16, 3, padding='same', activation='relu', input_shape=(32, 32, 3)),
        MaxPooling2D(),
        Conv2D(32, 3, padding='same', activation='relu'),
        MaxPooling2D(),
        Conv2D(64, 3, padding='same', activation='relu'),
        MaxPooling2D(),
        Flatten(),
        Dense(512, activation='relu'),
        Dense(10)
    ])
    
    lr = 0.01
    adam = Adam(lr)
    
    # Define the Gradient Fucntion
    epoch_gradient = []
    loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
    
    # Define the Required Callback Function
    class GradientCalcCallback(tf.keras.callbacks.Callback):
      def on_epoch_end(self, epoch, logs={}):
        with tf.GradientTape() as tape:
           logits = model(train_images, training=True)
           loss = loss_fn(train_labels, logits)    
        grad = tape.gradient(loss, model.trainable_weights)
        model.optimizer.apply_gradients(zip(grad, model.trainable_variables))
        epoch_gradient.append(grad)
    
    gradcalc = GradientCalcCallback()
    
    # Define the Required Callback Function
    class printlearningrate(tf.keras.callbacks.Callback):
        def on_epoch_begin(self, epoch, logs={}):
            optimizer = self.model.optimizer
            lr = K.eval(optimizer.lr)
            Epoch_count = epoch + 1
            print('\n', "Epoch:", Epoch_count, ', LR: {:.2f}'.format(lr))
    
    printlr = printlearningrate() 
    
    def scheduler(epoch):
      optimizer = model.optimizer
      return K.eval(optimizer.lr + 0.01)
    
    updatelr = tf.keras.callbacks.LearningRateScheduler(scheduler)
    
    model.compile(optimizer=adam, 
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])
    
    epochs = 10 
    
    history = model.fit(train_images, train_labels, epochs=epochs, batch_size=len(train_images), 
                        validation_data=(test_images, test_labels),
                        callbacks = [printlr,updatelr,gradcalc])
    
    # (7) Convert to a 2 dimensiaonal array of (epoch, gradients) type
    gradient = np.asarray(epoch_gradient)
    print("Total number of epochs run:", epochs)
    print("Gradient Array has the shape:",gradient.shape)
    
     Epoch: 1 , LR: 0.01
    Epoch 1/10
    1/1 [==============================] - 0s 427ms/step - loss: 30.1399 - accuracy: 0.0820 - val_loss: 2114.8201 - val_accuracy: 0.1800 - lr: 0.0200
    
     Epoch: 2 , LR: 0.02
    Epoch 2/10
    1/1 [==============================] - 0s 329ms/step - loss: 141.6176 - accuracy: 0.0920 - val_loss: 41.7008 - val_accuracy: 0.0400 - lr: 0.0300
    
     Epoch: 3 , LR: 0.03
    Epoch 3/10
    1/1 [==============================] - 0s 328ms/step - loss: 4.1428 - accuracy: 0.1160 - val_loss: 2.3883 - val_accuracy: 0.1800 - lr: 0.0400
    
     Epoch: 4 , LR: 0.04
    Epoch 4/10
    1/1 [==============================] - 0s 329ms/step - loss: 2.3545 - accuracy: 0.1060 - val_loss: 2.3471 - val_accuracy: 0.1800 - lr: 0.0500
    
     Epoch: 5 , LR: 0.05
    Epoch 5/10
    1/1 [==============================] - 0s 340ms/step - loss: 2.3208 - accuracy: 0.1060 - val_loss: 2.3047 - val_accuracy: 0.1800 - lr: 0.0600
    
     Epoch: 6 , LR: 0.06
    Epoch 6/10
    1/1 [==============================] - 0s 331ms/step - loss: 2.3048 - accuracy: 0.1300 - val_loss: 2.3069 - val_accuracy: 0.0600 - lr: 0.0700
    
     Epoch: 7 , LR: 0.07
    Epoch 7/10
    1/1 [==============================] - 0s 337ms/step - loss: 2.3041 - accuracy: 0.1340 - val_loss: 2.3432 - val_accuracy: 0.0600 - lr: 0.0800
    
     Epoch: 8 , LR: 0.08
    Epoch 8/10
    1/1 [==============================] - 0s 341ms/step - loss: 2.2871 - accuracy: 0.1400 - val_loss: 2.6009 - val_accuracy: 0.0800 - lr: 0.0900
    
     Epoch: 9 , LR: 0.09
    Epoch 9/10
    1/1 [==============================] - 1s 515ms/step - loss: 2.2810 - accuracy: 0.1440 - val_loss: 2.8530 - val_accuracy: 0.0600 - lr: 0.1000
    
     Epoch: 10 , LR: 0.10
    Epoch 10/10
    1/1 [==============================] - 0s 343ms/step - loss: 2.2954 - accuracy: 0.1300 - val_loss: 2.3049 - val_accuracy: 0.0600 - lr: 0.1100
    Total number of epochs run: 10
    Gradient Array has the shape: (10, 10)
    
    希望这能回答你的问题。快乐学习

    如何访问我正在处理的当前批?正向计算只考虑实际的批处理,并且梯度也仅属于该批。 为此,您可以在
    model.fit()
    中使用
    batch\u size=Total training records
    ,这样每个历元只有一个正向传递和反向传播。因此,您可以分析
    epoch 1
    上的梯度,并修改
    epoch 2
    的学习率,或者如果您使用自定义训练循环,则相应地修改代码

    有没有更好的办法不使用K函数来更新和评估前向传递以计算该批次的损失函数

    除了使用tensorflow.keras中的
    tensorflow 1.x版中导入后端为K
    之外,我想不起还有其他任何选项来计算梯度。最好的选择是将tensorflow更新到最新版本
    2.2.0
    ,并使用
    tf.GradientTape

    建议通过使用tensorflow.keras的
    tensorflow 1.x
    中将后端导入为K
    来捕获梯度

    下面是一个与您的要求几乎相似的示例代码。我使用的是tensorflow 2.2.0版
    。您可以从该程序生成您的需求

    我们正在程序中执行以下功能-

  • 我们每个时代都在改变学习速度。您可以使用
    model.fit的callbacks参数来实现这一点。在这里,我使用
    tf.keras.callbacks.LearningRateScheduler将每个历元的学习率增加0.01,并使用
    tf.keras.callbacks.Callback在每个历元结束时显示它
  • 在每个历元结束后,使用
    tf.GradientTape()
    计算梯度。我们使用append将每个时代的梯度收集到一个列表中
  • 还根据您的要求设置
    batch\u size=len(序列图像)
  • 注意:由于内存限制,我只对来自Cifar数据集的500条记录进行了培训

    代码-

    %tensorflow_version 2.x
    import tensorflow as tf
    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import Dense, Conv2D, Flatten, Dropout, MaxPooling2D
    from tensorflow.keras.preprocessing.image import ImageDataGenerator
    from tensorflow.keras.optimizers import Adam
    from tensorflow.keras import backend as K
    
    import os
    import numpy as np
    import matplotlib.pyplot as plt
    
    (train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.cifar10.load_data()
    
    train_images = train_images[:500]
    train_labels = train_labels[:500]
    
    test_images = test_images[:50]
    test_labels = test_labels[:50]
    
    model = Sequential([
        Conv2D(16, 3, padding='same', activation='relu', input_shape=(32, 32, 3)),
        MaxPooling2D(),
        Conv2D(32, 3, padding='same', activation='relu'),
        MaxPooling2D(),
        Conv2D(64, 3, padding='same', activation='relu'),
        MaxPooling2D(),
        Flatten(),
        Dense(512, activation='relu'),
        Dense(10)
    ])
    
    lr = 0.01
    adam = Adam(lr)
    
    # Define the Gradient Fucntion
    epoch_gradient = []
    loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
    
    # Define the Required Callback Function
    class GradientCalcCallback(tf.keras.callbacks.Callback):
      def on_epoch_end(self, epoch, logs={}):
        with tf.GradientTape() as tape:
           logits = model(train_images, training=True)
           loss = loss_fn(train_labels, logits)    
        grad = tape.gradient(loss, model.trainable_weights)
        model.optimizer.apply_gradients(zip(grad, model.trainable_variables))
        epoch_gradient.append(grad)
    
    gradcalc = GradientCalcCallback()
    
    # Define the Required Callback Function
    class printlearningrate(tf.keras.callbacks.Callback):
        def on_epoch_begin(self, epoch, logs={}):
            optimizer = self.model.optimizer
            lr = K.eval(optimizer.lr)
            Epoch_count = epoch + 1
            print('\n', "Epoch:", Epoch_count, ', LR: {:.2f}'.format(lr))
    
    printlr = printlearningrate() 
    
    def scheduler(epoch):
      optimizer = model.optimizer
      return K.eval(optimizer.lr + 0.01)
    
    updatelr = tf.keras.callbacks.LearningRateScheduler(scheduler)
    
    model.compile(optimizer=adam, 
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])
    
    epochs = 10 
    
    history = model.fit(train_images, train_labels, epochs=epochs, batch_size=len(train_images), 
                        validation_data=(test_images, test_labels),
                        callbacks = [printlr,updatelr,gradcalc])
    
    # (7) Convert to a 2 dimensiaonal array of (epoch, gradients) type
    gradient = np.asarray(epoch_gradient)
    print("Total number of epochs run:", epochs)
    print("Gradient Array has the shape:",gradient.shape)
    
     Epoch: 1 , LR: 0.01
    Epoch 1/10
    1/1 [==============================] - 0s 427ms/step - loss: 30.1399 - accuracy: 0.0820 - val_loss: 2114.8201 - val_accuracy: 0.1800 - lr: 0.0200
    
     Epoch: 2 , LR: 0.02
    Epoch 2/10
    1/1 [==============================] - 0s 329ms/step - loss: 141.6176 - accuracy: 0.0920 - val_loss: 41.7008 - val_accuracy: 0.0400 - lr: 0.0300
    
     Epoch: 3 , LR: 0.03
    Epoch 3/10
    1/1 [==============================] - 0s 328ms/step - loss: 4.1428 - accuracy: 0.1160 - val_loss: 2.3883 - val_accuracy: 0.1800 - lr: 0.0400
    
     Epoch: 4 , LR: 0.04
    Epoch 4/10
    1/1 [==============================] - 0s 329ms/step - loss: 2.3545 - accuracy: 0.1060 - val_loss: 2.3471 - val_accuracy: 0.1800 - lr: 0.0500
    
     Epoch: 5 , LR: 0.05
    Epoch 5/10
    1/1 [==============================] - 0s 340ms/step - loss: 2.3208 - accuracy: 0.1060 - val_loss: 2.3047 - val_accuracy: 0.1800 - lr: 0.0600
    
     Epoch: 6 , LR: 0.06
    Epoch 6/10
    1/1 [==============================] - 0s 331ms/step - loss: 2.3048 - accuracy: 0.1300 - val_loss: 2.3069 - val_accuracy: 0.0600 - lr: 0.0700
    
     Epoch: 7 , LR: 0.07
    Epoch 7/10
    1/1 [==============================] - 0s 337ms/step - loss: 2.3041 - accuracy: 0.1340 - val_loss: 2.3432 - val_accuracy: 0.0600 - lr: 0.0800
    
     Epoch: 8 , LR: 0.08
    Epoch 8/10
    1/1 [==============================] - 0s 341ms/step - loss: 2.2871 - accuracy: 0.1400 - val_loss: 2.6009 - val_accuracy: 0.0800 - lr: 0.0900
    
     Epoch: 9 , LR: 0.09
    Epoch 9/10
    1/1 [==============================] - 1s 515ms/step - loss: 2.2810 - accuracy: 0.1440 - val_loss: 2.8530 - val_accuracy: 0.0600 - lr: 0.1000
    
     Epoch: 10 , LR: 0.10
    Epoch 10/10
    1/1 [==============================] - 0s 343ms/step - loss: 2.2954 - accuracy: 0.1300 - val_loss: 2.3049 - val_accuracy: 0.0600 - lr: 0.1100
    Total number of epochs run: 10
    Gradient Array has the shape: (10, 10)
    
    输出-

    %tensorflow_version 2.x
    import tensorflow as tf
    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import Dense, Conv2D, Flatten, Dropout, MaxPooling2D
    from tensorflow.keras.preprocessing.image import ImageDataGenerator
    from tensorflow.keras.optimizers import Adam
    from tensorflow.keras import backend as K
    
    import os
    import numpy as np
    import matplotlib.pyplot as plt
    
    (train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.cifar10.load_data()
    
    train_images = train_images[:500]
    train_labels = train_labels[:500]
    
    test_images = test_images[:50]
    test_labels = test_labels[:50]
    
    model = Sequential([
        Conv2D(16, 3, padding='same', activation='relu', input_shape=(32, 32, 3)),
        MaxPooling2D(),
        Conv2D(32, 3, padding='same', activation='relu'),
        MaxPooling2D(),
        Conv2D(64, 3, padding='same', activation='relu'),
        MaxPooling2D(),
        Flatten(),
        Dense(512, activation='relu'),
        Dense(10)
    ])
    
    lr = 0.01
    adam = Adam(lr)
    
    # Define the Gradient Fucntion
    epoch_gradient = []
    loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
    
    # Define the Required Callback Function
    class GradientCalcCallback(tf.keras.callbacks.Callback):
      def on_epoch_end(self, epoch, logs={}):
        with tf.GradientTape() as tape:
           logits = model(train_images, training=True)
           loss = loss_fn(train_labels, logits)    
        grad = tape.gradient(loss, model.trainable_weights)
        model.optimizer.apply_gradients(zip(grad, model.trainable_variables))
        epoch_gradient.append(grad)
    
    gradcalc = GradientCalcCallback()
    
    # Define the Required Callback Function
    class printlearningrate(tf.keras.callbacks.Callback):
        def on_epoch_begin(self, epoch, logs={}):
            optimizer = self.model.optimizer
            lr = K.eval(optimizer.lr)
            Epoch_count = epoch + 1
            print('\n', "Epoch:", Epoch_count, ', LR: {:.2f}'.format(lr))
    
    printlr = printlearningrate() 
    
    def scheduler(epoch):
      optimizer = model.optimizer
      return K.eval(optimizer.lr + 0.01)
    
    updatelr = tf.keras.callbacks.LearningRateScheduler(scheduler)
    
    model.compile(optimizer=adam, 
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])
    
    epochs = 10 
    
    history = model.fit(train_images, train_labels, epochs=epochs, batch_size=len(train_images), 
                        validation_data=(test_images, test_labels),
                        callbacks = [printlr,updatelr,gradcalc])
    
    # (7) Convert to a 2 dimensiaonal array of (epoch, gradients) type
    gradient = np.asarray(epoch_gradient)
    print("Total number of epochs run:", epochs)
    print("Gradient Array has the shape:",gradient.shape)
    
     Epoch: 1 , LR: 0.01
    Epoch 1/10
    1/1 [==============================] - 0s 427ms/step - loss: 30.1399 - accuracy: 0.0820 - val_loss: 2114.8201 - val_accuracy: 0.1800 - lr: 0.0200
    
     Epoch: 2 , LR: 0.02
    Epoch 2/10
    1/1 [==============================] - 0s 329ms/step - loss: 141.6176 - accuracy: 0.0920 - val_loss: 41.7008 - val_accuracy: 0.0400 - lr: 0.0300
    
     Epoch: 3 , LR: 0.03
    Epoch 3/10
    1/1 [==============================] - 0s 328ms/step - loss: 4.1428 - accuracy: 0.1160 - val_loss: 2.3883 - val_accuracy: 0.1800 - lr: 0.0400
    
     Epoch: 4 , LR: 0.04
    Epoch 4/10
    1/1 [==============================] - 0s 329ms/step - loss: 2.3545 - accuracy: 0.1060 - val_loss: 2.3471 - val_accuracy: 0.1800 - lr: 0.0500
    
     Epoch: 5 , LR: 0.05
    Epoch 5/10
    1/1 [==============================] - 0s 340ms/step - loss: 2.3208 - accuracy: 0.1060 - val_loss: 2.3047 - val_accuracy: 0.1800 - lr: 0.0600
    
     Epoch: 6 , LR: 0.06
    Epoch 6/10
    1/1 [==============================] - 0s 331ms/step - loss: 2.3048 - accuracy: 0.1300 - val_loss: 2.3069 - val_accuracy: 0.0600 - lr: 0.0700
    
     Epoch: 7 , LR: 0.07
    Epoch 7/10
    1/1 [==============================] - 0s 337ms/step - loss: 2.3041 - accuracy: 0.1340 - val_loss: 2.3432 - val_accuracy: 0.0600 - lr: 0.0800
    
     Epoch: 8 , LR: 0.08
    Epoch 8/10
    1/1 [==============================] - 0s 341ms/step - loss: 2.2871 - accuracy: 0.1400 - val_loss: 2.6009 - val_accuracy: 0.0800 - lr: 0.0900
    
     Epoch: 9 , LR: 0.09
    Epoch 9/10
    1/1 [==============================] - 1s 515ms/step - loss: 2.2810 - accuracy: 0.1440 - val_loss: 2.8530 - val_accuracy: 0.0600 - lr: 0.1000
    
     Epoch: 10 , LR: 0.10
    Epoch 10/10
    1/1 [==============================] - 0s 343ms/step - loss: 2.2954 - accuracy: 0.1300 - val_loss: 2.3049 - val_accuracy: 0.0600 - lr: 0.1100
    Total number of epochs run: 10
    Gradient Array has the shape: (10, 10)
    

    希望这能回答你的问题。愉快的学习。

    @mreiners-希望我们已经回答了您的问题。如果您对答案感到满意,请您接受并投赞成票。@Einers先生-希望我们已经回答了您的问题。如果你对答案感到满意,请接受并投票。