Repository navigation
Expand file tree
/
Copy path08_ModifiedYNetworkCNN.py
More file actions
124 lines (107 loc) · 3.02 KB
/
Copy path08_ModifiedYNetworkCNN.py
File metadata and controls
124 lines (107 loc) · 3.02 KB
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
115
116
117
118
119
120
121
122
123
124
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Y-network CNN implementation with reduced number of layer
to shorten the training time.
"""
# to supress tensorflow-gpu debug information
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
import numpy as np
from tensorflow.keras.layers import Dense, Dropout, Input
from tensorflow.keras.layers import Conv2D, MaxPooling2D
from tensorflow.keras.layers import Flatten, concatenate
from tensorflow.keras.models import Model
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.utils import plot_model
# load MNIST dataset
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# from sparse label to categorical
num_labels = len(np.unique(y_train))
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
# reshape and normalize input images
image_size = x_train.shape[1]
x_train = np.reshape(x_train,[-1, image_size, image_size, 1])
x_test = np.reshape(x_test,[-1, image_size, image_size, 1])
x_train = x_train.astype('float32') / 255
x_test = x_test.astype('float32') / 255
# network parameters
input_shape = (image_size, image_size, 1)
batch_size = 32
kernel_size = 3
dropout = 0.4
n_filters = 32
# left branch of Y network
left_inputs = Input(shape=input_shape)
x = left_inputs
filters = n_filters
# 2 layers of Conv2D-Dropout-MaxPooling2D
# number of filters doubles after each layer (32-64)
for i in range(2):
x = Conv2D(
filters=filters,
kernel_size=kernel_size,
padding='same',
activation='relu'
)(x)
x = Dropout(dropout)(x)
x = MaxPooling2D()(x)
filters *= 2
# right branch of Y network
right_inputs = Input(shape=input_shape)
y = right_inputs
filters = n_filters
# 2 layers of Conv2D-Dropout-MaxPooling2Do
# number of filters doubles after each layer (32-64)
for i in range(2):
y = Conv2D(
filters=filters,
kernel_size=kernel_size,
padding='same',
activation='relu',
dilation_rate=2
)(y)
y = Dropout(dropout)(y)
y = MaxPooling2D()(y)
filters *= 2
# merge left and right branches outputs
y = concatenate([x, y])
# feature maps to vector before connecting to Dense
y = Flatten()(y)
y = Dropout(dropout)(y)
outputs = Dense(
num_labels,
activation='softmax'
)(y)
# build the model in functional API
model = Model(
[left_inputs, right_inputs],
outputs
)
# verify the model using layer text description
model.summary()
plot_model(model, to_file='modified-y-network-cnn.png', show_shapes=True)
# classifier loss, Adam optimizer, classifier accuracy
model.compile(
loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy']
)
# train the model with input images and labels
model.fit(
[x_train, x_train],
y_train,
validation_data=([x_test, x_test], y_test),
epochs=20,
batch_size=batch_size
)
# model accuracy on test dataset
score = model.evaluate(
[x_test, x_test],
y_test,
batch_size=batch_size,
verbose=0
)
print("\nTest accuracy: %.2f%%" % (100.0 * score[1]))