tensorflow session() 需要很长时间
tensorflow session() takes long time
我正在玩 tensorflow。我为我的预测计算并集的交集,并将其转换为 "readable" 格式,我使用以下代码使用 .eval() 函数。
def iou(y_true, y_pred,label : int):
y_true = K.cast(K.equal(K.argmax(y_true), label), K.floatx())
y_pred = K.cast(K.equal(K.argmax(y_pred), label), K.floatx())
intersection = K.sum(y_true * y_pred)
union = K.sum(y_true) + K.sum(y_pred) - intersection
return K.switch(K.equal(union, 0), 1.0, intersection / union)
def mean_iou(y_true, y_pred):
num_labels = (K.int_shape(y_pred)[-1] )
all_iou = []
total_iou = tf.convert_to_tensor(0, dtype='float32')
for label in range(num_labels):
total_iou = total_iou + iou(y_true, y_pred, label)
return total_iou / num_labels
one_ious, zero_ious, mean_ious, accuracies=[], [], [], []
with tf.Session() as sess:
for it in range(len(y_test)):
tmp=iou(y_test[it],y_pred[it],1)
one_ious.append(tmp.eval())
tmp=iou(y_test[it],y_pred[it],0)
zero_ious.append(tmp.eval())
tmp=mean_iou(tf.convert_to_tensor(y_test[it]),tf.convert_to_tensor(y_pred[it]))
mean_ious.append(tmp.eval())
问题是它需要很长时间(对于 1500 个 16k 点的数组,这样做可能需要半个多小时)。
我想知道你们中是否有人可以帮助我理解为什么需要这么长时间,如何解决它,以及是否有更好的方法来做同样的事情。
我找到了部分解决这个问题的方法。该函数最慢的部分是 for 循环中的 3 .eval(),在我的计算机上分别花费了大约 5、1.5 和 1.5 秒,最终用了大约 3 个半小时来为 1600 个数组执行此任务。
只需将结果附加到 python 列表并在最终列表上应用 .eval() 函数即可在大约 3 分钟内完成相同的任务。
tmp1, tmp2, tmp3=[], [], []
import time
start=time.time()
with tf.Session() as sess:
for it in range(len(y_test)):
tmp1.append(iou(y_test[it],y_pred[it]),1)
tmp2.append(iou(y_test[it],y_pred[it]),0)
tmp3.append(mean_iou(tf.convert_to_tensor(y_test[it]),tf.convert_to_tensor(y_pred[it])))
one_ious=tf.convert_to_tensor(tmp1)
zero_ious=tf.convert_to_tensor(tmp2)
mean_ious=tf.convert_to_tensor(tmp3)
tmp1, tmp2, tmp3=[], [], []
one_ious=one_ious.eval()
zero_ious=zero_ious.eval()
mean_ious=mean_ious.eval()
end=time.time()
print('time: {}'.format(end-start))
不确定这是完成这项工作的最佳方法,但它确实有效。如果有更好的意见,我会很高兴听到。
我正在玩 tensorflow。我为我的预测计算并集的交集,并将其转换为 "readable" 格式,我使用以下代码使用 .eval() 函数。
def iou(y_true, y_pred,label : int):
y_true = K.cast(K.equal(K.argmax(y_true), label), K.floatx())
y_pred = K.cast(K.equal(K.argmax(y_pred), label), K.floatx())
intersection = K.sum(y_true * y_pred)
union = K.sum(y_true) + K.sum(y_pred) - intersection
return K.switch(K.equal(union, 0), 1.0, intersection / union)
def mean_iou(y_true, y_pred):
num_labels = (K.int_shape(y_pred)[-1] )
all_iou = []
total_iou = tf.convert_to_tensor(0, dtype='float32')
for label in range(num_labels):
total_iou = total_iou + iou(y_true, y_pred, label)
return total_iou / num_labels
one_ious, zero_ious, mean_ious, accuracies=[], [], [], []
with tf.Session() as sess:
for it in range(len(y_test)):
tmp=iou(y_test[it],y_pred[it],1)
one_ious.append(tmp.eval())
tmp=iou(y_test[it],y_pred[it],0)
zero_ious.append(tmp.eval())
tmp=mean_iou(tf.convert_to_tensor(y_test[it]),tf.convert_to_tensor(y_pred[it]))
mean_ious.append(tmp.eval())
问题是它需要很长时间(对于 1500 个 16k 点的数组,这样做可能需要半个多小时)。
我想知道你们中是否有人可以帮助我理解为什么需要这么长时间,如何解决它,以及是否有更好的方法来做同样的事情。
我找到了部分解决这个问题的方法。该函数最慢的部分是 for 循环中的 3 .eval(),在我的计算机上分别花费了大约 5、1.5 和 1.5 秒,最终用了大约 3 个半小时来为 1600 个数组执行此任务。
只需将结果附加到 python 列表并在最终列表上应用 .eval() 函数即可在大约 3 分钟内完成相同的任务。
tmp1, tmp2, tmp3=[], [], []
import time
start=time.time()
with tf.Session() as sess:
for it in range(len(y_test)):
tmp1.append(iou(y_test[it],y_pred[it]),1)
tmp2.append(iou(y_test[it],y_pred[it]),0)
tmp3.append(mean_iou(tf.convert_to_tensor(y_test[it]),tf.convert_to_tensor(y_pred[it])))
one_ious=tf.convert_to_tensor(tmp1)
zero_ious=tf.convert_to_tensor(tmp2)
mean_ious=tf.convert_to_tensor(tmp3)
tmp1, tmp2, tmp3=[], [], []
one_ious=one_ious.eval()
zero_ious=zero_ious.eval()
mean_ious=mean_ious.eval()
end=time.time()
print('time: {}'.format(end-start))
不确定这是完成这项工作的最佳方法,但它确实有效。如果有更好的意见,我会很高兴听到。