Ich arbeite an einem Bildunterschrift -Projekt mit einer einfachen CNN + LSTM -Architektur, wie es durch den Kurs, den ich studiere, vorgeschrieben ist. Der vollständige Code ist hier auf GitHub ( Hinweis : Einige Teile sind speicherintensiv und rechnerisch schwer). Das Modell lernt jedoch konsequent keine aussagekräftigen Beziehungen zwischen Bildern und Bildunterschriften - die Genauigkeit und der Verlust verbessern sich kaum und die vorhergesagten Bildunterschriften sind ausgeschaltet. categorical_crossentropy und One-HOT-Ziele über to_categorical ,
[*] Umschalten auf sparse_categorical_crossentropy mit integer zielen,
Verwenden Sie beide Default-Adam und adam (lern_rate = 0,000) , und adam (lernung_rate = 0.000) , Hinzufügen von dichteren Schichten nach der Fusion. Ich vermute, dass das Problem darin liegt, wie die Bildfunktionen und Untertitel -Token verbunden sind, aber ich bin mir nicht sicher, was die beste Praxis für diese Art von Fusion ist. VGG16 und LSTM?from tensorflow.keras.preprocessing.sequence import pad_sequences
import numpy as np
import random
def data_generator(data_keys, features, mapping, tokenizer, max_length, vocab_size, batch_size):
"""
Generator that yields batches of training data for image captioning.
Each sample consists of:
- X1: image feature vector (from CNN)
- X2: input sequence of word indices (padded)
- y: target word index (integer, not one-hot)
This version is optimized for use with sparse_categorical_crossentropy.
"""
X1, X2, y = [], [], []
n = 0
while True:
# Shuffle image keys to randomize batch order
random.shuffle(data_keys)
for key in data_keys:
captions = mapping[key]
# Process each caption associated with the current image
for caption in captions:
# Convert caption text to a sequence of token IDs
seq = tokenizer.texts_to_sequences([caption])[0]
# Generate multiple input-output pairs from the sequence
for i in range(1, len(seq)):
# Input sequence: all tokens before position i
in_seq = seq[:i]
# Output token: the token at position i
out_seq = seq
# Skip if target word is padding (index 0)
if out_seq == 0:
continue
# Pad input sequence to fixed length
in_seq = pad_sequences([in_seq], maxlen=max_length, padding='post')[0]
# Get image ID (strip file extension)
image_id = key.split('.')[0]
# Sanity checks
assert image_id in features, f"Missing image_id: {image_id}"
assert features[image_id].shape == (4096,), f"Bad shape: {features[image_id].shape}"
# Append sample to batch buffers
X1.append(features[image_id]) # image features
X2.append(in_seq) # input sequence
y.append(out_seq) # target word index (integer)
n += 1 # Count samples
# Yield batch when full
if n == batch_size:
yield (np.array(X1), np.array(X2)), np.array(y)
X1, X2, y = [], [], []
n = 0
< /code>
aktuelle Modelldefinition < /strong> < /p>
from tensorflow.keras.layers import Input, Dense, LSTM, Embedding, Dropout, add
from tensorflow.keras.utils import plot_model
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.models import Model
# Image Feature layers
inputs1 = Input(shape=(4096,))
Features1 = Dropout(0.0)(inputs1)
Features2 = Dense(256, activation='relu')(Features1)
# Text Feature layers
inputs2 = Input(shape=(max_length_cap,))
seq1 = Embedding(vocab_size,256,mask_zero=True)(inputs2)
seq2 = Dropout(0.0)(seq1)
seq3 =LSTM(256)(seq2)
# Fusion
fusion = add([Features2, seq3])
decoder1 = Dense(512, activation='relu')(fusion)
decoder2 = Dense(256, activation='relu')(decoder1)
decoder3 = Dense(256, activation='relu')(decoder2)
# Output
outputs = Dense(vocab_size, activation='softmax')(decoder3)
# Functional API
model = Model(inputs=[inputs1, inputs2], outputs=outputs)
model.compile(
loss='sparse_categorical_crossentropy',
optimizer=Adam(learning_rate=0.0005),
metrics=['accuracy']
)
#plot the model
plot_model(model,show_shapes=True)
< /code>
Aktuelles Architekturdiagramm < /strong>
Multimodel für Bildunterschriften mit CNN und LSTM über Flickr30K lernt nicht. Wie kann man Bildfunktionen und Wortbette ⇐ Python
-
- Similar Topics
- Replies
- Views
- Last post