繁体   English   中英

在 tensorflow 中使用 adam 优化器编译 model 时出错 keras

[英]Error while compiling a model using the adam optimizer in tensorflow keras

我正在尝试使用 Adam 优化器构建 ResNet50 model。 这是我的代码:

import tensorflow as tf
  cifar = tf.keras.datasets.cifar100
  (x_train, y_train), (x_test, y_test) = cifar.load_data()
  model = tf.keras.applications.ResNet50(
      include_top=True,
      weights=None,
      input_shape=(32, 32, 3),
      classes=100,)

  loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
  model.compile(optimizer="adam", loss=loss_fn, metrics=["accuracy"])
  model.fit(x_train, y_train, epochs=5, batch_size=64)

但是当我运行它时,它会出现以下错误:

tensorflow.python.framework.errors_impl.NotFoundError: Graph execution error:

我试过改变:

optimizer="adam"

到:

optimizer=tf.keras.optimizers.Adam

但我得到另一个错误:

ValueError: Could not interpret optimizer identifier: <class 'keras.optimizers.optimizer_experimental.adam.Adam'>

我在网上搜索过,但没有找到答案。 有什么帮助吗?

问题不应该来自优化器。 为了正确使用from_logits=True ,可以将classifier_activation=False参数传递给tf.keras.applications.ResNet50以返回“顶层”层的对数( TensorFlow 文档):

import tensorflow as tf
cifar = tf.keras.datasets.cifar100
(x_train, y_train), (x_test, y_test) = cifar.load_data()
model = tf.keras.applications.ResNet50(
    include_top=True,
    weights=None,
    input_shape=(32, 32, 3),
    classes=100,
    classifier_activation=None,
)

loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
model.compile(optimizer="adam", loss=loss_fn, metrics=["accuracy"])
model.fit(x_train, y_train, epochs=1, batch_size=64)

Output:

782/782 [==============================] - 2259s 3s/step - loss: 4.7819 - accuracy: 0.0762

或者,可以使用softmax作为激活,但使用from_logits=False

import tensorflow as tf
cifar = tf.keras.datasets.cifar100
(x_train, y_train), (x_test, y_test) = cifar.load_data()
model = tf.keras.applications.ResNet50(
    include_top=True,
    weights=None,
    input_shape=(32, 32, 3),
    classes=100,
    classifier_activation='softmax',
)

loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False)
model.compile(optimizer="adam", loss=loss_fn, metrics=["accuracy"])
model.fit(x_train, y_train, epochs=1, batch_size=64)

Output:

782/782 [==============================] - 2350s 3s/step - loss: 4.7012 - accuracy: 0.0830

我使用 Python 3.10 和 Tensorflow 2.11.0。 代码仅适用于用户警告丢失 function

“UserWarning:” sparse_categorical_crossentropy received from_logits=True ,但output参数是由 Softmax 激活产生的,因此不代表 logits。 这是故意的吗? output, from_logits = _get_logits("

也许你可以试试“loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False)”

import tensorflow as tf
cifar = tf.keras.datasets.cifar100
(x_train, y_train), (x_test, y_test) = cifar.load_data()
model = tf.keras.applications.resnet50.ResNet50(
      include_top=True,
      weights=None,
      input_shape=(32, 32, 3),
      classes=100,)

loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False)
model.compile(optimizer="adam", loss=loss_fn, metrics=["accuracy"])
model.fit(x_train, y_train, epochs=5, batch_size=64)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM