У меня есть модель классификации изображений, и я выполняю некоторые преобразования выходных данных модели классификации изображений следующим образом: Здесь модель - модель классификации изображений.
def gethypercols(model,image):
model = hypercol_model(model)
output = model.predict(image)
factor = 2
for i in range(len(output)):
output[i] = tf.convert_to_tensor(output[i],np.float32)
output[i] = (ZeroPadding2D((1,1)))(output[i])
output[i] = (Conv2D(100,(3,3)))(output[i])
# with tf.device('/cpu:0'):
if i in (0,1,2):
output[i] = UpSampling2D(size = (factor**2,factor**2),interpolation='bilinear')(output[i])
elif i in (3,4,5,6):
output[i] = UpSampling2D(size = (factor**3,factor**3),interpolation='bilinear')(output[i])
elif i in (7,8,9,10,11,12):
output[i] = UpSampling2D(size = (factor**4,factor**4),interpolation='bilinear')(output[i])
else: output[i] = UpSampling2D(size = (factor**5,factor**5),interpolation='bilinear')(output[i]) out = Add()([output[0],output[1],output[2],output[3],output[4],output[5],output[6],output[7],output[8],output[9],output[10],output[11],output[12],output[13],output[14],output[15]])
del output
gc.collect()
out = (Activation('sigmoid'))(out)
out = (ZeroPadding2D((1,1)))(out)
out = (Conv2D(20,(3,3)))(out)
print('conversion of tensor to numpy')
#with tf.device('/cpu:0'):
outarray = K.eval(out)
ourarray = np.array(outarray)
outarray = np.squeeze(outarray)
maxvalue = np.amax(outarray)
print('maxvalue in hypercolumns is {}'.format(maxvalue))
thresholdvalue = maxvalue*0.7
outarray[np.where(outarray<thresholdvalue)] = 0
return outarray
def hypercol_model(model):
hypercol_model = Model(inputs=[model.input],outputs=[model.get_layer('add_1').output,model.get_layer('add_2').output,model.get_layer('add_3').output,model.get_layer('add_4').output,model.get_layer('add_5').output,model.get_layer('add_6').output,model.get_layer('add_7').output,model.get_layer('add_8').output,model.get_layer('add_9').output,model.get_layer('add_10').output,model.get_layer('add_11').output,model.get_layer('add_12').output,model.get_layer('add_13').output,model.get_layer('add_14').output,model.get_layer('add_15').output,model.get_layer('add_16').output])
return hypercol_model
Я загружаю каждое изображение из генератора с batch_size = 1, но после запуска нескольких изображений выдает ошибку «Недостаточно памяти (OOM)». Я не мог понять потенциальную причину этой проблемы. Может кто-нибудь объяснить причину этого и что я должен сделать, чтобы избежать этой ошибки. Ошибка происходит для преобразования тензора в массив numpy outarray = K.eval(out)
на этом этапе. Я не мог придумать какой-либо другой способ преобразовать тензор в ноль. Но я не понял, почему это преобразование не выдает никакой ошибки для самого первого изображения. Это мой генератор:
def initgenerator(batch_size,target_size,train_images_list):
train_images_list = iter(train_images_list)
target_size = target_size[:2]
while True:
img_out = np.zeros(((batch_size,)+target_size+(3,)))
for i in range(batch_size):
img_file = next(train_images_list)
print(img_file)
img_path = 'JPEGImages/'+img_file+'.jpg'
print(img_path)
# Read and resize image and mask
img = cv2.imread(img_path, cv2.IMREAD_COLOR) # BGR
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) #RGB
img = cv2.resize(img,target_size)
img = preprocess_input(img)
img_out[i,:,:,:] = img.astype(np.float32)
yield(img_out)
Train_images_list - список имен файлов изображений. размер партии равен 1, а целевой размер равен (224,224,3)