我正在使用keras函数API(tf.keras)为图像字幕网络实现以下Keras模型:
import glob
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import pickle
from tqdm import tqdm
import pandas as pd
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, Input
from tensorflow.keras.preprocessing import sequence
from tensorflow.keras.applications import InceptionV3
from tensorflow.keras.preprocessing import image
from tensorflow.keras import Model
import nltk
from google.colab import drive
drive.mount('/content/drive')
def data_generator(batch_size = 32):
partial_caps = []
next_words = []
images = []
df = pd.read_csv(folder_drive + 'flickr8k_training_dataset.txt', delimiter='\t')
df = df.sample(frac=1) #shuffle rows
iter = df.iterrows()
c = []
imgs = []
for i in range(df.shape[0]):
x = next(iter)
c.append(x[1][1])
imgs.append(x[1][0])
count = 0
while True:
for j, text in enumerate(c):
current_image = encoding_train[imgs[j]]
for i in range(len(text.split())-1):
count+=1
partial = [word2idx[txt] for txt in text.split()[:i+1]]
partial_caps.append(partial)
# Initializing with zeros to create a one-hot encoding matrix
# This is what we have to predict
# Hence initializing it with vocab_size length
n = np.zeros(vocab_size)
# Setting the next word to 1 in the one-hot encoded matrix
n[word2idx[text.split()[i+1]]] = 1
next_words.append(n)
images.append(current_image)
if count>=batch_size:
next_words = np.asarray(next_words)
images = np.asarray(images)
partial_caps = sequence.pad_sequences(partial_caps, maxlen=max_len, padding='post')
yield [[images, partial_caps], next_words]
partial_caps = []
next_words = []
images = []
count = 0
image_input = Input(shape = (2048,))
x = layers.Dense(embedding_size, activation='relu')(image_input)
image_output = layers.RepeatVector(max_len)(x)
image_model = Model(inputs=image_input,outputs = image_output)
image_model.summary()
caption_input = Input(shape = (max_len,))
y = layers.Embedding(vocab_size,embedding_size,input_length=max_len)(caption_input)
y = layers.LSTM(256,return_sequences=True)(y)
caption_output = layers.TimeDistributed(layers.Dense(embedding_size))(y)
caption_model = Model(inputs = caption_input, outputs = caption_output)
caption_model.summary()
conca = layers.Concatenate(axis=1)([image_model.output,caption_model.output])
z = layers.Bidirectional(layers.LSTM(256, input_shape = (max_len,300), return_sequences=False))(conca)
z = layers.Dense(vocab_size)(z)
final_output = layers.Activation('softmax')(z)
final_model = Model(inputs = [image_model.input,caption_model.input], outputs = final_output)
final_model.summary()
final_model.compile(loss='categorical_crossentropy', optimizer="rmsprop", metrics=['accuracy'])
final_model.fit_generator(data_generator(batch_size=2048), steps_per_epoch = samples_per_epoch//2048,
verbose=1,epochs = 50)
运行fit_generator方法时,总是会出现以下错误:
Epoch 1/50
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-225-9cb298634256> in <module>()
1 final_model.fit_generator(data_generator(batch_size=2048), steps_per_epoch = samples_per_epoch//2048,
----> 2 verbose=1,epochs = 50)
12 frames
/usr/local/lib/python3.6/dist-packages/tensorflow/python/framework/func_graph.py in wrapper(*args, **kwargs)
966 except Exception as e: # pylint:disable=broad-except
967 if hasattr(e, "ag_error_metadata"):
--> 968 raise e.ag_error_metadata.to_exception(e)
969 else:
970 raise
ValueError: in user code:
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:571 train_function *
outputs = self.distribute_strategy.run(
/usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:951 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:2290 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:2649 _call_for_each_replica
return fn(*args, **kwargs)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:541 train_step **
self.trainable_variables)
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:1804 _minimize
trainable_variables))
/usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/optimizer_v2/optimizer_v2.py:521 _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:1219 _filter_grads
([v.name for _, v in grads_and_vars],))
ValueError: No gradients provided for any variable: ['embedding_6/embeddings:0', 'dense_14/kernel:0', 'dense_14/bias:0', 'lstm_10/lstm_cell_18/kernel:0', 'lstm_10/lstm_cell_18/recurrent_kernel:0', 'lstm_10/lstm_cell_18/bias:0', 'time_distributed_6/kernel:0', 'time_distributed_6/bias:0', 'bidirectional_4/forward_lstm_11/lstm_cell_20/kernel:0', 'bidirectional_4/forward_lstm_11/lstm_cell_20/recurrent_kernel:0', 'bidirectional_4/forward_lstm_11/lstm_cell_20/bias:0', 'bidirectional_4/backward_lstm_11/lstm_cell_21/kernel:0', 'bidirectional_4/backward_lstm_11/lstm_cell_21/recurrent_kernel:0', 'bidirectional_4/backward_lstm_11/lstm_cell_21/bias:0', 'dense_17/kernel:0', 'dense_17/bias:0'
谁能帮助我确定错误的出处,因为我之前从未见过,并且我一直在检查SO中的类似帖子,但是那里的任何解决方案都对我有用。
答案 0 :(得分:0)
尝试一下:
final_model = Model(inputs = [image_input ,caption_input ], outputs = final_output)