Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 20 additions & 5 deletions caption_generator/caption_generator.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ def __init__(self):
self.index_word = None
self.word_index = None
self.total_samples = None
self.total_samples_dev = None
self.encoded_images = pickle.load( open( "encoded_images.p", "rb" ) )
self.variable_initializer()

Expand All @@ -34,8 +35,20 @@ def variable_initializer(self):
self.total_samples=0
for text in caps:
self.total_samples+=len(text.split())-1
print "Total samples : "+str(self.total_samples)

print "Total samples Train : "+str(self.total_samples)

df_dev = pd.read_csv('Flickr8k_text/flickr_8k_dev_dataset.txt', delimiter='\t')
nb_samples = df_dev.shape[0]
iter = df_dev.iterrows()
for i in range(nb_samples):
x = iter.next()
caps.append(x[1][1])

self.total_samples_dev=0
for text in caps:
self.total_samples_dev+=len(text.split())-1
print "Total samples Dev : "+str(self.total_samples_dev)

words = [txt.split() for txt in caps]
unique = []
for word in words:
Expand All @@ -59,13 +72,13 @@ def variable_initializer(self):
print "Variables initialization done!"


def data_generator(self, batch_size = 32):
def data_generator(self, path, batch_size = 32):
partial_caps = []
next_words = []
images = []
print "Generating data..."
gen_count = 0
df = pd.read_csv('Flickr8k_text/flickr_8k_train_dataset.txt', delimiter='\t')
df = pd.read_csv(path, delimiter='\t')
nb_samples = df.shape[0]
iter = df.iterrows()
caps = []
Expand All @@ -85,6 +98,7 @@ def data_generator(self, batch_size = 32):
for i in range(len(text.split())-1):
total_count+=1
partial = [self.word_index[txt] for txt in text.split()[:i+1]]
#print partial, [txt for txt in text.split()[:i+1]]
partial_caps.append(partial)
next = np.zeros(self.vocab_size)
next[self.word_index[text.split()[i+1]]] = 1
Expand Down Expand Up @@ -139,4 +153,5 @@ def create_model(self, ret_model = False):
return model

def get_word(self,index):
return self.index_word[index]
return self.index_word[index]

19 changes: 19 additions & 0 deletions caption_generator/prepare_dataset.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,19 @@ def prepare_dataset(no_imgs = -1):
test_imgs = f_test_images.read().strip().split('\n') if no_imgs == -1 else f_test_images.read().strip().split('\n')[:no_imgs]
f_test_images.close()

f_dev_images = open('Flickr8k_text/Flickr_8k.devImages.txt','rb')
dev_imgs = f_dev_images.read().strip().split('\n') if no_imgs == -1 else f_dev_images.read().strip().split('\n')[:no_imgs]
f_dev_images.close()

f_train_dataset = open('Flickr8k_text/flickr_8k_train_dataset.txt','wb')
f_train_dataset.write("image_id\tcaptions\n")

f_test_dataset = open('Flickr8k_text/flickr_8k_test_dataset.txt','wb')
f_test_dataset.write("image_id\tcaptions\n")

f_dev_dataset = open('Flickr8k_text/flickr_8k_dev_dataset.txt','wb')
f_dev_dataset.write("image_id\tcaptions\n")

f_captions = open('Flickr8k_text/Flickr8k.token.txt', 'rb')
captions = f_captions.read().strip().split('\n')
data = {}
Expand Down Expand Up @@ -76,6 +83,17 @@ def prepare_dataset(no_imgs = -1):
f_test_dataset.flush()
c_test += 1
f_test_dataset.close()

c_dev = 0
for img in dev_imgs:
encoded_images[img] = get_encoding(encoding_model, img)
for capt in data[img]:
caption = "<start> "+capt+" <end>"
f_dev_dataset.write(img+"\t"+caption+"\n")
f_dev_dataset.flush()
c_dev += 1
f_dev_dataset.close()

with open( "encoded_images.p", "wb" ) as pickle_f:
pickle.dump( encoded_images, pickle_f )
return [c_train, c_test]
Expand All @@ -84,3 +102,4 @@ def prepare_dataset(no_imgs = -1):
c_train, c_test = prepare_dataset()
print "Training samples = "+str(c_train)
print "Test samples = "+str(c_test)

9 changes: 5 additions & 4 deletions caption_generator/train_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ def train_model(weight = None, batch_size=32, epochs = 10):
model.load_weights(weight)

counter = 0
file_name = 'weights-improvement-{epoch:02d}.hdf5'
checkpoint = ModelCheckpoint(file_name, monitor='loss', verbose=1, save_best_only=True, mode='min')
file_name = 'weights-improvement-epoch-{epoch:02d}-val_acc-{val_acc:.5f}-val_loss-{val_loss:.5f}.hdf5'
checkpoint = ModelCheckpoint(file_name, monitor='val_acc', verbose=1, save_best_only=True, mode='max')
callbacks_list = [checkpoint]
model.fit_generator(cg.data_generator(batch_size=batch_size), steps_per_epoch=cg.total_samples/batch_size, epochs=epochs, verbose=2, callbacks=callbacks_list)
model.fit_generator(cg.data_generator(path = 'Flickr8k_text/flickr_8k_train_dataset.txt',batch_size=batch_size), steps_per_epoch=cg.total_samples/batch_size, epochs=epochs, verbose=2, callbacks=callbacks_list,validation_steps=cg.total_samples_dev/batch_size,validation_data=cg.data_generator(path = 'Flickr8k_text/flickr_8k_dev_dataset.txt',batch_size=batch_size))
try:
model.save('Models/WholeModel.h5', overwrite=True)
model.save_weights('Models/Weights.h5',overwrite=True)
Expand All @@ -22,4 +22,5 @@ def train_model(weight = None, batch_size=32, epochs = 10):
print "Training complete...\n"

if __name__ == '__main__':
train_model(epochs=50)
train_model(epochs=100)