«Плотный слой» ожидает 1 вход(ы), но получил 2 входных тензора» при загрузке модели KerasPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 «Плотный слой» ожидает 1 вход(ы), но получил 2 входных тензора» при загрузке модели Keras

Сообщение Anonymous »

Я работаю над моделью классификации гистопатологических изображений рака молочной железы с использованием Kaggle. Набор данных состоит из 157 572 изображений (78 786 отрицательных IDC и 78 786 положительных IDC), каждое размером 50x50 пикселей.
Я использую ResNet50 в качестве базовой модели и пытаюсь сохраните и позже загрузите наиболее эффективную версию обученной модели. Однако при попытке загрузить сохраненную модель возникает следующая ошибка:

Код: Выделить всё

# Load the model
model = load_model('/kaggle/working/resnet50_model.keras')
Layer "dense" expects 1 input(s), but it received 2 input tensors.  Inputs received: [, ]
Вот мой код:

Код: Выделить всё

import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.applications import ResNet50
from tensorflow.keras.models import load_model

# Data augmentation pipeline
data_augmentation = tf.keras.Sequential([
layers.RandomFlip("horizontal_and_vertical"),
layers.RandomRotation(0.5),
layers.RandomContrast(0.2),
layers.RandomBrightness(0.2),
layers.GaussianNoise(0.1)
])

# Preprocess function to normalize images
def preprocess(image, label):
image = tf.image.resize(image, (50, 50))
image = tf.cast(image, tf.float32) / 255.0
return image, label

# Load the dataset with validation split
train_dir = 'path/to/data'
batch_size = 64
img_height = 50
img_width = 50
validation_split = 0.2
test_split_ratio = 0.5

# Load the dataset
data_train = tf.keras.utils.image_dataset_from_directory(
train_dir,
validation_split=validation_split,
subset="training",
seed=123,
image_size=(img_height, img_width),
batch_size=batch_size
)

data_val = tf.keras.utils.image_dataset_from_directory(
train_dir,
validation_split=validation_split,
subset="validation",
seed=123,
image_size=(img_height, img_width),
batch_size=batch_size
)

# Split the validation set into validation and test sets
def split_dataset(dataset, split_ratio=0.5):
dataset_size = len(dataset)
split = int(split_ratio * dataset_size)
train_dataset = dataset.take(split)
test_dataset = dataset.skip(split)
return train_dataset, test_dataset

data_val, data_test = split_dataset(data_val, split_ratio=test_split_ratio)

# Apply preprocessing and augmentation
data_train = data_train.map(lambda x, y: (data_augmentation(x, training=True), y)).map(preprocess)
data_val = data_val.map(preprocess)
data_test = data_test.map(preprocess)

# Prefetch data for better performance
data_train = data_train.prefetch(tf.data.AUTOTUNE)
data_val = data_val.prefetch(tf.data.AUTOTUNE)
data_test = data_test.prefetch(tf.data.AUTOTUNE)

# Define the ResNet50 model
input_shape = (50, 50, 3)
base_model = ResNet50(weights='imagenet', include_top=False, input_shape=input_shape)
base_model.trainable = False

# Build the model
model = models.Sequential([
layers.Input(shape=(img_height, img_width, 3)),
base_model,
layers.GlobalAveragePooling2D(),
layers.Dense(256, activation='relu'),
layers.Dropout(0.5),
layers.Dense(1, activation='sigmoid')
])

# Compile the model
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

# Callbacks for early stopping and checkpointing
early_stopping = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)

model_checkpoint_callback = tf.keras.callbacks.ModelCheckpoint(
filepath='/kaggle/working/resnet50_model.keras',
monitor='val_loss',
mode='min',
save_best_only=True,
save_weights_only=False
)

# Train the model
model.fit(data_train, epochs=50, validation_data=data_val, callbacks=[early_stopping, model_checkpoint_callback])

# Fine-tune the model
base_model.trainable = True
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=1e-5), loss='binary_crossentropy', metrics=['accuracy'])
model.fit(data_train, epochs=50, validation_data=data_val, callbacks=[early_stopping, model_checkpoint_callback])

# Save model
model.save('/kaggle/working/resnet50_model.keras')

# Load the best fine-tuned model
model = load_model('/kaggle/working/resnet50_model.keras')
Чтобы устранить проблему, я проверил входные изображения, распечатав формы пакетов данных на этапе предварительной обработки. Вот результаты:
  • Данные обучения — пакет 0: Форма изображений: (64, 50, 50, 3), Форма меток: (64 ,)
  • Данные проверки — пакет 0: Форма изображений: (64, 50, 50, 3), Форма меток: (64,)
  • Данные испытаний — партия 0: форма изображений: (64, 50, 50, 3), форма этикеток: (64,)
  • Тестовые данные — партия 0: форма изображений: (64, 50, 50, 3), форма меток: (64,)
  • p>
Я ожидал, что сохраненная модель загрузится без каких-либо проблем, что позволит мне выполнять оценки и делать прогнозы с использованием обученных весов и архитектуры. .

Подробнее здесь: https://stackoverflow.com/questions/788 ... en-loading
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»