mirror of
https://github.com/wassname/keras-contrib.git
synced 2026-07-17 11:28:55 +08:00
85 lines
2.7 KiB
Python
85 lines
2.7 KiB
Python
from __future__ import absolute_import
|
|
from __future__ import print_function
|
|
from __future__ import division
|
|
|
|
import numpy as np
|
|
import sklearn.metrics as metrics
|
|
|
|
from keras import backend as K
|
|
from keras.callbacks import ModelCheckpoint, ReduceLROnPlateau, EarlyStopping
|
|
from keras.datasets import cifar10
|
|
from keras.optimizers import Adam
|
|
from keras.preprocessing.image import ImageDataGenerator
|
|
from keras.utils import np_utils
|
|
from keras_contrib.applications.densenet import DenseNet
|
|
|
|
|
|
batch_size = 64
|
|
nb_classes = 10
|
|
nb_epoch = 300
|
|
|
|
img_rows, img_cols = 32, 32
|
|
img_channels = 3
|
|
|
|
# Parameters for the DenseNet model builder
|
|
img_dim = (img_channels, img_rows, img_cols) if K.image_dim_ordering() == "th" else (img_rows, img_cols, img_channels)
|
|
depth = 40
|
|
nb_dense_block = 3
|
|
growth_rate = 12
|
|
nb_filter = 16
|
|
dropout_rate = 0.0 # 0.0 for data augmentation
|
|
|
|
# Create the model (without loading weights)
|
|
model = DenseNet(depth, nb_dense_block, growth_rate, nb_filter, dropout_rate=dropout_rate,
|
|
input_shape=img_dim, weights=None)
|
|
print("Model created")
|
|
|
|
model.summary()
|
|
|
|
optimizer = Adam(lr=1e-3) # Using Adam instead of SGD to speed up training
|
|
model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=["accuracy"])
|
|
print("Finished compiling")
|
|
|
|
(trainX, trainY), (testX, testY) = cifar10.load_data()
|
|
|
|
trainX = trainX.astype('float32')
|
|
testX = testX.astype('float32')
|
|
|
|
trainX /= 255.
|
|
testX /= 255.
|
|
|
|
Y_train = np_utils.to_categorical(trainY, nb_classes)
|
|
Y_test = np_utils.to_categorical(testY, nb_classes)
|
|
|
|
generator = ImageDataGenerator(rotation_range=15,
|
|
width_shift_range=5./32,
|
|
height_shift_range=5./32)
|
|
|
|
generator.fit(trainX, seed=0)
|
|
|
|
weights_file = "DenseNet-40-12-CIFAR-10.h5"
|
|
|
|
lr_reducer = ReduceLROnPlateau(monitor='val_loss', factor=np.sqrt(0.1),
|
|
cooldown=0, patience=10, min_lr=0.5e-6)
|
|
early_stopper = EarlyStopping(monitor='val_acc', min_delta=1e-4, patience=20)
|
|
model_checkpoint= ModelCheckpoint(weights_file, monitor="val_acc", save_best_only=True,
|
|
save_weights_only=True,mode='auto')
|
|
|
|
callbacks = [lr_reducer, early_stopper, model_checkpoint]
|
|
|
|
model.fit_generator(generator.flow(trainX, Y_train, batch_size=batch_size), samples_per_epoch=len(trainX), nb_epoch=nb_epoch,
|
|
callbacks=callbacks,
|
|
validation_data=(testX, Y_test),
|
|
nb_val_samples=testX.shape[0], verbose=2)
|
|
|
|
yPreds = model.predict(testX)
|
|
yPred = np.argmax(yPreds, axis=1)
|
|
print(yPred)
|
|
yTrue = testY
|
|
|
|
accuracy = metrics.accuracy_score(yTrue, yPred) * 100
|
|
error = 100 - accuracy
|
|
print("Accuracy : ", accuracy)
|
|
print("Error : ", error)
|
|
|