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