Как преобразовать переменную MapDataset в np.array?

#python #python-3.x #tensorflow #machine-learning

#python #python-3.x #тензорный поток #машинное обучение

Вопрос:

Окружающая среда

  • Ubuntu 18.04
  • Python 3.6.8
  • Tensorflow 1.12.0

Проблема

Я хочу преобразовать данные с помощью класса MapDataset в numpy.array, чтобы проверить содержимое.

Подробная информация о данных

У меня есть данные в виде TFRecord. Эти данные содержат изображения (150x150x3) и метки (1 или 0). Эта TFRecord была создана на основе следующего кода.

 def int64_feature(value):
    return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))


def bytes_feature(value):
    return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))

np.random.seed(42)
rnd_index = np.random.permutation(len(image_paths))
X_train, y_train = image_paths[rnd_index[:-1000]], labels[rnd_index[:-1000]]
X_test, y_test = image_paths[rnd_index[-1000:]], labels[rnd_index[-1000:]]

writer = tf.python_io.TFRecordWriter('training.tfrecord')

for image_path, label in zip(X_train, y_train):
    image = cv2.imread(image_path)
    image = cv2.resize(image, (150, 150)) / 255.0
    img_raw = image.tostring()
    ex = tf.train.Example(features=tf.train.Features(feature={                                                                     
                        'image': bytes_feature(img_raw),
                        'label': int64_feature(label)
                         }))
    writer.write(ex.SerializeToString())
writer.close()
  

Анализ данных

Я проанализировал данные следующим кодом.

 def parse(example_proto):
    features = {
        'label' : tf.FixedLenFeature((), tf.int64),
        'image' : tf.FixedLenFeature((), tf.string)
    }
    parsed_features = tf.parse_single_example(example_proto, features)
    img_shape = tf.stack([150, 150, 3])
    image = tf.decode_raw(parsed_features['image'], tf.float32)
    image = tf.reshape(image, img_shape)
    label = tf.cast(parsed_features['label'], tf.int32)
    return image, label


with tf.Session() as sess:
    dataset = tf.data.TFRecordDataset('training.tfrecord')
    dataset = dataset.map(parse)
  

Я хочу получить изображение из переменной ‘dataset’, но я не знаю, как это сделать.

Я попытался запустить следующий код в ноутбуке jupyter.

 with tf.Session() as sess:
    dataset = tf.data.TFRecordDataset('training.tfrecord')
    dataset = dataset.map(parse)
    iterator = dataset.make_initializable_iterator()
    sess.run(iterator.initializer)
    next_element = iterator.get_next()
    elem = next_element[0].eval()

dataset
  

Но я получил сообщение об ошибке.

 InvalidArgumentError: Feature: image (data type: string) is required but could not be found.
     [[{{node ParseSingleExample/ParseSingleExample}} = ParseSingleExample[Tdense=[DT_STRING, DT_INT64], dense_keys=["image", "label"], dense_shapes=[[], []], num_sparse=0, sparse_keys=[], sparse_types=[]](arg0, ParseSingleExample/Const, ParseSingleExample/Const_1)]]
     [[node IteratorGetNext (defined at <ipython-input-3-350cc5050691>:19)  = IteratorGetNext[output_shapes=[[150,150,3], []], output_types=[DT_FLOAT, DT_INT32], _device="/job:localhost/replica:0/task:0/device:CPU:0"](IteratorV2)]]

  

Я новичок в Tensorflow, поэтому я не могу понять, что означает это сообщение и как с ним справиться.

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

1. Проверил код точно так, как он написан. Работает нормально. Как X_train и y_train выглядят?

2. Извините, я отредактировал код.

3. В коде, который я добавил сейчас, переменная ‘image_paths’ представляет собой список строк, содержащих пути к изображениям в формате jpeg, а переменная ‘labels’ представляет собой список целых чисел (0 или 1)

4. Убедитесь, что у вас есть допустимое изображение для cv2.imread . И maki это image = cv2.imread(image_path).astype(np.float32) / 255 не изменяет размер при преобразовании

5. Я могу прочитать изображение из image_path с помощью cv2, и я пытался не изменять размер при преобразовании, но сообщение об ошибке не меняется.