【问题标题】:Conv layer, No gradients provided for any variable卷积层,没有为任何变量提供梯度
【发布时间】:2022-01-10 09:17:42
【问题描述】:

我尝试训练 mnist 数据集,但出现如下错误:


No gradients provided for any variable: ['module_wrapper/conv2d/kernel:0', 
'module_wrapper/conv2d/bias:0', 'module_wrapper_2/conv2d_1/kernel:0', 
'module_wrapper_2/conv2d_1/bias:0', 'module_wrapper_5/dense/kernel:0',
'module_wrapper_5/dense/bias:0', 'module_wrapper_6/dense_1/kernel:0',
'module_wrapper_6/dense_1/bias:0'].


我的适合码:

self.model.fit(x = self.datas.trainImages, y = self.datas.trainLabels, batch_size = self.datas.batch_size, epochs =self.datas.epochs)

这里是变量:

self.datas.trainImages = numpy.stack([cv2.imread(image1)],[cv2.imread(image2), dtype = float64],[cv2.imread(image3)])

self.datas.trainLabels = numpy.stack([0,1,2], dtype = int32)



另外,如果我打印 model.summary(),它是 lenet 模型:

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
module_wrapper (ModuleWrappe (None, 28, 28, 32)        320
_________________________________________________________________
module_wrapper_1 (ModuleWrap (None, 14, 14, 32)        0
_________________________________________________________________
module_wrapper_2 (ModuleWrap (None, 14, 14, 64)        18496
_________________________________________________________________
module_wrapper_3 (ModuleWrap (None, 7, 7, 64)          0
_________________________________________________________________
module_wrapper_4 (ModuleWrap (None, 3136)              0
_________________________________________________________________
module_wrapper_5 (ModuleWrap (None, 500)               1568500
_________________________________________________________________
module_wrapper_6 (ModuleWrap (None, 10)                5010
=================================================================
Total params: 1,592,326
Trainable params: 1,592,326
Non-trainable params: 0
_________________________________________________________________

没有名为 Conv2D 的层,但我添加了它们,


model.add(layers.Conv2D(filters=32,kernel_size=3,strides=1,activation='relu',padding='same'))
model.add(layers.MaxPool2D(pool_size=(2,2),strides=(2,2)))
model.add(layers.Conv2D(filters=64,kernel_size=3,strides=1,activation='relu',padding='same'))
model.add(layers.MaxPool2D(pool_size=(2,2),strides=(2,2)))
model.add(layers.Flatten())
model.add(layers.Dense(500))
model.add(layers.Dense(self.datas.classCount,activation='softmax'))

当我研究这个问题时,google 和 stackoverflow 说在 fit 函数中添加标签,但我已经添加了它们。

更新 1

你可以试试这个代码来运行它:

import tensorflow
from tensorflow.keras import layers
from tensorflow.keras.models import Sequential
import tensorflow.keras.losses


parameters = parameters
datas = datas
model = Sequential()
optimizer = tf.keras.optimizers.SGD()
loss = tensorflow.keras.losses.CategoricalCrossentropy(name = 'CategoricalCrossentropy', from_logits = True)
metrics = tensorflow.keras.metrics.CategoricalAccuracy(name = 'CategoricalAccuracy')


model.add(layers.Conv2D(filters=32,kernel_size=3,strides=1,activation='relu',padding='same'))
model.add(layers.MaxPool2D(pool_size=(2,2),strides=(2,2)))        
model.add(layers.Conv2D(filters=64,kernel_size=3,strides=1,activation='relu',padding='same'))
model.add(layers.MaxPool2D(pool_size=(2,2),strides=(2,2)))
model.add(layers.Flatten())
model.add(layers.Dense(500))
model.add(layers.Dense(self.datas.classCount,activation='softmax'))

trainImages = numpy.stack([[cv2.imread(image1)],[cv2.imread(image2)],[cv2.imread(image3)]], dtype = float64)
#All images is belong to mnist dataset. I read them from a folder and append to list, then convert the dataset list into numpy.stack
trainLabels = numpy.stack([0,1,2], dtype = int32)
model.compile(loss = loss, optimizer = optimizer, metrics = metrics)
model.fit(x = trainImages, y = trainLabels, batch_size = 2, epochs =1)

【问题讨论】:

  • 您只训练 3 张图像?要计算梯度下降,训练数据集的大小必须大于批量大小。
  • @EricMarchand 实际上不是 3,我只是想让你想象一下数据集的格式。我的代码有很多步骤,我只是尽量简化。
  • 请将导入添加到您的问题中。
  • @Dr.Snoopy 我试着让它变得更容易,你可以在更新 1 中看到它。
  • 这些不是所有的导入,层没有在你的代码中定义。

标签: python tensorflow keras deep-learning


【解决方案1】:

这是一个基于您的代码但使用 MNIST 数据集的工作示例,以防万一您不知道,您应该在输出层上使用 softmax 函数或设置损失函数的 from_logits 参数True,但不是两者。

import tensorflow as tf

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()

model = tf.keras.Sequential()
optimizer = tf.keras.optimizers.SGD()
loss = tf.keras.losses.CategoricalCrossentropy(name = 'CategoricalCrossentropy')
metrics = tf.keras.metrics.CategoricalAccuracy(name = 'CategoricalAccuracy')

model.add(tf.keras.layers.Conv2D(filters=32,kernel_size=3,strides=1,activation='relu',padding='same', input_shape=(28, 28, 1)))
model.add(tf.keras.layers.MaxPool2D(pool_size=(2,2),strides=(2,2)))        
model.add(tf.keras.layers.Conv2D(filters=64,kernel_size=3,strides=1,activation='relu',padding='same'))
model.add(tf.keras.layers.MaxPool2D(pool_size=(2,2),strides=(2,2)))
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(500, activation='relu'))
model.add(tf.keras.layers.Dense(10, activation='softmax'))

y_train = tf.keras.utils.to_categorical(y_train, num_classes=10)

print(model.summary())
model.compile(loss = loss, optimizer = optimizer, metrics = metrics)
model.fit(x_train, y_train, batch_size = 64, epochs = 1)
Model: "sequential_3"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv2d_6 (Conv2D)           (None, 28, 28, 32)        320       
                                                                 
 max_pooling2d_6 (MaxPooling  (None, 14, 14, 32)       0         
 2D)                                                             
                                                                 
 conv2d_7 (Conv2D)           (None, 14, 14, 64)        18496     
                                                                 
 max_pooling2d_7 (MaxPooling  (None, 7, 7, 64)         0         
 2D)                                                             
                                                                 
 flatten_3 (Flatten)         (None, 3136)              0         
                                                                 
 dense_6 (Dense)             (None, 500)               1568500   
                                                                 
 dense_7 (Dense)             (None, 10)                5010      
                                                                 
=================================================================
Total params: 1,592,326
Trainable params: 1,592,326
Non-trainable params: 0
_________________________________________________________________
None
938/938 [==============================] - 8s 8ms/step - loss: 24.1966 - CategoricalAccuracy: 0.1079
<keras.callbacks.History at 0x7f831b6d0a50>

【讨论】:

  • 我很复杂。实际上 from_logits 是错误的。我试图运行你的代码,它有效。我用 tf.keras.utils.to_categorical 函数转换了我的标签,但它不再起作用。我认为我的问题是关于输入值,因为在这篇文章之前,我有一些关于输入的问题,here the post
  • 我认为对于 (28,28,32),32 是过滤器编号。
  • 当我打印你的代码摘要时,我得到了第一个卷积层的形状,比如 (2,32,32,32) 两个 32 是图像的形状,另一个 32 是过滤器编号,2 是批处理尺寸。但是在model.summary() 2 中是None,比如(None, 28,28,32)
  • 我使用 tf.expand_dims 作为数据集,我使用了 model.built(input_shape = (28,28,1)) 但它们都不起作用
  • 使用 MNIST 数据集的模型更新了答案。
猜你喜欢
  • 2017-12-12
  • 1970-01-01
  • 2017-06-01
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-31
  • 2020-09-30
相关资源
最近更新 更多