преобразование массива размером (n,n,m) в (None,n,n,m)

#python #arrays #numpy #conv-neural-network #reshape

#python #массивы #numpy #conv-нейронная сеть #изменить форму

Вопрос:

Я пытаюсь преобразовать массив размером (14,14,3) в (None, 14,14,3). Я видел, что выходные данные каждого слоя в сверточной нейронной сети имеют форму в формате (None, n, n, m).

Учтите, что имя моего массива — arr

Я пытался arr[None,:,:] , но он преобразует его в размерность (1,14,14,3).

Как мне это сделать?

Комментарии:

1. Я не знаком с тензорными объектами, но, насколько я знаю, в numpy не может быть массива с None формой. Существуют скалярные dtypes, которые имеют пустой кортеж в качестве формы, но я никогда не видел None .

2. Форма вывода уровня сверточной нейронной сети имеет вид (None, n, n, m). Вы имеете в виду, что это невозможно с помощью numpy?

3. Зачем вам нужно это делать для одного примера? Вы передаете это в переменную-заполнитель?

4. @coldspeed Когда я сделал abc = tf.placeholder(«float32», shape=[None, 14, 14, 3]), то abc.shape выдает мне (None, 14,14,3). Я хочу аналогичное для моего массива. Я не знаю, что означает передача переменной-заполнителя, хотя

5. Вы можете сделать feed_dict={abc: arr[None, ...]} , и он будет передан в заполнитель, как и ожидалось. Это то, чего вы хотите, верно? Кстати, у вас не может быть переменных размеров в numpy, потому что, в отличие от TensorFlow, вычисление НЕ является ленивым. Надеюсь, это прояснит ситуацию.

Ответ №1:

https://www.tensorflow.org/api_docs/python/tf/TensorShape

Тензорная форма представляет собой возможно частичную спецификацию формы для тензора. Это может быть одно из следующих:

Частично известная форма: имеет известное количество измерений и неизвестный размер для одного или нескольких измерений. например, TensorShape([None, 256])

Это невозможно в numpy . Известны все размеры a ndarray .

arr[None,:,:] нотация добавляет новое измерение размера 1, (1,14,14,3) . В соответствии с правилами трансляции такое измерение может быть изменено, чтобы соответствовать измерению другого массива. В этом смысле мы часто рассматриваем None как гибкое измерение.


Я не работал с tensorflow , хотя я вижу много вопросов с обоими тегами. tensorflow должны быть механизмы для передачи значений в тензоры и из них. Он знает о numpy , но numpy ничего не «знает» о tensorflow .

ndarray — это объект с известными значениями, и его форма используется для доступа к этим значениям многомерным способом. В отличие от a tensor не имеет значений:

https://www.tensorflow.org/api_docs/python/tf/Tensor

Он не хранит значения выходных данных этой операции, но вместо этого предоставляет средство вычисления этих значений

Похоже, вы можете создать TensorProt из массива (и вернуть массив также из одного):

https://www.tensorflow.org/api_docs/python/tf/make_tensor_proto

и для создания тензора из массива:

https://www.tensorflow.org/api_docs/python/tf/convert_to_tensor

Ответ №2:

Форма, которую (None, 14,14,3) представляет ,(batch_size, imgH, imgW,imgChannel) теперь imgH и imgW могут использоваться взаимозаменяемо, зависит от сети и проблемы. Но batchsize задается как «None» в нейронной сети, потому что мы не хотим ограничивать наш batchsize каким-то конкретным значением, поскольку наш batchsize зависит от множества факторов, таких как память, доступная для запуска нашей модели и т.д.

Итак, допустим, у вас есть 4 изображения размером 14x14x3, затем вы можете добавить каждое изображение в массив, скажем, L1, и теперь L1 будет иметь форму 4x14x14x3, т. е. вы создали пакет из 4 изображений, и теперь вы можете передать это в свою нейронную сеть.

Обратите ВНИМАНИЕ, что здесь None будет заменен на 4, и для всего процесса обучения это будет 4. Аналогично, когда вы отправляете в свою сеть только одно изображение, оно принимает batchsize равным 1 и устанавливает None равным 1, придавая вам форму (1X14X14X3)