我想在每个训练时期后用困惑来评估我的模型。我正在使用带有Tensorflow后端的Keras。问题是,每次评估后,使用越来越多的内存,但从未释放。所以几个时代后,我的系统崩溃了。如果我不使用 keras 和张量流函数,它可以在没有内存问题的情况下工作。但是这样就太慢了。这是代码:
def compute_perplexity(self, modelName, sentences):
all_labels, all_predictions = self.predictLabels_for_perplexity_evaluation(self.models[modelName], sentences)
# add an axis to fit tensor shape
for i in range(len(all_labels)):
all_labels[i] = all_labels[i][:,:, np.newaxis]
#calculate perplexity for each sentence length and each datapoint and append to list
perplexity = []
for i in range(10,15): #range(len(all_labels)):
start = time.time()
xentropy = K.sparse_categorical_crossentropy(tf.convert_to_tensor(all_labels[i]), tf.convert_to_tensor(all_predictions[i]))
perplexity.append(K.eval(K.pow(2.0, xentropy)))
print('time for one set of sentences. ', time.time()- start)
#average for each datapoint
for i in range(len(perplexity)):
perplexity[i] = np.average(perplexity[i], axis=1)
perplexity[i] = np.average(perplexity[i])
return np.mean(perplexity)
无需使用 TensorFlow 评估此指标,您的代码所做的是每次调用all_labels
数组时将其添加到图形中,这解释了您看到的内存使用情况。
考虑使用 numpy 实现所有这些计算,或者使用 feed_dict
在会话中使用新数据进行评估的操作(不使用 tf.convert_to_tensor
)。