Innokentiy commited on
Commit
80be6f3
1 Parent(s): 473f1df

Upload 6 files

Browse files
.gitattributes CHANGED
@@ -32,3 +32,5 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
32
  *.zip filter=lfs diff=lfs merge=lfs -text
33
  *.zst filter=lfs diff=lfs merge=lfs -text
34
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
32
  *.zip filter=lfs diff=lfs merge=lfs -text
33
  *.zst filter=lfs diff=lfs merge=lfs -text
34
  *tfevents* filter=lfs diff=lfs merge=lfs -text
35
+ Архитектура[[:space:]]сети[[:space:]]Xception.png filter=lfs diff=lfs merge=lfs -text
36
+ Результат[[:space:]]тестовой[[:space:]]классификации.png filter=lfs diff=lfs merge=lfs -text
FlowerNet.py ADDED
@@ -0,0 +1,181 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import tensorflow as tf
2
+ import tensorflow_datasets as tfds
3
+ import os
4
+ import numpy as np
5
+ import matplotlib.pyplot as plt
6
+ from tensorflow.keras import regularizers
7
+
8
+ assert 'COLAB_TPU_ADDR' in os.environ, 'Missin TPU?'
9
+ if('COLAB_TPU_ADDR') in os.environ:
10
+ TF_MASTER = 'grpc://{}'.format(os.environ['COLAB_TPU_ADDR'])
11
+ else:
12
+ TF_MASTER = ''
13
+ tpu_address = TF_MASTER
14
+
15
+
16
+ resolver = tf.distribute.cluster_resolver.TPUClusterResolver(tpu_address)
17
+ tf.config.experimental_connect_to_cluster(resolver)
18
+ tf.tpu.experimental.initialize_tpu_system(resolver)
19
+
20
+ strategy = tf.distribute.TPUStrategy(resolver)
21
+
22
+
23
+ def create_model():
24
+ return tf.keras.Sequential([
25
+ tf.keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(224, 224, 3)),
26
+ tf.keras.layers.MaxPooling2D((2, 2)),
27
+ tf.keras.layers.Conv2D(64, (3, 3), activation='relu'),
28
+ tf.keras.layers.MaxPooling2D((2, 2)),
29
+ tf.keras.layers.Conv2D(128, (3, 3), activation='relu'),
30
+ tf.keras.layers.MaxPooling2D((2, 2)),
31
+ tf.keras.layers.Conv2D(256, (3, 3), activation='relu', kernel_regularizer=regularizers.l2(0.001)),
32
+ tf.keras.layers.MaxPooling2D((2, 2)),
33
+ tf.keras.layers.Flatten(),
34
+ tf.keras.layers.Dense(512, activation='relu', kernel_regularizer=regularizers.l2(0.001)),
35
+ tf.keras.layers.Dropout(0.5),
36
+ tf.keras.layers.Dense(256, activation='relu', kernel_regularizer=regularizers.l2(0.001)),
37
+ tf.keras.layers.Dropout(0.5),
38
+ tf.keras.layers.Dense(5, activation='softmax')# всего пять классов цветов
39
+
40
+ ])
41
+
42
+
43
+ def get_train_and_val_dataset(batch_size, is_training=True):
44
+ if(is_training):
45
+ dataset, info = tfds.load(name='tf_flowers',
46
+ split='train[:80%]',
47
+ with_info = True,
48
+ as_supervised=True,
49
+ try_gcs=True)
50
+ else:
51
+ dataset, info = tfds.load(name='tf_flowers',
52
+ split='train[80%:90%]',
53
+ with_info = True,
54
+ as_supervised=True,
55
+ try_gcs=True)
56
+
57
+ def scale(image, label):
58
+ image = tf.cast(image, tf.float32)
59
+ image = tf.image.resize(image, [224, 224]) # изменение всех изображений на вход до (None, 224, 224)
60
+ image /= 255.0 # Нормализация
61
+ return image, label
62
+
63
+ dataset = dataset.map(scale)
64
+
65
+ if is_training:
66
+ dataset = dataset.shuffle(2936)#Перемешивание обучающей выборки
67
+ dataset = dataset.repeat()
68
+
69
+ dataset = dataset.batch(batch_size)
70
+ return dataset
71
+
72
+ def get_final_dataset(batch_size):
73
+ dataset, info = tfds.load(name='tf_flowers',
74
+ split='train[90%:]',
75
+ with_info = True,
76
+ as_supervised=True,
77
+ try_gcs=True)
78
+ def scale(image, label):
79
+ image = tf.cast(image, tf.float32)
80
+ image = tf.image.resize(image, [224, 224]) # изменение всех изображений на вход до (None, 224, 224)
81
+ image /= 255.0 # Нормализация
82
+ return image, label
83
+ dataset = dataset.map(scale)
84
+
85
+ #dataset = dataset.shuffle(2936)#Перемешивание обучающей выборки
86
+ #dataset = dataset.repeat()
87
+
88
+ dataset = dataset.batch(batch_size)
89
+ return dataset
90
+
91
+
92
+ def create_xception_model(input_shape=(224, 224, 3), num_classes=5):
93
+ #Загрузка предварительно обученной модели Xception без головной части
94
+ base_model = tf.keras.applications.Xception(include_top=False, input_shape=input_shape)
95
+
96
+ #Добавление головной части
97
+ x = base_model.output
98
+ x = tf.keras.layers.GlobalAveragePooling2D()(x)
99
+ x = tf.keras.layers.Dense(1024, activation='relu')(x)
100
+ x = tf.keras.layers.Dropout(0.5)(x)
101
+ x = tf.keras.layers.Dense(num_classes, activation='softmax')(x)
102
+
103
+ #Объединение предварительно обученной модели и головной части в единую модель
104
+ model = tf.keras.models.Model(inputs=base_model.input, outputs=x)
105
+
106
+ #Заморозка слоев предварительно обученной модели
107
+ for layer in base_model.layers:
108
+ layer.trainable = False
109
+
110
+ return model
111
+
112
+ batch_size = 1024 #Размер пакета
113
+ epochs = 1000 #Количество эпох, на тензорных процессорах можно делать много проверок
114
+ execution_steps = 1000 #Количество шагов перед обновлением весов
115
+ #Загрузка и создание обучающей и проверочной(валидационной) выборки
116
+ train_dataset = get_train_and_val_dataset(batch_size, True)
117
+ validation_dataset = get_train_and_val_dataset(batch_size, False)
118
+ steps_per_epoch = 2936 // batch_size
119
+ validation_steps = len(validation_dataset) // batch_size
120
+
121
+
122
+ with strategy.scope():
123
+ xmodel = create_xception_model()
124
+ xmodel.compile(optimizer='adagrad', steps_per_execution=execution_steps, loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), metrics=['sparse_categorical_accuracy'])
125
+ x_history = xmodel.fit(train_dataset, epochs=epochs, steps_per_epoch=steps_per_epoch, validation_data=validation_dataset)
126
+
127
+
128
+ #Переменные для графика
129
+ acc = x_history.history['sparse_categorical_accuracy']
130
+ val_acc = x_history.history['val_sparse_categorical_accuracy']
131
+ loss = x_history.history['loss']
132
+ val_loss = x_history.history['val_loss']
133
+ epochs_range = range(epochs)
134
+
135
+
136
+ #График при помощи matplotlib
137
+ plt.figure(figsize=(15, 15))
138
+ plt.subplot(2, 2, 1)
139
+ plt.plot(epochs_range, acc, label='Тренировочная точность')
140
+ plt.plot(epochs_range, val_acc, label='Валидационная точность')
141
+ plt.legend(loc='lower right')
142
+ plt.title('Тренировочная и валидационная точность')
143
+
144
+ plt.subplot(2, 2, 2)
145
+ plt.plot(epochs_range, loss, label='Тренировочная потеря')
146
+ plt.plot(epochs_range, val_loss, label='Валидационная потеря')
147
+ plt.legend(loc='upper right')
148
+ plt.title('Тренировочная и валидационная точность')
149
+ plt.show()
150
+
151
+
152
+ #всего три выборки: тренировочная(train_dataset), валидационная(validation_dataset) и тестовая(test_dataset)
153
+ #тренировочная 0:80
154
+ #валидационная 80:90
155
+ #тестовая 90:100
156
+ test_dataset = get_final_dataset(batch_size)
157
+ test_images, test_labels = next(iter(test_dataset.take(10)))
158
+ #Можно использоать информацию о классах из info, но мне нужно было перевести названия классов и их не слишком много, поэтому я решил их инициализировать. Если количество классов большое, например их 100 или больше, то лучше обращаться к ним через info.
159
+ class_names = ['Одуванчик', 'Ромашка', 'Тюльпаны', 'Подсолнухи', 'Розы']
160
+
161
+ test_loss, test_accuracy = xmodel.evaluate(test_dataset)
162
+ print('Test loss: {}, Test accuracy: {}'.format(test_loss, test_accuracy))
163
+
164
+ # Получение предсказаний нейросети для 10 изображений
165
+ predictions = xmodel.predict(test_images)
166
+
167
+ fig, axes = plt.subplots(nrows=2, ncols=5, figsize=(15, 6),
168
+ subplot_kw={'xticks': [], 'yticks': []})
169
+ for i, ax in enumerate(axes.flat):
170
+ # Отображение изображения
171
+ ax.imshow(test_images[i])
172
+ # Отображение меток и предсказаний
173
+ true_label = class_names[test_labels[i]]
174
+ pred_label = class_names[np.argmax(predictions[i])]
175
+ if true_label == pred_label:
176
+ ax.set_title("Это: {}, ИИ: {}".format(true_label, pred_label), color='green')
177
+ else:
178
+ ax.set_title("Это: {}, ИИ: {}".format(true_label, pred_label), color='red')
179
+
180
+ plt.tight_layout()
181
+ plt.show()
FlowerRecognition.ipynb ADDED
The diff for this file is too large to render. See raw diff
 
Архитектура сети Xception.png ADDED

Git LFS Details

  • SHA256: 8a17388862cebf26d8064dc2d5d68ada7d78ec6018ec40ebf914afce5e022c4d
  • Pointer size: 132 Bytes
  • Size of remote file: 1.47 MB
/320/223/321/200/320/260/321/204/320/270/320/272 /320/276/320/261/321/203/321/207/320/265/320/275/320/270/321/217.png ADDED
Результат тестовой классификации.png ADDED

Git LFS Details

  • SHA256: 249cd6d6e36f752e652229b4e1d2cb34da7cc5b4026e6c5c890ceb7e182b3f6a
  • Pointer size: 132 Bytes
  • Size of remote file: 2.09 MB
/320/276/320/264/321/203/320/262/320/260/320/275/321/207/320/270/320/272.png ADDED