Преобразование списка в n-мерный массив для передачи в TFlearn

Я разрабатываю CNN для классификации изображений с помощью TFlearn на основе тензорного потока, и теперь я создаю наборы данных с помощью scipy.misc.imread, и я устанавливаю размер изображения 150x150, каналы = 3, и теперь я получаю список, содержащий 4063 (количество моих изображений) (150, 150, 3) массив, и теперь я хочу преобразовать его в nd-array (4063, 150, 150, 3), я не знаю, как его решить, пожалуйста, помогите меня. Заранее спасибо!

import numpy as np
import os
import tensorflow as tf
from scipy import misc
from PIL import Image

IMAGE_SIZE = 150
image_path = "dragonfly"

labels = np.zeros((4063, 1))
labels [0:2363] = 1
labels [2364:4062] = 0
test_labels = np.zeros((200, 1))
test_labels [0:99] = 1
test_labels [100:199] = 0

fset = []
fns=[os.path.join(root,fn) for root,dirs,files in os.walk(image_path) for fn in files]
for f in fns:
    fset.append(f)

def create_train_data():
    train_data = []
    fns=[os.path.join(root,fn) for root,dirs,files in os.walk(image_path) for fn in files]
    for f in fns:
        image = misc.imread(f)
        image = misc.imresize(image, (IMAGE_SIZE, IMAGE_SIZE, 3))
        train_data.append(np.array(image))
    return train_data

train_data = create_train_data()
print (len(train_data))

training_data = train_data[0:2264] + train_data[2364:3963]
train_labels = np.concatenate((labels[0:2264], labels[2364:3963]))
test_data = train_data[2264:2364] + train_data[3963:4063]

Train_data - это то, что у меня есть, и это список, который я хочу преобразовать.


person Enoch Yang    schedule 10.08.2017    source источник
comment
Мне очень жаль, что я не знаю, как разместить там фотографию, надеюсь, вы понимаете, что я сказал.   -  person Enoch Yang    schedule 10.08.2017
comment
Можете ли вы показать часть кода, с которой у вас возникли проблемы?   -  person Engine    schedule 10.08.2017
comment
@Engine, добавляю в свой вопрос, проверьте пожалуйста   -  person Enoch Yang    schedule 10.08.2017


Ответы (2)


Если у вас есть список изображений (массивов numpy) с фигурами (150, 150, 3), вы можете просто преобразовать внешний список в массив numpy с помощью конструктор или вызов функция np.asarray (которая неявно вызывает конструктор):

np.array([np.ones((150,150,3)), np.ones((150,150,3))]).shape
>>> (2, 150, 150, 3)

Изменить: в вашем случае добавьте это в create_train_data функции return .:

return np.array(train_data)

В качестве альтернативы, если вы хотите добавить несколько массивов numpy в новый массив numpy, вы можете использовать numpy.stack, чтобы добавить их в новое измерение.

import numpy as np
img_1 = np.ones((150, 150, 3))
img_2 = np.ones((150, 150, 3))

stacked_img = np.stack((img_1, img_2))
stacked_img.shape
>>> (2, 150, 150, 3)
person umutto    schedule 10.08.2017
comment
На самом деле длина списка 4063, когда я использую np.array (mylist), возникает ошибка: - person Enoch Yang; 10.08.2017
comment
ValueError: не удалось передать входной массив из формы (150,150,3) в форму (150,150) - person Enoch Yang; 10.08.2017
comment
@EnochYang хм, return np.array(train_data) выдает эту ошибку? - person umutto; 10.08.2017
comment
Файл C: /Users/yangyang/Desktop/untitled0.py, строка 56, в create_train_data return np.array (train_data) ValueError: не удалось передать входной массив из формы (150,150,3) в форму (150,150) @umutto - person Enoch Yang; 10.08.2017
comment
@EnochYang Я пробовал использовать фиктивные изображения, не могу воспроизвести ошибку. Возможно, проверьте, что все изображения успешно читаются как изображения RGB и их размер изменяется до формы (150,150,3). Если один из них черно-белый, возможно, он читал его без каналов. Если это проблема, вы можете принудительно включить режим RGB, используя misc.imread(f, mode='RGB') - person umutto; 10.08.2017
comment
@EnochYang Мне удалось воспроизвести проблему: если изображения имеют разные каналы, он не может преобразовать список в массив numpy, поскольку все они должны иметь одинаковый размер. Попробуйте явно указать аргумент «RGB» для misc.imread, чтобы убедиться, что все они имеют одинаковую форму. Измените строку imread на эту image = misc.imread(f, mode='RGB') - person umutto; 10.08.2017
comment
Это работает, я думаю, это проблема моих данных изображения, большое спасибо! - person Enoch Yang; 10.08.2017

Вы можете просто использовать np.asarray в списке. .

>>> import numpy as np
>>> l = []
>>> for i in range(4063):
...     l.append(np.zeros((150,150,3)))
...
>>> type(l)
<type 'list'>
>>> a = np.asarray(l)
>>> type(a)
<type 'numpy.ndarray'>
>>> a.shape
(4063, 150, 150, 3)
person Shaun Barney    schedule 10.08.2017
comment
Я пробовал, но результат тот же @ShaunBarney - person Enoch Yang; 10.08.2017
comment
Файл C: /Users/yangyang/Desktop/untitled0.py, строка 91, в ‹module› X = np.asarray (training_data) Файл E: \ Anaconda3 \ lib \ site-packages \ numpy \ core \ numeric.py, строка 531, в массиве возврата asarray (a, dtype, copy = False, order = order) ValueError: не удалось передать входной массив из формы (150,150,3) в форму (150,150) - person Enoch Yang; 10.08.2017