【发布时间】:2020-07-02 05:02:31
【问题描述】:
我有一组 10 个用户,每个用户都有自己的文件夹/目录,其中包含他们共享的 25-30 张图像(例如在某些社交媒体中)。我想根据用户分享的图片来计算用户之间的相似度。
为此,我使用特征提取器将每个图像转换为 224x224x3 数组,然后遍历每个用户及其文件夹中的每个图像,以找到每对图像之间的余弦相似度,然后取所有这些图像的平均值每对用户的成对图像相似度,以找到用户相似度。 (顺便说一下,如果这个逻辑有什么错误,请告诉我)。
我的代码如下:
from tensorflow.keras.applications.imagenet_utils import preprocess_input
from tensorflow.keras.applications import vgg16
from tensorflow.keras.preprocessing.image import load_img,img_to_array
from tensorflow.keras.models import Model
import os
import matplotlib.pyplot as plt
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
import pandas as pd
# load the model
vgg_model = vgg16.VGG16(weights='imagenet')
# remove the last layers in order to get features instead of predictions
feat_extractor = Model(inputs=vgg_model.input, outputs=vgg_model.get_layer("fc2").output)
def processed_image(image):
original = load_img(image, target_size=(224, 224))
numpy_image = img_to_array(original)
image_batch = np.expand_dims(numpy_image, axis=0)
processed_image = preprocess_input(image_batch.copy())
img_features = feat_extractor.predict(processed_image)
return img_features
def image_similarity(image1, image2):
image1 = processed_image(image1)
image2 = processed_image(image2)
sim = cosine_similarity(image1, image2)
return sim[0][0]
user_list = ['User '+str(i) for i in range(1,11)]
user_sim_df = pd.DataFrame(columns=user_list, index=user_list)
for user1 in user_list:
for user2 in user_list:
sum_img_sim = 0
user1_files = [imgs_path + x for x in os.listdir('All_Users/'+user1) if "jpg" in x]
user2_files = [imgs_path + x for x in os.listdir('All_Users/'+user2) if "jpg" in x]
for image1 in user1_files:
for image2 in user2_files:
sum_img_sim += image_similarity(image1, image2)
user_sim_df[user1][user2] = 2*sum_img_sim/(len(user1_files)+len(user2_files))
现在,因为计算用户相似度矩阵涉及到 4 个for 循环,所以代码运行时间也很长(输入这个问题已经超过 30 分钟,代码已经运行了 10每个用户有 25-30 张图片)。
那么,我该如何重写最后一部分以使代码运行得更快?
【问题讨论】:
标签: python performance loops optimization time