Градиенты не предусмотрены ни для одной переменной. Код работал 2 недели назад

#python #tensorflow #keras #neural-network #google-colaboratory

#python #tensorflow #keras #нейронная сеть #google-colaboratory

Вопрос:

Я внедряю модель CNN RNN для подписи к изображениям, используя набор данных flickr8k в Google colab. Еще несколько недель назад этот код работал просто отлично, но теперь он выдает ошибку на model.fit_generator() . В нем говорится, что

Градиенты не предоставлены ни для одной переменной

Я попытался проверить прошлые версии файла только для того, чтобы обнаружить, что ранее, когда код выполнялся должным образом, модель вызывалась model_1 , но теперь она вызывается functional_1 . Генератор, похоже, производит входные данные в соответствии с запросом модели. Я довольно новичок в глубоком обучении, поэтому я не могу понять, как код перестал работать из ниоткуда.

EDIT_1: После того, как я понизил версию tensorflow с 2.3 до 2.2, название модели изменилось с Functional_1 на Model_1, но все же код выдает ту же ошибку. Так что, возможно, проблема была не в этом.

Ссылка на диск с записной книжкой colab и набором данных (открыта для всех): https://drive.google.com/drive/folders/11ZbXrQK3YuVo76-4on4FPa236MfUdk8c?usp=sharing

Код, исключающий предварительную обработку:

 #create input-output sequence pairs from the image description.
#data generator, used by model.fit_generator()
def data_generator(descriptions, features, tokenizer, max_length):
    while 1:
        for key, description_list in descriptions.items():
            #retrieve photo features
            feature = features[key][0]
            input_image, input_sequence, output_word = create_sequences(tokenizer, max_length, description_list, feature)
            yield [[input_image, input_sequence], output_word]

def create_sequences(tokenizer, max_length, desc_list, feature):
        X1, X2, y = list(), list(), list()
        # walk through each description for the image
        for desc in desc_list:
            # encode the sequence
            seq = tokenizer.texts_to_sequences([desc])[0]
            # split one sequence into multiple X,y pairs
            for i in range(1, len(seq)):
                # split into input and output pair
                in_seq, out_seq = seq[:i], seq[i]
                # pad input sequence
                in_seq = pad_sequences([in_seq], maxlen=max_length)[0]
                # encode output sequence
                out_seq = to_categorical([out_seq], num_classes=vocab_size)[0]
                # store
                X1.append(feature)
                X2.append(in_seq)
                y.append(out_seq)
        return np.array(X1), np.array(X2), np.array(y)
    #You can check the shape of the input and output for your model
    [a,b],c = next(data_generator(train_descriptions, features, tokenizer, max_length))
    a.shape, b.shape, c.shape
    #((47, 2048), (47, 32), (47, 7577))

from keras.utils import plot_model
# define the captioning model
def define_model(vocab_size, max_length):
    # features from the CNN model squeezed from 2048 to 256 nodes
    inputs1 = Input(shape=(2048,))
    fe1 = Dropout(0.5)(inputs1)
    fe2 = Dense(256, activation='relu')(fe1)
    # LSTM sequence model
    inputs2 = Input(shape=(max_length,))
    se1 = Embedding(vocab_size, 256, mask_zero=True)(inputs2)
    se2 = Dropout(0.5)(se1)
    se3 = LSTM(256)(se2)
    # Merging both models
    decoder1 = add([fe2, se3])
    decoder2 = Dense(256, activation='relu')(decoder1)
    outputs = Dense(vocab_size, activation='softmax')(decoder2)
    # tie it together [image, seq] [word]
    model = Model(inputs=[inputs1, inputs2], outputs=outputs)
    model.compile(loss='categorical_crossentropy', optimizer='adam')
    # summarize model
    print(model.summary())
    plot_model(model, to_file='model.png', show_shapes=True)
    return model

# train our model
print('Dataset: ', len(train_imgs))
print('Descriptions: train=', len(train_descriptions))
print('Photos: train=', len(train_features))
print('Vocabulary Size:', vocab_size)
print('Description Length: ', max_length)
model = define_model(vocab_size, max_length)
epochs = 10
steps = len(train_descriptions)
# making a directory models to save our models
os.mkdir("models")
for i in range(epochs):
    generator = data_generator(train_descriptions, train_features, tokenizer, max_length)
    model.fit_generator(generator, epochs=1, steps_per_epoch= steps, verbose=1)
    model.save("models/model_"   str(i)   ".h5")
  

Сгенерирована ошибка:

 ValueError: in user code:

    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:806 train_function  *
        return step_function(self, iterator)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:796 step_function  **
        outputs = model.distribute_strategy.run(run_step, args=(data,))
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:1211 run
        return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:2585 call_for_each_replica
        return self._call_for_each_replica(fn, args, kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:2945 _call_for_each_replica
        return fn(*args, **kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:789 run_step  **
        outputs = model.train_step(data)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:757 train_step
        self.trainable_variables)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:2737 _minimize
        trainable_variables))
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/optimizer_v2/optimizer_v2.py:562 _aggregate_gradients
        filtered_grads_and_vars = _filter_grads(grads_and_vars)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/optimizer_v2/optimizer_v2.py:1271 _filter_grads
        ([v.name for _, v in grads_and_vars],))

    ValueError: No gradients provided for any variable: ['embedding/embeddings:0', 'dense/kernel:0', 'dense/bias:0', 'lstm/lstm_cell/kernel:0', 'lstm/lstm_cell/recurrent_kernel:0', 'lstm/lstm_cell/bias:0', 'dense_1/kernel:0', 'dense_1/bias:0', 'dense_2/kernel:0', 'dense_2/bias:0'].
  

Комментарии:

1. Это не реальное решение, но вы могли бы вернуться к tf 2.2 в Google colab и попробовать перезапустить, чтобы увидеть, является ли проблема с управлением версиями.

2. Я понизил версию, и теперь, когда я создаю модель, ее имя model_1 такое же, как и в предыдущей версии кода, но ошибка «Градиент не найден» по-прежнему сохраняется.

Ответ №1:

Для всех, кто сталкивался с такой же ошибкой в Google colab, самым быстрым решением, которое сработало для меня, было понижение версии обоих, TensorFlow и Keras. Версии, которые работали для меня, были:

Tensorflow = 2.2 Keras = 2.3.1

Я просто удаляю предыдущую версию и устанавливаю указанную версию с помощью pip.