【问题标题】:Training CNN: ValueError: No gradients provided for any variable训练 CNN:ValueError:没有为任何变量提供梯度
【发布时间】:2020-09-22 21:24:56
【问题描述】:

我想训练一个包含以下层的模型:

embedding_dim = 80

model = tf.keras.Sequential()
model.add(tf.keras.layers.Conv2D(64, 3, padding='same', activation='relu', input_shape=(50, 120, 3)))
model.add(tf.keras.layers.MaxPool2D(padding='same'))

model.add(tf.keras.layers.Conv2D(128, 3, padding='same', activation='relu'))
model.add(tf.keras.layers.MaxPool2D(padding='same'))

model.add(tf.keras.layers.Conv2D(256, 3, padding='same', activation='relu'))

model.add(tf.keras.layers.Conv2D(256, 3, padding='same', activation='relu'))

model.add(tf.keras.layers.Conv2D(512, 3, padding='same', activation='relu'))

model.add(tf.keras.layers.Conv2D(512,  2, strides=(2, 4), activation='relu'))

model.add(tf.keras.layers.Conv2D(512,  3, activation='relu'))

model.add(tf.keras.layers.Lambda(add_timing_signal_nd))

model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(embedding_dim))

之后,我跑

model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True, reduction='none'), metrics=['accuracy'])

model.fit(image_dataset, epochs=10, validation_data=val_dataset)

我收到以下错误

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', 'conv2d_3/kernel:0', 'conv2d_3/bias:0', 'conv2d_4/kernel:0', 'conv2d_4/bias:0', 'conv2d_5/kernel:0', 'conv2d_5/bias:0', 'conv2d_6/kernel:0', 'conv2d_6/bias:0', 'dense/kernel:0', 'dense/bias:0'].

对于进一步的上下文,add_timing_signa_nd 定义如下

def add_timing_signal_nd(x, min_timescale=1.0, max_timescale=1.0e4):
    """
    Args:
        x: a Tensor with shape [batch, d1 ... dn, channels]
        min_timescale: a float
        max_timescale: a float
    Returns:
        a Tensor the same shape as x.
    """
    static_shape = x.get_shape().as_list()
    num_dims = len(static_shape) - 2
    channels = tf.shape(x)[-1]
    num_timescales = channels // (num_dims * 2)
    log_timescale_increment = (
            math.log(float(max_timescale) / float(min_timescale)) /
            (tf.cast(num_timescales, dtype=tf.float32) - 1))
    inv_timescales = min_timescale * tf.exp(
            tf.cast(tf.range(num_timescales), dtype=tf.float32) * -log_timescale_increment)
    for dim in xrange(num_dims):
        length = tf.shape(x)[dim + 1]
        position = tf.cast(tf.range(length), dtype=tf.float32)
        scaled_time = tf.expand_dims(position, 1) * tf.expand_dims(
                inv_timescales, 0)
        signal = tf.concat([tf.sin(scaled_time), tf.cos(scaled_time)], axis=1)
        prepad = dim * 2 * num_timescales
        postpad = channels - (dim + 1) * 2 * num_timescales
        signal = tf.pad(signal, [[0, 0], [prepad, postpad]])
        for _ in xrange(1 + dim):
            signal = tf.expand_dims(signal, 0)
        for _ in xrange(num_dims - 1 - dim):
            signal = tf.expand_dims(signal, -2)
        x += signal
    return x

如果输入大小有帮助,则如下

(3, 50, 120, 3)
(3, 50, 120, 3)
(3, 50, 120, 3)
(1, 50, 120, 3)

另外,我计划在训练后提取权重,以便在另一个问题中使用它们。

提前致谢!

【问题讨论】:

  • add_timing_signal_nd 中有什么内容可以添加吗?
  • 嗨@thushv89,我已经更新了问题!

标签: python tensorflow machine-learning keras deep-learning


【解决方案1】:

我猜 image_dataset 或 val_dataset 不合适。按照你的代码,我模拟了一些数据(包括标签)来训练,它可以正常运行。

image_dataset = np.random.uniform(0, 1, (3000, 50, 120, 3))
image_dataset_y = np.random.uniform(0, embedding_dim, (3000,)).astype(np.int)
val_dataset = np.random.uniform(0, 1, (300, 50, 120, 3))
val_dataset_y = np.random.uniform(0, embedding_dim, (300,)).astype(np.int)
model.fit(image_dataset, image_dataset_y , batch_size=30, epochs=10, validation_data=(val_dataset, val_dataset_y))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-12
    • 2020-10-23
    • 2017-06-01
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    相关资源
    最近更新 更多