簡體   English   中英

如何在 model 中輸入 tfrecord 文件並進行訓練?

[英]How to feed tfrecord file in a model and train?

我寫了一個 tfrecord 文件並輸入了我的 Unet model 但輸入形狀有問題。 下面是我的代碼。

關於數據:

  • 484張訓練圖像,每張的形狀為(240, 240, 155, 4),這4個數字分別是高度、寬度、層數和通道數。
  • 484 個標簽,每個標簽的形狀為 (240, 240, 155)

我使用了前兩個示例:

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)

我的 model 架構(我簡化了它):

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)

並得到這個錯誤:層“sequential_2”的輸入0與層不兼容:預期形狀=(無,240,240,155,4),發現形狀=(240,240,155,4)

我怎樣才能解決這個問題? 如果您需要更多信息(數據鏈接或我以前的代碼),請告訴我。

您的 model 需要形狀(samples, 240, 240, 155, 4) ,因此請嘗試以下操作:

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

如果您希望標簽與 output 匹配,則必須設置 strides 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')
])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM