Как передать файл tfrecord в модель и обучить?

#python #tensorflow #image-segmentation #tfrecord #unity3d-unet

#питон #тензорный поток #сегментация изображений #tfrecord #unity3d-unet

Вопрос:

Я написал файл tfrecord и ввел свою модель Unet, но возникли проблемы с формой ввода. Ниже приведен мой код.

О данных:

  • 484 обучающих изображения, каждое из которых имеет форму (240, 240, 155, 4), эти 4 числа являются высотой, шириной, количеством слоев и каналов соответственно.
  • 484 этикетки, каждая из которых имеет форму (240, 240, 155)

Я использовал первые 2 примера:

 test_writer = tf.io.TFRecordWriter('test.tfrecords')  for i in range(2):  example = create_example(image_paths[i], label_paths[i])  test_writer.write(example.SerializeToString())  test_writer.close()  serialised_example = tf.data.TFRecordDataset('test.tfrecords') parsed_example = serialised_example.map(parse_tfrecord)  

Моя архитектура модели (я ее упростил):

 from tensorflow.keras.layers import Conv3D, Conv3DTranspose, Input, Rescaling  num_classes = 4  my_model = tf.keras.Sequential([  Input(shape = (240, 240, 155, 4)), Rescaling(scale = 1./255),  Conv3D(filters = 64, kernel_size = 3, strides = 2, activation = 'relu', padding = 'same'), Conv3D(filters = 64, kernel_size = 3, activation = 'relu', padding = 'same'), # and more layers between... Conv3DTranspose(filters = 64, kernel_size = 3, activation = 'relu', padding = 'same'), Conv3DTranspose(filters = 64, kernel_size = 3, strides = 2, activation = 'relu', padding = 'same'),  Conv3D(filters = num_classes, kernel_size = 3, activation = 'softmax', padding = 'same')  ])  my_model.compile(optimizer = 'rmsprop', loss = 'sparse_categorical_crossentropy')  

Я получил свой набор данных из своего файла tfrecord следующим образом:

 def get_image_and_label(features):  image, label = features['image'], features['label']  return image, label  def get_dataset(tfrecord_names):   dataset = (tf.data.TFRecordDataset(tfrecord_names)  .map(parse_tfrecord)  .map(get_image_and_label))   return dataset  dataset = get_dataset('test.tfrecords')  

Я начал тренироваться:

 my_model.fit(dataset, epochs = 1)  

И получил эту ошибку: Ввод 0 слоя «sequential_2» несовместим со слоем: ожидаемая форма=(Нет, 240, 240, 155, 4), найденная форма=(240, 240, 155, 4)

Как я могу это исправить? Пожалуйста, сообщите мне, если вам нужна дополнительная информация (ссылка для передачи данных или мой предыдущий код).

Ответ №1:

Ваша модель ожидает форму (samples, 240, 240, 155, 4) , поэтому попробуйте что-нибудь подобное:

 dataset = get_dataset('test.tfrecords').batch(1)  

И вы должны установить strides=1 , хотите ли вы, чтобы ваши метки соответствовали вашим выводам:

 from tensorflow.keras.layers import Conv3D, Conv3DTranspose, Input, Rescaling  num_classes = 4  my_model = tf.keras.Sequential([  Input(shape = (240, 240, 155, 4)), Rescaling(scale = 1./255), Conv3D(filters = 64, kernel_size = 3, strides = 1, activation = 'relu', padding = 'same'), Conv3D(filters = 64, kernel_size = 3, activation = 'relu', padding = 'same'), # and more layers between... Conv3DTranspose(filters = 64, kernel_size = 3, activation = 'relu', padding = 'same'), Conv3DTranspose(filters = 64, kernel_size = 3, strides = 1, activation = 'relu', padding = 'same'),  Conv3D(filters = num_classes, kernel_size = 3, activation = 'softmax', padding = 'same') ])  

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

1. Спасибо!! Я думаю, это работает. Он работал некоторое время, прежде чем разбился в моем Колабе. Я попробую использовать 2D или 3D подход.

2. Вероятно, у вас закончилась память, так как ваши выборки данных огромны.

3. Да, я могу тренироваться только с одним образцом по 4-слойной модели. Я пытаюсь использовать flow_from_directory.