【发布时间】:2020-02-15 14:51:18
【问题描述】:
在其他框架中工作了一段时间后,我正在学习 Keras,并且我有以下代码玩具代码示例:
import keras.layers
import keras.models
import numpy as np
from keras.optimizers import Adam
import random
import os
import cv2
import tensorflow as tf
TrainingDirectory="/home/thijser/host/ImageConverter/trainingdata"
def main():
model = define_feedforward_network1()
compileModel(model)
model.summary()
train(model)
def define_feedforward_network1():
inp = keras.engine.input_layer.Input(shape=(None,None,3))
init = keras.initializers.RandomNormal(stddev=0.02)
layer1=keras.layers.Conv2D(64, (4,4), activation='relu', padding='same', kernel_initializer=init)(inp)
layer2 = keras.layers.Conv2D(128, (4,4), activation='relu', padding='same', kernel_initializer=init)(layer1)
outp = keras.layers.Conv2D(3, (4,4), activation='relu', padding='same', kernel_initializer=init)(layer2)
return keras.Model(input=inp,output=outp)
def compileModel(model):
adam=keras.optimizers.Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, amsgrad=False)
model.compile(loss="mse", optimizer=adam,
metrics=["mse"])
def train(model):
model.fit_generator(mygenerator(),steps_per_epoch=100,epochs=16)
def mygenerator():
batch_features=None
batch_labels=None
while True:
target=random.choice(os.listdir(TrainingDirectory))
batch_features=cv2.imread(TrainingDirectory+'/'+target+"/input.jpg", cv2.IMREAD_COLOR)
batch_labels=cv2.imread(TrainingDirectory+'/'+target+"/labelcol.png", cv2.IMREAD_COLOR)
yield np.array([batch_features]), np.array([batch_labels])
main()
这是一个简单的神经网络,用于(在这种情况下)将彩色图像转换为灰度图像(只是为了感受一下)。可以通过将多个文件夹放入 trainingDirectory 文件夹并在每个文件夹中放置一个名为 labelcol.png 的图像和另一个 input.jpg(与第一个相同的大小)来运行它。
但是,当我运行它时,它很快就会出现错误(就在前 16 张图像即将结束时进入训练阶段)。如果我打开 report_tensor_allocations_upon_oom 我会得到一个段错误,因此它不会为我提供有用的信息,但是我可以看到内存使用量一次跳跃大约 100-300 MB,这表明整个张量可能不会被释放。
有人知道我做错了什么吗?
【问题讨论】:
-
图片的尺寸是多少?您只使用 Conv 层,因此运行 3000x3000x3 图像,第一层后将产生 3000x3000x64,第二层后产生 3000x3000x128,依此类推。尝试将图像重新设置为 200x200 或类似的大小,看看是否能解决您的问题
标签: python tensorflow machine-learning keras memory-leaks