#python #tensorflow #deep-learning #dataset #efficientnet
Вопрос:
У меня есть сложенная модель из 5 моделей EfficientNetB3. Я пытаюсь извлечь из этого предсказания. Ниже приведены набор данных и построение модели:
Набор данных:
def build_decoder(with_labels=True, target_size=(300, 300), ext='jpg'):
def decode(path):
file_bytes = tf.io.read_file(path)
if ext == 'png':
img = tf.image.decode_png(file_bytes, channels=3)
elif ext in ['jpg', 'jpeg']:
img = tf.image.decode_jpeg(file_bytes, channels=3)
else:
raise ValueError("Image extension not supported")
img = tf.cast(img, tf.float32) / 255.0
img = tf.image.resize(img, target_size)
return img
def decode_with_labels(path, label):
return decode(path), label
return decode_with_labels if with_labels else decode
def build_dataset(paths, labels=None, bsize=32, cache=True, decode_fn=None, augment_fn=None, augment=True, repeat=True, shuffle=1024, cache_dir=""):
if cache_dir != "" and cache is True:
os.makedirs(cache_dir, exist_ok=True)
if decode_fn is None:
decode_fn = build_decoder(labels is not None)
if augment_fn is None:
augment_fn = build_augmenter(labels is not None)
AUTO = tf.data.experimental.AUTOTUNE
slices = paths if labels is None else (paths, labels)
dset = tf.data.Dataset.from_tensor_slices(slices)
dset = dset.map(decode_fn, num_parallel_calls=AUTO)
dset = dset.cache(cache_dir) if cache else dset
dset = dset.map(augment_fn, num_parallel_calls=AUTO) if augment else dset
dset = dset.repeat() if repeat else dset
dset = dset.shuffle(shuffle) if shuffle else dset
dset = dset.batch(bsize).prefetch(AUTO)
return dset
test_decoder = build_decoder(with_labels=False, target_size=(300, 300), ext='png')
dtest = build_dataset(test_paths, bsize=2, repeat=False, shuffle=False, augment=False, cache=False, decode_fn=test_decoder)
Многослойная модель:
with strategy.scope():
models = load_all_models()
for i, model in enumerate(models):
model.layers[1]._name = f'effnet_layer{i}'
for layer in model.layers:
layer._name = layer.name str(f"_{i}")
layer.trainable = False
ensemble_visible = [model.input for model in models]
ensemble_outputs = [model.output for model in models]
merge = tf.keras.layers.concatenate(ensemble_outputs)
merge = tf.keras.layers.Dense(10, activation='relu')(merge)
output = tf.keras.layers.Dense(n_labels, activation='softmax')(merge)
model = tf.keras.models.Model(inputs=ensemble_visible, outputs=output)
model.compile(optimizer=tf.keras.optimizers.Adam(),
loss='categorical_crossentropy',
metrics=[tf.keras.metrics.AUC(multi_label=True)])
Я пытаюсь делать прогнозы, используя следующий сегмент кода:
X = tf.data.Dataset.zip((dtest, dtest, dtest, dtest, dtest))
X_pred = []
for image in X.take(-1):
X_pred.append(image)
sub_df[label_cols] = stack_model.predict(X_pred, verbose=1)
Но я получаю следующую ошибку:
Ошибка значения: Модель слоя ожидает 5 входных данных, но она получила 3035 входных тензоров. Материалы, полученные: [<tf.Tensor ‘IteratorGetNext:0’=»» shape=»(None,» 300,=»» 300,=»» 3)=»» dtype=»float32″>, <tf.Tensor ‘IteratorGetNext:1’=»» shape=»(None,» 300,=»» 300,=»» 3)=»» dtype=»float32″>, <tf.Tensor ‘IteratorGetNext:2’=»» shape=»(None,» 300,=»» 300,=»» 3)=»» dtype=»float32″>, <tf.Tensor ‘IteratorGetNext:3’=»» shape=»(None,» 300,=»» 300,=»» 3)=»» dtype=»float32″>, <tf.Tensor ‘IteratorGetNext:4’=»» shape=»(None,» 300,=»» 300,=»» 3)=»» dtype=»float32″>, <tf.Tensor ‘IteratorGetNext:5’=»» shape=»(None,» 300,=»» 300,=»» 3)=»» dtype=»float32″>, <tf.Тензор ‘IteratorGetNext:6’ форма=(никто, 300, 300, 3) dtype=float32>, <tf.Tensor ‘IteratorGetNext:7’=»» shape=»(None,» 300,=»» 300,=»» 3)=»» dtype=»float32″>, <tf.Tensor ‘IteratorGetNext:8’=»» shape=»(None,» 300,=»» 300,=»» 3)=»» dtype=»float32″>, <tf.Tensor ‘IteratorGetNext:9’=»» shape=»(None,» 300,=»» 300,=»» 3)=»» dtype=»float32″>, <tf.Tensor ‘IteratorGetNext:10’=»» shape=»(None,» 300,=»» 300,=»» 3)=»» dtype=»float32″>, <tf.Tensor ‘IteratorGetNext:11’=»» shape=»(None,» 300,=»» 300,=»» 3)=»» dtype=»float32″>, <tf.Tensor ‘IteratorGetNext:12’=»» shape=»(None,» 300,=»» 300,=»» 3)=»» dtype=»float32″>, <tf.Tensor ‘IteratorGetNext:13’=»» shape=»(None,» 300,=»» 300,=»» 3)=»» dtype=»float32″>,……. и так далее
Как я могу устранить эту ошибку? Кстати, набор данных содержит 1214 изображений. Заранее спасибо.
Комментарии:
1. Хороший способ сделать это-распечатать
model.summary ()
. Это показывает структуру сети, а также размеры каждого слоя, включая первый.ensemble_visible = [model.input for model in models]
, что такое содержит ensemble_visible ?