-
Notifications
You must be signed in to change notification settings - Fork 0
/
6.Cats.Vs.Dogs.Network.Pretrained.py
51 lines (37 loc) · 1.9 KB
/
6.Cats.Vs.Dogs.Network.Pretrained.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
from keras.applications import VGG16
from keras.preprocessing.image import ImageDataGenerator
from keras import layers, models, optimizers
import NvidiaMixedPrec, os
import numpy as np
datagen = ImageDataGenerator(rescale=1/255)
working_dir = '/home/andrew/PycharmProjects/DeepLearning/CatDog/CatDogWorking'
train_dir = os.path.join(working_dir, 'train')
val_dir = os.path.join(working_dir, 'val')
test_dir = os.path.join(working_dir, 'test')
conv_base = VGG16(weights='imagenet', include_top=False, input_shape=(150, 150, 3))
batch_size = 20
def extract_features(directory, sample_count):
features = np.zeros(shape=(sample_count, 4, 4, 512))
labels = np.zeros(shape=sample_count)
generator = datagen.flow_from_directory(directory, target_size=(150, 150), batch_size=batch_size, class_mode='binary')
i = 0
for inputs_batch, labels_batch in generator:
features_batch = conv_base.predict(inputs_batch)
features[i*batch_size:(i+1)*batch_size] = features_batch
labels[i*batch_size:(i+1)*batch_size] = labels_batch
i += 1
if i*batch_size >= sample_count:
break
return features, labels
train_features, train_labels = extract_features(train_dir, 2000)
val_features, val_labels = extract_features(val_dir, 1000)
test_features, test_labels = extract_features(test_dir, 1000)
train_features = np.reshape(train_features, (2000, 4*4*512))
val_features = np.reshape(val_features, (1000, 4*4*512))
test_features = np.reshape(test_features, (1000, 4*4*512))
model = models.Sequential()
model.add(layers.Dense(256, activation='relu', input_dim=4*4*512))
model.add(layers.Dropout(.5))
model.add(layers.Dense(1, activation='sigmoid'))
model.compile(optimizer=optimizers.RMSprop(lr=2e-5), loss='binary_crossentropy', metrics=['acc'])
history = model.fit_generator(train_features, train_labels, epochs=30, batch_size=batch_size, validation_data=(val_features, val_labels))