【问题标题】:Tensorflow No gradients provided for any variableTensorflow 没有为任何变量提供梯度
【发布时间】:2021-05-11 20:08:28
【问题描述】:

总的来说,我是 TensorFlow 和机器学习的新手。我正在尝试创建一个模型来通过 MRI 检测脑肿瘤。

我正在使用validation_split 拆分数据。编译模型后,当我尝试使用 .fit 函数进行拟合时,出现此错误。谷歌搜索后我发现我可能是因为在调用fit 函数时我没有传递y 参数。

代码

datagen = ImageDataGenerator(validation_split=0.2, rescale=1. / 255)

train_generator = datagen.flow_from_directory(
    TRAIN_DIR,
    target_size=(150, 150),
    batch_size=32,
    class_mode='binary',
    subset='training'
)

val_generator = datagen.flow_from_directory(
    TRAIN_DIR,
    target_size=(150, 150),
    batch_size=32,
    class_mode='binary',
    subset='validation'
)

model = tf.keras.models.Sequential()
model.add(
    tf.keras.layers.Conv2D(
        16,
        (3, 3),
        activation='relu',
        input_shape=(150, 150, 3)
    )
)
model.add(
    tf.keras.layers.MaxPool2D(2, 2)
)

...
# some more layers
...

model.compile(
    optimizer='adam',
    loss=None,
    metrics=['accuracy'],
)

print(model.summary())

Test = model.fit(
    train_generator,
    epochs=2,
    verbose=1,
    validation_data=val_generator
)

我做错了什么?

图片的文件夹结构

images
|
├── training
│   ├── no
│   ├── yes
├── testing
│   ├── no
│   ├── yes

确切的错误消息

ValueError: No gradients provided for any variable: ['conv2d/kernel:0', 'conv2d/bias:0', 'conv2d_1/kernel:0', 'conv2d_1/bias:0', 'conv2d_2/kernel:0', 'conv2d_2/bias:0', 'dense/kernel:0', 'dense/bias:0', 'dense_1/kernel:0', 'dense_1/bias:0'].

model.summary() 的输出

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
conv2d (Conv2D)              (None, 148, 148, 16)      448
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 74, 74, 16)        0
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 72, 72, 32)        4640
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 36, 36, 32)        0
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 34, 34, 64)        18496
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 17, 17, 64)        0
_________________________________________________________________
flatten (Flatten)            (None, 18496)             0
_________________________________________________________________
dense (Dense)                (None, 512)               9470464
_________________________________________________________________
dense_1 (Dense)              (None, 2)                 1026
=================================================================
Total params: 9,495,074
Trainable params: 9,495,074
Non-trainable params: 0

【问题讨论】:

  • 1) 为什么使用 TRAIN_DIR 作为训练和验证的路径? 2) 你能给出“print(model.summary())”这一行的输出吗?
  • @ajayeswar 1) 我是 ML 和张量流的新手,我在关注 tensorflows 文档时看到了类似的东西并试图实现它。 2) 输出太长,无法在此处的 cmets 中发布
  • 您能分享一下您用来运行此代码的 tf 文档吗?我无法从你分享的信息中推断出任何东西
  • @ajayeswar 我稍微改变了文件夹结构。制作了两个文件夹trainingtesting。还是一样的错误。
  • @ajayeswar 我已经解决了这个问题。错误是因为我将loss 设置为None。改变已经解决了我的问题。请参阅@krenrd 的回答,他们对此进行了解释。

标签: python tensorflow


【解决方案1】:

这是因为您将损失设置为None,没有提供从损失函数返回到模型的梯度。修改

model.compile(
    optimizer='adam',
    loss=None,
    metrics=['accuracy'],
)

model.compile(
    optimizer='adam',
    loss='mse', # or some other loss
    metrics=['accuracy'],
)

【讨论】:

    猜你喜欢
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 2020-09-30
    • 1970-01-01
    • 2021-09-08
    • 2021-04-17
    • 1970-01-01
    相关资源
    最近更新 更多