-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvgg16_cifar100_train.py
114 lines (98 loc) · 4.79 KB
/
vgg16_cifar100_train.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import tensorflow.keras as keras
import tensorflow as tf
import tensorflow.keras.layers as layers
from tensorflow.keras.preprocessing.image import ImageDataGenerator
batch_size = 32
AUTOTUNE = tf.data.experimental.AUTOTUNE
from tensorflow.keras.applications import VGG16
learning_rates = [ .00001]
for lr in learning_rates:
model = VGG16(weights=None, classes=100, input_shape=(32,32, 3), include_top=False)
last = model.output
x = keras.layers.Flatten(name='flatten')(last)
x = keras.layers.Dense(4096, name='fc1', activation='relu')(x)
x = keras.layers.Dropout(.5)(x)
x = keras.layers.Dense(4096, name='fc2', activation='relu')(x)
x = keras.layers.Dropout(.5)(x)
x = keras.layers.Dense(100, name='predictions', activation='softmax')(x)
model = keras.models.Model(inputs=model.input, outputs=x)
model.summary()
from keras.datasets import cifar100
from keras.preprocessing.image import ImageDataGenerator
model.load_weights(f'./vgg16_cifar100_lf_{lr}.h5')
batch_size = 32
num_classes = 100
epochs = 200
data_augmentation = True
num_predictions = 20
# The data, split between train and test sets:
(x_train, y_train), (x_test, y_test) = cifar100.load_data(label_mode='fine')
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')
# Convert class vectors to binary class matrices.
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
opt = keras.optimizers.RMSprop(lr=lr, decay=1.0e-6)
# Let's train the model using RMSprop
model.compile(loss='categorical_crossentropy',
optimizer=opt,
metrics=['accuracy'])
if not data_augmentation:
print('Not using data augmentation.')
model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
validation_data=(x_test, y_test),
shuffle=True)
else:
print('Using real-time data augmentation.')
# This will do preprocessing and realtime data augmentation:
datagen = ImageDataGenerator(
featurewise_center=False, # set input mean to 0 over the dataset
samplewise_center=False, # set each sample mean to 0
featurewise_std_normalization=False, # divide inputs by std of the dataset
samplewise_std_normalization=False, # divide each input by its std
zca_whitening=False, # apply ZCA whitening
zca_epsilon=1e-06, # epsilon for ZCA whitening
rotation_range=0, # randomly rotate images in the range (degrees, 0 to 180)
# randomly shift images horizontally (fraction of total width)
width_shift_range=0.1,
# randomly shift images vertically (fraction of total height)
height_shift_range=0.1,
shear_range=0.1, # set range for random shear
zoom_range=0.1, # set range for random zoom
channel_shift_range=0., # set range for random channel shifts
# set mode for filling points outside the input boundaries
fill_mode='nearest',
cval=0., # value used for fill_mode = "constant"
horizontal_flip=True, # randomly flip images
vertical_flip=False, # randomly flip images
# set rescaling factor (applied before any other transformation)
rescale=None,
# set function that will be applied on each input
preprocessing_function=None,
# image data format, either "channels_first" or "channels_last"
data_format=None,
# fraction of images reserved for validation (strictly between 0 and 1)
validation_split=0.0)
# Compute quantities required for feature-wise normalization
# (std, mean, and principal components if ZCA whitening is applied).
datagen.fit(x_train)
check = tf.keras.callbacks.ModelCheckpoint(f'./vgg16_cifar100_lf_{lr}.h5', verbose=1, save_best_only=True)
# Fit the model on the batches generated by datagen.flow().
model.fit_generator(datagen.flow(x_train, y_train,
batch_size=batch_size),
epochs=epochs,
#use_multiprocessing=True,
callbacks=[check],
validation_data=(x_test, y_test),
verbose=1)
model.load_weights(f'./vgg16_cifar100_lf_{lr}.h5')
scores = model.evaluate(x_test, y_test, verbose=1)
print('Test loss:', scores[0])
print('Test accuracy:', scores[1])