import tensorflow as tf
from tensorflow.keras.layers import Conv2D, Input, Dropout
from tensorflow.keras.models import Model
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.preprocessing.image import ImageDataGenerator
# Simple super-resolution model with dropout and reduced filters
input_img = Input(shape=(32, 32, 3))
x = Conv2D(32, (3, 3), activation='relu', padding='same')(input_img)
x = Dropout(0.3)(x)
x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)
x = Dropout(0.3)(x)
x = Conv2D(3, (3, 3), activation='sigmoid', padding='same')(x)
model = Model(input_img, x)
model.compile(optimizer=Adam(learning_rate=0.0005), loss='mse')
# Data augmentation for training
train_datagen = ImageDataGenerator(
rotation_range=10,
width_shift_range=0.1,
height_shift_range=0.1,
horizontal_flip=True
)
# Dummy data for example (replace with real low-res and high-res pairs)
import numpy as np
X_train = np.random.rand(100, 32, 32, 3).astype('float32')
y_train = np.random.rand(100, 32, 32, 3).astype('float32')
X_val = np.random.rand(20, 32, 32, 3).astype('float32')
y_val = np.random.rand(20, 32, 32, 3).astype('float32')
# Train model with augmentation
batch_size = 16
train_generator = train_datagen.flow(X_train, y_train, batch_size=batch_size)
history = model.fit(
train_generator,
steps_per_epoch=len(X_train) // batch_size,
epochs=30,
validation_data=(X_val, y_val)
)
# Calculate PSNR metric
import tensorflow.keras.backend as K
def psnr(y_true, y_pred):
return tf.image.psnr(tf.convert_to_tensor(y_true), tf.convert_to_tensor(y_pred), max_val=1.0)
train_pred = model.predict(X_train)
val_pred = model.predict(X_val)
train_psnr = np.mean([psnr(np.expand_dims(y_true, axis=0), np.expand_dims(y_pred, axis=0)).numpy() for y_true, y_pred in zip(y_train, train_pred)])
val_psnr = np.mean([psnr(np.expand_dims(y_true, axis=0), np.expand_dims(y_pred, axis=0)).numpy() for y_true, y_pred in zip(y_val, val_pred)])
print(f'Training PSNR: {train_psnr:.2f} dB')
print(f'Validation PSNR: {val_psnr:.2f} dB')