ADCNN-Based Water Segmentation in Remote Sensing Images using TensorFlow
# 导入相关库
import tensorflow as tf
from tensorflow.keras import layers
from tensorflow.keras import models
from tensorflow.keras import optimizers
from tensorflow.keras.preprocessing.image import ImageDataGenerator
# 构建ADCNN模型
def ADCNN(img_dim, nb_classes, depth=40, nb_dense_block=3, growth_rate=12, nb_filter=16, dropout_rate=None,
weight_decay=1E-4, verbose=True):
n_channels = 64
model_input = tf.keras.Input(shape=img_dim)
concat_axis = 1 if tf.keras.backend.image_data_format() == 'th' else -1
assert (depth - 4) % 3 == 0, 'Depth must be 3 N + 4'
# layers in each dense block
nb_layers = int((depth - 4) / 3)
# Initial convolution
x = layers.Convolution2D(nb_filter, (3, 3), kernel_initializer='he_uniform', padding='same', name='initial_conv2D', use_bias=False,
kernel_regularizer=tf.keras.regularizers.l2(weight_decay))(model_input)
x = layers.BatchNormalization(axis=concat_axis, gamma_regularizer=tf.keras.regularizers.l2(weight_decay),
beta_regularizer=tf.keras.regularizers.l2(weight_decay))(x)
# Add attention block
x = attention_block(x, encoder_depth=1)
# Add dense blocks
for block_idx in range(nb_dense_block - 1):
x, nb_filter = dense_block(x, nb_layers, nb_filter, growth_rate, dropout_rate=dropout_rate,
weight_decay=weight_decay)
# add transition_block
x = transition_block(x, nb_filter, dropout_rate=dropout_rate, weight_decay=weight_decay)
# The last dense_block does not have a transition_block
x, nb_filter = dense_block(x, nb_layers, nb_filter, growth_rate, dropout_rate=dropout_rate,
weight_decay=weight_decay)
x = layers.Activation('relu')(x)
x = layers.GlobalAveragePooling2D()(x)
x = layers.Dense(nb_classes, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2(weight_decay), bias_regularizer=tf.keras.regularizers.l2(weight_decay))(x)
adcnn = models.Model(inputs=model_input, outputs=x)
if verbose:
print('ADCNN-%d-%d created.' % (depth, growth_rate))
return adcnn
# 定义超参数
img_dim = (256, 256, 3)
nb_classes = 1
depth = 40
nb_dense_block = 3
growth_rate = 12
nb_filter = 16
dropout_rate = 0.2
weight_decay = 1E-4
verbose = True
# 构建ADCNN模型
model = ADCNN(img_dim, nb_classes, depth=depth, nb_dense_block=nb_dense_block, growth_rate=growth_rate, nb_filter=nb_filter, dropout_rate=dropout_rate,
weight_decay=weight_decay, verbose=verbose)
# 编译模型
model.compile(loss='binary_crossentropy', optimizer=optimizers.Adam(lr=0.0001), metrics=['accuracy'])
# 定义数据增强器
train_datagen = ImageDataGenerator(rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
test_datagen = ImageDataGenerator(rescale=1./255)
# 加载训练集和测试集
train_generator = train_datagen.flow_from_directory('train',
target_size=img_dim[:2],
batch_size=32,
class_mode='binary')
test_generator = test_datagen.flow_from_directory('test',
target_size=img_dim[:2],
batch_size=32,
class_mode='binary')
# 开始训练
model.fit_generator(train_generator,
steps_per_epoch=100,
epochs=50,
validation_data=test_generator,
validation_steps=50)
# 保存模型
model.save('adcnn.h5')
This code assumes that you have the 'attention_block' and 'dense_block' functions defined elsewhere. You'll need to provide the implementation for these functions based on the original Keras code you provided.
原文地址: https://www.cveoy.top/t/topic/noGb 著作权归作者所有。请勿转载和采集!