Ядро вымирает во время онлайн выбора триплета для распознавания лиц - PullRequest
0 голосов
/ 02 октября 2019

Данные методы, касающиеся выбора триплетов в режиме онлайн для распознавания лиц

train_dir="/content/training/"
def get_random_faces():
  face_folder=os.listdir(train_dir)
  face_path=[os.path.join(train_dir,face_) for face_ in face_folder]
  random_face_folder=numpy.random.choice(face_path,32,replace=False)
  random_face_values=[cv2.imread(os.path.join(facedir,facename))/255. for facedir in random_face_folder for facename in os.listdir(facedir)]
  random_face_names=[facedir[len(train_dir):] for facedir in random_face_folder for facename in os.listdir(facedir)]
  #print("Face values")
  #print(random_face_values)
  #print("Face Names")
  #print(random_face_names)
  return random_face_values,random_face_names


def triplet(random_face_values,random_face_names):
  anchor=[]
  positive=[]
  negative=[]
  anchor_labels=[]
  positive_labels=[]
  negative_labels=[]
  random_face_values=numpy.array(random_face_values)
  random_face_values=random_face_values.reshape(len(random_face_values),96,96,3)
  random_face_names=numpy.array(random_face_names)
  #print(random_face_values[0])
  with graph.as_default():
    random_face_embedding=model.predict(random_face_values,batch_size=32)
  distance_matrix=pairwise_distances(random_face_embedding,metric="sqeuclidean")
  class_labels=numpy.unique(random_face_names,axis=0)
  for label in class_labels:
    pos_samples=numpy.where(label==numpy.array(random_face_names))[0]
    if(len(pos_samples)==1):
      continue
    for i,j in itertools.combinations(pos_samples,2):
      positive_distance=distance_matrix[i,j]
      neg_bool=numpy.where((label!=numpy.array(random_face_names))*(distance_matrix[i]-positive_distance<0.25))
      if len(neg_bool)>0:
    random_negative_index=numpy.random.choice(len(neg_bool))
    neg_index=neg_bool[random_negative_index]
    anchor.append(random_face_values[i])
    positive.append(random_face_values[j])
    negative.append(random_face_values[neg_index])
    anchor_labels.append(random_face_names[i])
    positive_labels.append(random_face_names[j])
    negative_labels.append(random_face_names[neg_index])

  del random_face_values
  del random_face_names
  #print(len(anchor))
  gc.collect()
  return anchor,positive,negative,anchor_labels,positive_labels,negative_labels


def generate():
  while True:
    anchor=[]
    positive=[]
    negative=[]
    random_face_values,random_face_names=get_random_faces()
    anch,pos,neg,anch_label,pos_label,neg_label=triplet(random_face_values,random_face_names)
    anchor.extend(anch)
    positive.extend(pos)
    negative.extend(neg)
    del anch
    del pos
    del neg
    gc.collect()
    while(len(anchor)<32):
      random_face_values,random_face_names=get_random_faces()
      anch,pos,neg,anch_label,pos_label,neg_label=triplet(random_face_values,random_face_names)
      anchor.extend(anch)
      positive.extend(pos)
      negative.extend(neg)
      del anch
      del pos
      del neg
      gc.collect()
    anchor=numpy.array(anchor[:32])
    print(anchor[0])
    positive=numpy.array(positive[:32])
    print(positive[0])
    negative=numpy.array(negative[:32])
    print(negative[0])
    yield [anchor,positive,negative],None

Я использовал train_gen=generate() orig_model.fit_generator(train_gen,steps_per_epoch=100,epochs=100,verbose=1) для передачи генератора с вычисленным значением триплета.
Я пыталсяТренировал модель, но объем оперативной памяти превысил, а ядро ​​вымерло.
Я попробовал наивный подход для выбора триплетов, и хотя он работал нормально, но он не дает точных результатов.
Можете ли вы помочь мне в этом какпочему ОЗУ превышает и вымирает?

...