Ошибка типа: объект 'NoneType' не повторяется (файл h5) - PullRequest
0 голосов
/ 29 ноября 2018

Я борюсь с питоном за школьный проект.Я скопировал и вставил некоторый код из этого поста, , изменив только имена переменных.Я пытаюсь конвертировать два файла из h5 в JPG.Вот мой код:

import h5py
import numpy as np
from PIL import Image

hdf = h5py.File("train_happy.h5",'r')
array = np.array(list(hdf.get("train_happy.h5")))
img = Image.fromarray(array.astype('uint8'), 'RGB')
img.save("train_happy.jpg", "JPEG")

hdf2 = h5py.File("test_happy.h5",'r')
array = np.array(list(hdf2.get("test_happy.h5")))
img = Image.fromarray(array.astype('uint8'), 'RGB')
img.save("test_happy.jpg", "JPEG")

training = 'train_happy.jpg'
testing = 'test_happy.jpg'

Я абсолютно ничего не знаю о файлах h5 или конвертации файлов с использованием python.Пожалуйста, помогите!

РЕДАКТИРОВАТЬ: Вот строка, в которой была ошибка:

array = np.array(list(hdf.get("train_happy.h5")))

Если бы мне пришлось угадывать, я бы сказал, что такая же ошибка произойдет в этой строке:

array = np.array(list(hdf2.get("test_happy.h5")))

Кроме того, команда:

print(list(hdf.keys()))

дает мне такой вывод:

['list_classes', 'train_set_x', 'train_set_y']

1 Ответ

0 голосов
/ 29 ноября 2018

Просмотрите пример в своем сообщении!Ваша первоначальная ошибка в строке:

array = np.array(list(hdf.get("train_happy.h5")))

train_happy.h5 - это имя файла HDF5 .Вам необходимо использовать имя набора данных изображения в файле HDF5 (с использованием номенклатуры группы / набора данных).Вывод list(hdf.keys()) указывает, что у вас есть 3 узла на корневом уровне.Каждый узел - это либо группа, либо набор данных (изображение).Не зная точно, что у вас есть, трудно написать следующий шаг.В идеале вы должны использовать .isinstance(), чтобы получить тип узла.Ниже приведен очень простой пример для циклического повторения имен ваших узлов:

for node in list(hdf.keys()) :
    print ('working on node %s' % node)
    object = hdf[node]
    if (isinstance(object, h5py.Group)):
        print ('%s is a Group' % node )
    elif (isinstance(object, h5py.Dataset)):
        print ('%s is a Dataset' % node )

Или вы можете просто взломать и попробовать это (соответственно корректируя нисходящий код): [код ниже изменен согласно комментариям hpaulj]

array_x = hdf.get["train_set_x"][:]
array_y = hdf.get["train_set_y"][:]

Приведенный выше код предполагает, что train_set_x и train_set_y являются наборами данных изображений (аналогично "Photos/Image 1" в вашей ссылке).

Кроме того, вам НЕ нужно второе объявление hdf2 (hdf2 = h5py.File("test_happy.h5",'r')) для обработки второго изображения.Вы можете повторно использовать hdf каждый раз и изменять имя ссылки на группу / набор данных, как показано для array_y выше.

...