我寫了一個 tfrecord 檔案并輸入我的 Unet 模型,但輸入形狀有問題。下面是我的代碼。
關于資料:
- 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)
我的模型架構(我簡化了它):
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)
我怎樣才能解決這個問題?請告訴我您是否需要更多資訊(資料鏈接或我以前的代碼)。
uj5u.com熱心網友回復:
您的模型需要 shape (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')
])
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/370281.html
標籤:Python 张量流 图像分割 记录 unity3d-unet
