【问题标题】:What is the correct keyword for the Proximal AdaGrad optimizer on Tensorflow?Tensorflow 上 Proximal AdaGrad 优化器的正确关键字是什么?
【发布时间】:2019-11-27 16:00:27
【问题描述】:

我正在为科学博览会尝试 Proximal AdaGrad,但我无法使用它,因为它认为它不存在。

我的代码:

import tensorflow as tf
from tensorflow import keras
import matplotlib.pyplot as plt
import numpy as np
import time

start_time = time.time()


data = tf.keras.datasets.fashion_mnist

(train_images, train_labels), (test_images, test_labels) = data.load_data()

class_names = ['T-shirt', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle Boot']

train_images = train_images/255.0

test_images = test_images/255.0

model = keras.Sequential([
                           keras.layers.Flatten(input_shape=(28, 28)),
                           keras.layers.Dense(100, activation="relu"),
                           keras.layers.Dense(10, activation="softmax")
])

model.compile(optimizer="Proximal AdaGrad", loss="sparse_categorical_crossentropy", metrics=["accuracy"])

model.fit(train_images, train_labels, epochs=200)

test_loss, test_acc = model.evaluate(test_images, test_labels)

print("Test acc is:", test_acc)
print("--- %s seconds ---" % (time.time() - start_time))

错误:

ValueError                                Traceback (most recent call last)
<ipython-input-2-2d12844ae498> in <module>()
     24 ])
     25 
---> 26 model.compile(optimizer="Proximal AdaGrad", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
     27 
     28 model.fit(train_images, train_labels, epochs=200)

6 frames
/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/training/tracking/base.py in _method_wrapper(self, *args, **kwargs)
    455     self._self_setattr_tracking = False  # pylint: disable=protected-access
    456     try:
--> 457       result = method(self, *args, **kwargs)
    458     finally:
    459       self._self_setattr_tracking = previous_value  # pylint: disable=protected-access

/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/training.py in compile(self, optimizer, loss, metrics, loss_weights, sample_weight_mode, weighted_metrics, target_tensors, distribute, **kwargs)
    250         'experimental_run_tf_function', True)
    251 
--> 252     self._set_optimizer(optimizer)
    253     is_any_optimizer_v1 = any(isinstance(opt, optimizers.Optimizer)
    254                               for opt in nest.flatten(self.optimizer))

/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/training.py in _set_optimizer(self, optimizer)
   1451       self.optimizer = [optimizers.get(opt) for opt in optimizer]
   1452     else:
-> 1453       self.optimizer = optimizers.get(optimizer)
   1454 
   1455     if (self._dtype_policy.loss_scale is not None and

/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/optimizers.py in get(identifier)
    844   elif isinstance(identifier, six.string_types):
    845     config = {'class_name': str(identifier), 'config': {}}
--> 846     return deserialize(config)
    847   else:
    848     raise ValueError('Could not interpret optimizer identifier:', identifier)

/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/optimizers.py in deserialize(config, custom_objects)
    813       module_objects=all_classes,
    814       custom_objects=custom_objects,
--> 815       printable_module_name='optimizer')
    816 
    817 

/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/utils/generic_utils.py in deserialize_keras_object(identifier, module_objects, custom_objects, printable_module_name)
    178     config = identifier
    179     (cls, cls_config) = class_and_config_for_serialized_keras_object(
--> 180         config, module_objects, custom_objects, printable_module_name)
    181 
    182     if hasattr(cls, 'from_config'):

/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/utils/generic_utils.py in class_and_config_for_serialized_keras_object(config, module_objects, custom_objects, printable_module_name)
    163     cls = module_objects.get(class_name)
    164     if cls is None:
--> 165       raise ValueError('Unknown ' + printable_module_name + ': ' + class_name)
    166   return (cls, config['config'])
    167 

ValueError: Unknown optimizer: Proximal AdaGrad

我尝试将其命名为其他名称,例如“ProximalAdaGrad”和“ProximalGrad”,但这些都不起作用。激活函数看起来没有问题,但优化器本身似乎有一个错误。我在 GitHub 上搜索了一篇帖子,但没有找到任何人发布关于此的问题。

【问题讨论】:

    标签: python python-3.x tensorflow keras deep-learning


    【解决方案1】:

    有一个open issue about this。 TensorFlow 实现是存在的(即使在 TensorFlow 2.x 中,如tf.compat.v1.train.ProximalAdagradOptimizer),但目前还没有对应的 Keras 实现。但是,Keras API 能够包装现有的 TensorFlow 优化器,因此您应该能够执行以下操作:

    # This works both in recent 1.x and 2.0
    optimizer = tf.compat.v1.train.ProximalAdagradOptimizer(0.001)
    model.compile(optimizer=optimizer,
                  loss="sparse_categorical_crossentropy",
                  metrics=["accuracy"])
    

    【讨论】:

    • 如果我与 Nesterov 有这个问题,我必须这样做吗? ValueError:未知优化器:Nesterov
    • @KhosrawAzizi 您可以传递给optimizer 的字符串值正是tf.keras.optimizers 中类的名称。您应该能够以与上述相同的方式使用tf.compat.v1.train 中的任何优化器,因为 Keras 提供了一种通用的包装机制来自动将 TensorFlow 优化器封装到 Keras 优化器中。
    • 如果 Nesterov 不是其中之一怎么办?这是否意味着我不能使用 Nesterov,因为它是 Tensorflow 网页中的优化器之一。
    • @KhosrawAzizi 我认为MomentumOptimizer 实现了这一点。
    • 参数中的值0.001是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 2017-05-23
    • 1970-01-01
    • 2018-06-08
    • 2019-07-05
    相关资源
    最近更新 更多