#python #numpy #tensorflow #mutable #numpy-ndarray
#python #numpy #тензорный поток #изменяемый #numpy-ndarray
Вопрос:
Я работаю над своей личной функцией увеличения изображения в TensorFlow 2.0. Более конкретно, я написал функцию, которая возвращает случайно увеличенное изображение. Его вход — это image_batch
многомерный numpy
массив с формой:
(no. images, height, width, channel)
что в моем конкретном случае:
(31, 300, 300, 3)
Это код:
def random_zoom(batch, zoom=0.6):
'''
Performs random zoom of a batch of images.
It starts by zero padding the images one by one, then randomly selects
a subsample of the padded image of the same size of the original.
The result is a random zoom
'''
# Import from TensorFlow 2.0
from tensorflow.image import resize_with_pad, random_crop
# save original image height and width
height = batch.shape[1]
width = batch.shape[2]
# Iterate over every image in the batch
for i in range(len(batch)):
# zero pad the image, adding 25-percent to each side
image_distortion = resize_with_pad(batch[i, :,:,:], int(height*(1 zoom)), int(width*(1 zoom)))
# take a subset of the image randomly
image_distortion = random_crop(image_distortion, size=[height, width, 3], seed = 1 i*2)
# put the distorted image back in the batch
batch[i, :,:,:] = image_distortion.numpy()
return batch
Затем я могу вызвать функцию:
new_batch = random_zoom(image_batch)
На данный момент происходит что-то странное: new_batch
количество изображений соответствует моим ожиданиям, и я доволен этим… но теперь также image_batch
был изменен исходный объект ввода! Я этого не хочу, и я не понимаю, почему это происходит.
Ответ №1:
Ну, эта строка batch[i, :,:,:] = image_distortion.numpy()
изменяет массив, который передается в качестве аргумента.
Ваша путаница, вероятно, связана с знакомством с другим языком, таким как C , где объекты, передаваемые в качестве аргументов, неявно копируются.
В Python происходит то, что вы могли бы назвать передачей по ссылке. Никакие копии не делаются, если вы этого не хотите. Следовательно, оба new_batch
и не image_batch
изменяются; это два имени, указывающие на один и тот же объект, который был изменен.
Соответственно, вы можете захотеть сделать что-то подобное batch = batch.copy()
в начале вашей функции.
Комментарии:
1. Спасибо, теперь это работает. Однако я нашел
np.copy(batch)
в документации numpy.2. @Leevo Для большинства целей и задач
copy
метод такой же, какnp.copy
.