import numpy as np
import tensorflow as tf
import keras
from keras import layers
from tensorflow import data as tf_data
import matplotlib.pyplot as plt
# Define image size and batch size
image_size = (180, 180)
batch_size = 32
# Load the dataset
train_ds, val_ds = keras.utils.image_dataset_from_directory(
"images",
validation_split=0.2,
subset="both",
seed=1337,
image_size=image_size,
batch_size=batch_size,
)
# Define data augmentation layers
data_augmentation_layers = [
layers.RandomFlip("horizontal"),
layers.RandomRotation(0.1),
]
# Data augmentation function
def data_augmentation(images):
for layer in data_augmentation_layers:
images = layer(images)
return images
# Apply data augmentation to the dataset
augmented_train_ds = train_ds.map(
lambda x, y: (data_augmentation(x), y))
# Apply data augmentation to the training images
train_ds = train_ds.map(
lambda img, label: (data_augmentation(img), label),
num_parallel_calls=tf_data.AUTOTUNE,
)
# Prefetch data for faster processing
train_ds = train_ds.prefetch(tf_data.AUTOTUNE)
val_ds = val_ds.prefetch(tf_data.AUTOTUNE)
# Function to create the model with a simplified architecture
def make_simplified_model(input_shape, num_classes):
inputs = keras.Input(shape=input_shape)
# Entry block
x = layers.Rescaling(1.0 / 255)(inputs) # Rescale the input images to [0, 1]
x = layers.Conv2D(128, 3, strides=2, padding="same")(x)
x = layers.BatchNormalization()(x)
x = layers.Activation("relu")(x)
# First block (simplified)
x = layers.SeparableConv2D(256, 3, padding="same")(x)
x = layers.BatchNormalization()(x)
x = layers.Activation("relu")(x)
x = layers.MaxPooling2D(3, strides=2, padding="same")(x)
# Second block (simplified)
x = layers.SeparableConv2D(512, 3, padding="same")(x)
x = layers.BatchNormalization()(x)
x = layers.Activation("relu")(x)
x = layers.MaxPooling2D(3, strides=2, padding="same")(x)
# Global average pooling and dropout
x = layers.GlobalAveragePooling2D()(x)
x = layers.Dropout(0.25)(x)
# Output layer (binary classification)
outputs = layers.Dense(1, activation=tf.nn.sigmoid)(x)
return keras.Model(inputs, outputs)
# Build the model with the simplified architecture
model = make_simplified_model(input_shape=image_size + (3,), num_classes=2)
# Visualize the model structure
keras.utils.plot_model(model, show_shapes=True)
# Number of epochs for training
epochs = 25
# Define callbacks (to save the model during training)
callbacks = [
keras.callbacks.ModelCheckpoint("save_at_{epoch}.keras"),
]
# Compile the model
model.compile(
optimizer=keras.optimizers.Adam(3e-4),
loss=keras.losses.BinaryCrossentropy(from_logits=False),
metrics=[keras.metrics.BinaryAccuracy(name="acc")],
)
# Train the model
history = model.fit(
train_ds,
epochs=epochs,
callbacks=callbacks,
validation_data=val_ds,
)
# Plot training and validation accuracy and loss
plt.plot(history.history['acc'], label='Training Accuracy')
plt.plot(history.history['val_acc'], label='Validation Accuracy')
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.legend()
plt.show()
Вот как я тренирую свою модель, а следующий код проверяет прогноз:
import tensorflow as tf
from tensorflow import keras
import numpy as np
from PIL import Image
# Load the saved model with weights (make sure you use the correct epoch file)
model = keras.models.load_model("save_at_1.keras", compile=False) # Adjust the filename to the correct one if needed
# Test the model with a sample image
sample_image_path = "sample_image.jpg" # Replace with your image file path
def preprocess_image(image_path, target_size):
# Load and preprocess the image
img = Image.open(image_path)
img = img.resize(target_size) # Resize to model's expected input size
img_array = np.array(img).astype("float32") / 255.0 # Normalize
img_array = np.expand_dims(img_array, axis=0) # Add batch dimension
return img_array
# Preprocess the sample image
input_image = preprocess_image(sample_image_path, target_size=(180, 180))
# Run prediction
prediction = model.predict_on_batch(input_image)
print("Prediction:", prediction[0][0])
# Interpret the result
if prediction[0][0] > 0.5:
print("Prediction: Class 1 (e.g., Open Eyes)")
else:
print("Prediction: Class 0 (e.g., Closed Eyes)")
Выходной прогноз всегда имеет одно и то же значение. Я пытался найти решение часами, но просто застрял и надеюсь, что кто-нибудь поможет мне с этим!!!
Пытался удалить несколько слоев
Пытался уменьшить размер пакета
Пробовал разные изображения
Пробывал разные эпохи
Пытался преобразовать модель в другой тип данных, но результат тот же
[code]import numpy as np import tensorflow as tf import keras from keras import layers from tensorflow import data as tf_data import matplotlib.pyplot as plt
# Data augmentation function def data_augmentation(images): for layer in data_augmentation_layers: images = layer(images) return images
# Apply data augmentation to the dataset augmented_train_ds = train_ds.map( lambda x, y: (data_augmentation(x), y))
# Apply data augmentation to the training images train_ds = train_ds.map( lambda img, label: (data_augmentation(img), label), num_parallel_calls=tf_data.AUTOTUNE, )
# Prefetch data for faster processing train_ds = train_ds.prefetch(tf_data.AUTOTUNE) val_ds = val_ds.prefetch(tf_data.AUTOTUNE)
# Function to create the model with a simplified architecture def make_simplified_model(input_shape, num_classes): inputs = keras.Input(shape=input_shape)
# Entry block x = layers.Rescaling(1.0 / 255)(inputs) # Rescale the input images to [0, 1] x = layers.Conv2D(128, 3, strides=2, padding="same")(x) x = layers.BatchNormalization()(x) x = layers.Activation("relu")(x)
# First block (simplified) x = layers.SeparableConv2D(256, 3, padding="same")(x) x = layers.BatchNormalization()(x) x = layers.Activation("relu")(x) x = layers.MaxPooling2D(3, strides=2, padding="same")(x)
# Second block (simplified) x = layers.SeparableConv2D(512, 3, padding="same")(x) x = layers.BatchNormalization()(x) x = layers.Activation("relu")(x) x = layers.MaxPooling2D(3, strides=2, padding="same")(x)
# Global average pooling and dropout x = layers.GlobalAveragePooling2D()(x) x = layers.Dropout(0.25)(x)
# Build the model with the simplified architecture model = make_simplified_model(input_shape=image_size + (3,), num_classes=2)
# Visualize the model structure keras.utils.plot_model(model, show_shapes=True)
# Number of epochs for training epochs = 25
# Define callbacks (to save the model during training) callbacks = [ keras.callbacks.ModelCheckpoint("save_at_{epoch}.keras"), ]
# Compile the model model.compile( optimizer=keras.optimizers.Adam(3e-4), loss=keras.losses.BinaryCrossentropy(from_logits=False), metrics=[keras.metrics.BinaryAccuracy(name="acc")], )
# Train the model history = model.fit( train_ds, epochs=epochs, callbacks=callbacks, validation_data=val_ds, )
# Plot training and validation accuracy and loss plt.plot(history.history['acc'], label='Training Accuracy') plt.plot(history.history['val_acc'], label='Validation Accuracy') plt.plot(history.history['loss'], label='Training Loss') plt.plot(history.history['val_loss'], label='Validation Loss') plt.legend() plt.show() [/code] Вот как я тренирую свою модель, а следующий код проверяет прогноз: [code]import tensorflow as tf from tensorflow import keras import numpy as np from PIL import Image
# Load the saved model with weights (make sure you use the correct epoch file) model = keras.models.load_model("save_at_1.keras", compile=False) # Adjust the filename to the correct one if needed
# Test the model with a sample image sample_image_path = "sample_image.jpg" # Replace with your image file path
# Preprocess the sample image input_image = preprocess_image(sample_image_path, target_size=(180, 180))
# Run prediction prediction = model.predict_on_batch(input_image) print("Prediction:", prediction[0][0])
# Interpret the result if prediction[0][0] > 0.5: print("Prediction: Class 1 (e.g., Open Eyes)") else: print("Prediction: Class 0 (e.g., Closed Eyes)") [/code] Выходной прогноз всегда имеет одно и то же значение. Я пытался найти решение часами, но просто застрял и надеюсь, что кто-нибудь поможет мне с этим!!! Пытался удалить несколько слоев Пытался уменьшить размер пакета Пробовал разные изображения Пробывал разные эпохи Пытался преобразовать модель в другой тип данных, но результат тот же
Я обучаю многозадачную модель глубокого обучения с использованием Tensorflow/Keras для классификации автомобильных изображений по двум целям:
L2 Task: Binary classification — Car vs. No Car
L1 Task: Binary classification — among car images only,...
Я тренирую модель Xception на keras без использования предварительно обученных весов для задачи двоичной классификации и получаю очень странное поведение. График истории показывает, что точность обучения увеличивается до тех пор, пока не достигнет...
function st_makeenvelope (двойная точность, двойная точность, двойная точность, двойная точность, целое число) не существует
Подсказка: Никакая функция не соответствует данным имени и типам аргументов. Вам может потребоваться добавить явные типы....
Я создаваю модель Seedencetransformer ('All-Minilm-L6-V2'), используя словарь (JSON) с названием Category_Descriptions в качестве набора данных.
Ниже приведен Структура данных Category_descriptions :
{
CategoryA : {
CategorySearch : Description...
Я создаваю модель Seedencetransformer ('All-Minilm-L6-V2'), используя словарь (JSON) с названием Category_Descriptions в качестве набора данных.
Ниже приведен Структура данных Category_descriptions :
{
CategoryA : {
CategorySearch : Description...