我使用Google的TensorFlow DeepDream实现(https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/deepdream/deepdream.ipynb)在一个目录中迭代地进行深度做梦。在
我的代码如下:
model_fn = tensorflow_inception_graph.pb
# creating TensorFlow session and loading the model
graph = tf.Graph()
sess = tf.InteractiveSession(graph=graph)
with tf.gfile.FastGFile(model_fn, 'rb') as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
t_input = tf.placeholder(np.float32, name='input') # define the input tensor
imagenet_mean = 117.0
t_preprocessed = tf.expand_dims(t_input-imagenet_mean, 0)
tf.import_graph_def(graph_def, {'input':t_preprocessed})
def render_deepdream(t_obj, img0=img_noise,
iter_n=10, step=1.5, octave_n=4, octave_scale=1.4):
t_score = tf.reduce_mean(t_obj) # defining the optimization objective
t_grad = tf.gradients(t_score, t_input)[0] # behold the power of automatic differentiation!
# split the image into a number of octaves
img = img0
octaves = []
for i in range(octave_n-1):
hw = img.shape[:2]
lo = resize(img, np.int32(np.float32(hw)/octave_scale))
hi = img-resize(lo, hw)
img = lo
octaves.append(hi)
# generate details octave by octave
for octave in range(octave_n):
if octave>0:
hi = octaves[-octave]
img = resize(img, hi.shape[:2])+hi
for i in range(iter_n):
g = calc_grad_tiled(img, t_grad)
img += g*(step / (np.abs(g).mean()+1e-7))
#print('.',end = ' ')
#clear_output()
#showarray(img/255.0)
return img/255.0
def morphPicture(filename1,filename2,blend,width):
img1 = PIL.Image.open(filename1)
img2 = PIL.Image.open(filename2)
if width is not 0:
img2 = resizePicture(filename2,width)
finalImage= PIL.Image.blend(img1, img2, blend)
del img1
del img2
return finalImage
def save_array(arr, name,direc, ext="png"):
img = np.uint8(np.clip(arr, 0, 1)*255)
img =cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
cv2.imwrite("{d}/{n}.{e}".format(d=direc, n=name, e=ext), img)
del img
framesDir = "my directory"
os.chdir(framesDir)
outputDir ="my directory"
for file in os.listdir(framesDir):
img0 = PIL.Image.open(file)
img0 = np.float32(img0)
dreamedImage = render_deepdream(tf.square(T('mixed4c')),img0,iter_n=3,octave_n=6)
save_array(dreamedImage,1,outputDir,'jpg')
break
i=1
j=0
with tf.device('/gpu:0'):
for file in os.listdir(framesDir):
if j<=1: #already processed first image so we skip it here
j+=1
continue
else:
dreamedImage = "my directory"+str(i)+'.jpg' # get the previous deep dreamed frame
img1 = file # get the next undreamed frame
morphedImage = morphPicture(dreamedImage,img1,0.5,0) #blend the images
morphedImage=np.float32(morphedImage)
dreamedImage = render_deepdream(tf.square(T('mixed4c')),morphedImage,iter_n=3,octave_n=6) #deep dream a
#blend of the two frames
i+=1
save_array(dreamedImage,i,outputDir,'jpg') #save the dreamed image
del dreamedImage
del img1
del morphedImage
time.sleep(0.5)
每当我运行代码超过一个小时时,脚本就会以MemoryError停止。我想一定是某个地方内存泄漏了,但我找不到它。我认为通过包含多个del
语句,我可以消除阻塞RAM/CPU的对象,但它似乎不起作用。在
我的代码中是否存在明显的对象构建?或者是在我的代码下面,也就是说,在tensorflow中?在
如有任何帮助/建议,将不胜感激。谢谢。在
仅供参考,目录中有901个图像。我使用的是Windows7和NVIDIA GeForce GTX 980 Ti。在
99%的情况下,当使用tensorflow时,“内存泄漏”实际上是由于迭代时不断添加到图形中的操作造成的,而不是先构建图形,然后在循环中使用它。在
为循环指定一个设备(
with tf.device('/gpu:0
)这一事实暗示了这种情况:通常为新节点指定设备,因为这不会影响已定义的节点。在幸运的是,tensorflow有一个方便的工具来发现这些错误:^{} 。调用此函数时,此函数将阻止向图形中添加更多节点。最好在迭代之前调用此函数。在
所以在您的例子中,我会在循环之前调用
tf.get_default_graph().finalize()
,并查找它可能抛出的任何错误。在相关问题 更多 >
编程相关推荐