#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)