Сравнить коммиты

..

1 Коммитов
main ... main

Автор SHA1 Сообщение Дата
Lipisin 964549a094 Открыта ЛР4
2 месяцев назад

@ -7,15 +7,8 @@
1. [Архитектура и обучение глубоких нейронных сетей](labworks/LW1)
2. [Обнаружение аномалий](labworks/LW2)
3. [Распознавание изображений](labworks/LW3)
4. [Распознавание последовательностей](labworks/LW4)
<!--
### Лабораторная работа №4
* [Задание](labworks/LW4/IS_Lab04_2023.pdf)
* [Методические указания](labworks/LW4/IS_Lab04_Metod_2023.pdf)
-->
## Архив материалов курса
В 2021–2022 годах материалы выкладывались <a href="https://uii.bitbucket.io/study/courses/#:~:text=Интеллектуальные%20системы%20(глубокие%20нейронные%20сети)" target="_blank">на этой странице</a>.

Двоичные данные
labworks/LW1/IS_lab_4.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 3.9 KiB

Двоичные данные
labworks/LW1/IS_lab_4_90.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 3.9 KiB

Двоичные данные
labworks/LW1/IS_lab_7.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 854 B

Двоичные данные
labworks/LW1/IS_lab_7_90.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 883 B

Двоичные данные
labworks/LW1/best_model_100.keras

Двоичный файл не отображается.

Двоичные данные
labworks/LW1/images_for_report/1.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 5.6 KiB

Двоичные данные
labworks/LW1/images_for_report/10.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 19 KiB

Двоичные данные
labworks/LW1/images_for_report/11.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 30 KiB

Двоичные данные
labworks/LW1/images_for_report/12.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 20 KiB

Двоичные данные
labworks/LW1/images_for_report/13.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 29 KiB

Двоичные данные
labworks/LW1/images_for_report/14.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 18 KiB

Двоичные данные
labworks/LW1/images_for_report/15.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 18 KiB

Двоичные данные
labworks/LW1/images_for_report/16.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 8.6 KiB

Двоичные данные
labworks/LW1/images_for_report/17.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 8.7 KiB

Двоичные данные
labworks/LW1/images_for_report/18.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 8.9 KiB

Двоичные данные
labworks/LW1/images_for_report/19.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 8.7 KiB

Двоичные данные
labworks/LW1/images_for_report/2.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 13 KiB

Двоичные данные
labworks/LW1/images_for_report/3.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 24 KiB

Двоичные данные
labworks/LW1/images_for_report/4.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 16 KiB

Двоичные данные
labworks/LW1/images_for_report/5.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 28 KiB

Двоичные данные
labworks/LW1/images_for_report/6.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 16 KiB

Двоичные данные
labworks/LW1/images_for_report/7.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 28 KiB

Двоичные данные
labworks/LW1/images_for_report/8.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 16 KiB

Двоичные данные
labworks/LW1/images_for_report/9.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 27 KiB

@ -1,508 +0,0 @@
# Отчёт по лабораторной работе №1
**Кобзев Александр, Кирсанов Егор — А-01-22**
## 1. В среде Google Colab создан новый блокнот. Импортированы необходимые библиотеки и модули.
```python
from google.colab import drive
drive.mount('/content/drive')
```
```python
from tensorflow import keras
import matplotlib.pyplot as plt
import numpy as np
import sklearn
from keras.datasets import mnist
from sklearn.model_selection import train_test_split
from tensorflow.keras.utils import to_categorical
from keras.models import Sequential
from keras.layers import Dense
from PIL import Image
```
---
## 2. Загрузили набора данных MNIST с изображениями рукописных цифр.
```python
(X_train, y_train), (X_test, y_test) = mnist.load_data()
```
---
## 3. Разбили данные на обучающую и тестовую выборки 60 000:10 000.
При объединении исходных выборок и последующем разбиении был использован параметр `random_state = 4*k - 1`, где *k* – номер бригады (k = 10). Такой фиксированный seed обеспечивает воспроизводимость разбиения.
```python
# объединяем исходные обучающие и тестовые данные в один массив
X = np.concatenate((X_train, X_test))
y = np.concatenate((y_train, y_test))
# выполняем разбиение на обучающую (60000) и тестовую (10000) выборки
X_train, X_test, y_train, y_test = train_test_split(
X, y, train_size=60000, test_size=10000, random_state=4*10 - 1
)
# вывод размерностей полученных массивов
print('Shape of X train:', X_train.shape)
print('Shape of y test:', y_test.shape)
```
```
Shape of X train: (60000, 28, 28)
Shape of y train: (60000,)
```
---
## 4. Вывели первые 4 элемента обучающих данных (изображения и метки цифр).
```python
# вывод изображения
fig, axes = plt.subplots(1, 4, figsize=(10, 3))
for i in range(4):
axes[i].imshow(X_train[i], cmap=plt.get_cmap('gray'))
axes[i].set_title(y_train[i])
axes[i].axis('off')
plt.show()
```
![Примеры изображений](images_for_report/1.png)
---
## 5. Провели предобработку данных: привели обучающие и тестовые данные к формату, пригодному для обучения нейронной сети. Входные данные должны принимать значения от 0 до 1, метки цифр должны быть закодированы по принципу «one-hot encoding». Вывели размерности предобработанных обучающих и тестовых массивов данных.
```python
# развернем каждое изображение 28*28 в вектор 784
num_pixels = X_train.shape[1] * X_train.shape[2]
X_train = X_train.reshape(X_train.shape[0], num_pixels) / 255.0
X_test = X_test.reshape(X_test.shape[0], num_pixels) / 255.0
print('Shape of transformed X train:', X_train.shape)
```
```
Shape of transformed X train: (60000, 784)
```
```python
# переведем метки в one-hot
from tensorflow.keras.utils import to_categorical
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
```
```
Shape of transformed y train: (60000, 10)
```
---
## 6. Реализовали и обученили однослойную нейронную сеть.
**Архитектура и параметры:**
- количество скрытых слоёв: 0
- функция активации выходного слоя: `softmax`
- функция ошибки: `categorical_crossentropy`
- алгоритм обучения: `sgd`
- метрика качества: `accuracy`
- количество эпох: 50
- доля валидационных данных от обучающих: 0.1
```python
model = Sequential()
model.add(Dense(units=10, input_dim=num_pixels, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
model.summary()
```
![архитектура модели](images_for_report/2.png)
```python
#обучение
H1 = model.fit(X_train, y_train, batch_size=256, validation_split=0.1, epochs=150)
```
```python
# вывод графика ошибки по эпохам
plt.plot(H1.history['loss'])
plt.plot(H1.history['val_loss'])
plt.grid()
plt.xlabel('Epochs')
plt.ylabel('loss')
plt.legend(['train_loss', 'val_loss'])
plt.title('Loss by epochs')
plt.show()
```
![граффик обучения](images_for_report/3.png)
---
## 7. Применили обученную модель к тестовым данным.
```python
# Оценка качества работы модели на тестовых данных
scores = model.evaluate(X_test, y_test)
print('Loss on test data:', scores[0])
print('Accuracy on test data:', scores[1])
```
```
Loss on test data: 0.32417795062065125
Accuracy on test data: 0.9110999703407288
```
## 8. Добавили в модель один скрытый слой и провели обучение и тестирование (повторить п. 6–7) при 100, 300, 500 нейронах в скрытом слое. По метрике качества классификации на тестовых данных выбрали наилучшее количество нейронов в скрытом слое. В качестве функции активации нейронов в скрытом слое использовали функцию sigmoid.
### При 100 нейронах:
```python
model_100 = Sequential ()
model_100.add(Dense(units=100,input_dim=num_pixels, activation='sigmoid'))
model_100.add(Dense(units=num_classes, activation='softmax'))
model_100.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
print(model_100.summary())
```
![архитектура модели](images_for_report/4.png)
```python
#обучение
H_100 = model_100.fit(X_train, y_train, batch_size=256, validation_split=0.1, epochs=150)
```
```python
# вывод графика ошибки по эпохам
plt.plot(H_100.history['loss'])
plt.plot(H_100.history['val_loss'])
plt.grid()
plt.xlabel('Epochs')
plt.ylabel('loss')
plt.legend(['train_loss', 'val_loss'])
plt.title('Loss by epochs')
plt.show()
```
![граффик обучения](images_for_report/5.png)
```python
# Оценка качества работы модели на тестовых данных
scores = model_100.evaluate(X_test, y_test)
print('Loss on test data:', scores[0])
print('Accuracy on test data:', scores[1])
```
```
Loss on test data: 0.2998492121696472
Accuracy on test data: 0.9138000011444092
```
### При 300 нейронах:
```python
model_300 = Sequential ()
model_300.add(Dense(units=300,input_dim=num_pixels, activation='sigmoid'))
model_300.add(Dense(units=num_classes, activation='softmax'))
model_300.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
print(model_300.summary())
```
![архитектура модели](images_for_report/6.png)
```python
H_300 = model_300.fit(X_train, y_train, batch_size=256, validation_split=0.1, epochs=150)
```
```python
# вывод графика ошибки по эпохам
plt.plot(H_300.history['loss'])
plt.plot(H_300.history['val_loss'])
plt.grid()
plt.xlabel('Epochs')
plt.ylabel('loss')
plt.legend(['train_loss', 'val_loss'])
plt.title('Loss by epochs')
plt.show()
```
![граффик обучения](images_for_report/7.png)
```python
# Оценка качества работы модели на тестовых данных
scores = model_300.evaluate(X_test, y_test)
print('Loss on test data:', scores[0])
print('Accuracy on test data:', scores[1])
```
```
Loss on test data: 0.31299835443496704
Accuracy on test data: 0.9107999801635742
```
### При 500 нейронах:
```python
model_500 = Sequential()
model_500.add(Dense(units=500, input_dim=num_pixels, activation='sigmoid'))
model_500.add(Dense(units=num_classes, activation='softmax'))
model_500.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
print(model_500.summary())
```
![архитектура модели](images_for_report/8.png)
```python
H_500 = model_500.fit(X_train, y_train, batch_size=256, validation_split=0.1, epochs=150)
```
```python
# вывод графика ошибки по эпохам
plt.plot(H_500.history['loss'])
plt.plot(H_500.history['val_loss'])
plt.grid()
plt.xlabel('Epochs')
plt.ylabel('loss')
plt.legend(['train_loss', 'val_loss'])
plt.title('Loss by epochs')
plt.show()
```
![граффик обучения](images_for_report/9.png)
```python
# Оценка качества работы модели на тестовых данных
scores = model_500.evaluate(X_test, y_test)
print('Loss on test data:', scores[0])
print('Accuracy on test data:', scores[1])
```
```
Loss on test data: 0.31795090436935425
Accuracy on test data: 0.909600019454956
```
Мы видим что лучший результат показала модель со 100 нейронами в скрытом слое(Accuracy = 0.9138).
## 9. Добавили в наилучшую архитектуру, определенную в п. 8, второй скрытый слой и провели обучение и тестирование при 50 и 100 нейронах во втором скрытом слое. В качестве функции активации нейронов в скрытом слое использовали функцию sigmoid.
### При 50 нейронах в 2-м слое:
```python
model_100_50 = Sequential()
model_100_50.add(Dense(units=100, input_dim=num_pixels, activation='sigmoid'))
model_100_50.add(Dense(units=50, activation='sigmoid'))
model_100_50.add(Dense(units=num_classes, activation='softmax'))
model_100_50.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
print(model_100_50.summary())
```
![архитектура модели](images_for_report/10.png)
```python
H_100_50 = model_100_50.fit(X_train, y_train, batch_size=256, validation_split=0.1, epochs=150)
```
```python
# вывод графика ошибки по эпохам
plt.plot(H_100_50.history['loss'])
plt.plot(H_100_50.history['val_loss'])
plt.grid()
plt.xlabel('Epochs')
plt.ylabel('loss')
plt.legend(['train_loss', 'val_loss'])
plt.title('Loss by epochs')
plt.show()
```
![граффик обучения](images_for_report/11.png)
```python
# Оценка качества работы модели на тестовых данных
scores = model_100_50.evaluate(X_test, y_test)
print('Loss on test data:', scores[0])
print('Accuracy on test data:', scores[1])
```
```
Loss on test data: 0.3216394782066345
Accuracy on test data: 0.9085999727249146
```
### При 100 нейронах во 2-м слое:\
```python
model_100_100 = Sequential()
model_100_100.add(Dense(units=100, input_dim=num_pixels, activation='sigmoid'))
model_100_100.add(Dense(units=100, activation='sigmoid'))
model_100_100.add(Dense(units=num_classes, activation='softmax'))
model_100_100.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
print(model_100_100.summary())
```
![архитектура модели](images_for_report/12.png)
```python
H_100_100 = model_100_100.fit(X_train, y_train, batch_size=256, validation_split=0.1, epochs=150)
```
```python
# вывод графика ошибки по эпохам
plt.plot(H_100_100.history['loss'])
plt.plot(H_100_100.history['val_loss'])
plt.grid()
plt.xlabel('Epochs')
plt.ylabel('loss')
plt.legend(['train_loss', 'val_loss'])
plt.title('Loss by epochs')
plt.show()
```
![граффик обучения](images_for_report/13.png)
```python
# Оценка качества работы модели на тестовых данных
scores = model.evaluate(X_test, y_test)
print('Loss on test data:', scores[0])
print('Accuracy on test data:', scores[1])
```
```
Loss on test data: 0.31788304448127747
Accuracy on test data: 0.9128000140190125
```
## 10. Сравнили качество классификации на тестовых данных всех построенных моделей. Сделали выводы.
| Кол-во слоёв | Нейронов в 1-м | Нейронов во 2-м | Accuracy |
|---------------|----------------|-----------------|-----------|
| 0 | – | – | 0.9111 |
| 1 | 100 | – | 0.9138 |
| 1 | 300 | – | 0.9108 |
| 1 | 500 | – | 0.9096 |
| 2 | 100 | 50 | 0.9086 |
| 2 | 100 | 100 | 0.9128 |
**Вывод:** наилучшей оказалась архитектура с одним скрытым слоем и 100 нейронами в нём. Увеличение числа нейронов в скрытом слое или добавление второго слоя не улучшило качество классификации, а в некоторых случаях даже ухудшило его. Вероятно, это связано с переобучением модели из-за избыточного количества параметров при относительно небольшом объёме обучающих данных.
---
## 11. Сохранили наилучшую модель на диск.
```python
model_100.save("/content/drive/MyDrive/Colab Notebooks/best_model_100.keras")
```
---
## 12. Для нейронной сети с наилучшей архитектурой вывели 2 тестовых изображения и истинные метки, а также предсказанные моделью метки.
```python
n = 333
result = model_100.predict(X_test[n:n+1])
print('NNoutput:',result)
plt.imshow(X_test[n].reshape(28,28),cmap=plt.get_cmap('gray'))
plt.show()
print('Realmark:',str(np.argmax(y_test[n])))
print('NNanswer:',str(np.argmax(result)))
```
![Пример 1](images_for_report/14.png)
```python
n = 234
result = model_100.predict(X_test[n:n+1])
print('NNoutput:',result)
plt.imshow(X_test[n].reshape(28,28),cmap=plt.get_cmap('gray'))
plt.show()
print('Realmark:',str(np.argmax(y_test[n])))
print('NNanswer:',str(np.argmax(result)))
```
![Пример 2](images_for_report/15.png)
---
## 13. Создали собственные изображения рукописных цифр, подобное представленным в наборе MNIST. Цифру выбрали как остаток от деления на 10 числа своего дня рождения (14 июля → 14 mod 10 = 4, 7 ноября → 7 mod 10 = 7). Сохранили изображения. Загрузили, предобработали и подали на вход обученной нейронной сети собственные изображения. Вывели изображения и результаты распознавания.
### Для 7:
![Изображение "7"](IS_lab_7.png)
```python
#вывод собственного изображения
plt.imshow(test_img,cmap=plt.get_cmap('gray'))
plt.show()
#предобработка
test_img=test_img/255
test_img=test_img.reshape(1,num_pixels)
#распознавание
result=model_100.predict(test_img)
print('I think it\'s',np.argmax(result))
```
![Отображение "7"](images_for_report/16.png)
### Для 4:
![Мое изображение "4"](IS_lab_4.png)
```python
from PIL import Image
file_data_4=Image.open('/content/drive/MyDrive/Colab Notebooks/IS_lab_4.png')
file_data_4=file_data_4.convert('L')
test_img_4=np.array(file_data_4)
#вывод собственного изображения
plt.imshow(test_img_4,cmap=plt.get_cmap('gray'))
plt.show()
#предобработка
test_img_4=test_img_4/255
test_img_4=test_img_4.reshape(1,num_pixels)
#распознавание
result=model_100.predict(test_img_4)
print('I think it\'s',np.argmax(result))
```
![Отображение "4"](images_for_report/17.png)
---
## 14. Создать копию собственного изображения, отличающуюся от оригинала поворотом на 90 градусов в любую сторону. Сохранили изображения. Загрузили, предобработали и подали на вход обученной нейронной сети измененные изображения. Вывели изображения и результаты распознавания. Сделали выводы по результатам эксперимента.
```python
from PIL import Image
file_data=Image.open('/content/drive/MyDrive/Colab Notebooks/IS_lab_7_90.png')
file_data=file_data.convert('L')
test_img=np.array(file_data)
#вывод собственного изображения
plt.imshow(test_img,cmap=plt.get_cmap('gray'))
plt.show()
#предобработка
test_img=test_img/255
test_img=test_img.reshape(1,num_pixels)
#распознавание
result=model_100.predict(test_img)
print('Ithinkit\'s',np.argmax(result))
```
![Отображение "7 повернутой"](images_for_report/18.png)
```python
from PIL import Image
file_data_4=Image.open('/content/drive/MyDrive/Colab Notebooks/IS_lab_4_90.png')
file_data_4=file_data_4.convert('L')
test_img_4=np.array(file_data_4)
#выводсобственногоизображения
plt.imshow(test_img_4,cmap=plt.get_cmap('gray'))
plt.show()
#предобработка
test_img_4=test_img_4/255
test_img_4=test_img_4.reshape(1,num_pixels)
#распознавание
result=model_100.predict(test_img_4)
print('Ithinkit\'s',np.argmax(result))
```
![Отображение "4 повернутой"](images_for_report/19.png)
**Вывод:** модель неустойчива к повороту изображений, так как не обучалась на повернутых данных.
---
## Заключение
Изучены принципы построения и обучения нейронных сетей в Keras на примере распознавания цифр MNIST. Лучшая точность достигнута простой моделью с одним скрытым слоем из 100 нейронов. При усложнении архитектуры наблюдается переобучение. Сеть корректно классифицирует собственные изображения, но ошибается на повернутых.

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Двоичный файл не отображается.

Разница между файлами не показана из-за своего большого размера Загрузить разницу

@ -1,4 +0,0 @@
10.5 9.5
9.0 10.2
9.6 10.5
9.0 9.0

Двоичные данные
labworks/LW2/images_for_report/1.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 43 KiB

Двоичные данные
labworks/LW2/images_for_report/10.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 21 KiB

Двоичные данные
labworks/LW2/images_for_report/11.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 29 KiB

Двоичные данные
labworks/LW2/images_for_report/12.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 40 KiB

Двоичные данные
labworks/LW2/images_for_report/13.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 22 KiB

Двоичные данные
labworks/LW2/images_for_report/14.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 86 KiB

Двоичные данные
labworks/LW2/images_for_report/15.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 89 KiB

Двоичные данные
labworks/LW2/images_for_report/16.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 70 KiB

Двоичные данные
labworks/LW2/images_for_report/2.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 43 KiB

Двоичные данные
labworks/LW2/images_for_report/3.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 108 KiB

Двоичные данные
labworks/LW2/images_for_report/4.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 34 KiB

Двоичные данные
labworks/LW2/images_for_report/5.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 90 KiB

Двоичные данные
labworks/LW2/images_for_report/6.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 104 KiB

Двоичные данные
labworks/LW2/images_for_report/7.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 32 KiB

Двоичные данные
labworks/LW2/images_for_report/8.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 66 KiB

Двоичные данные
labworks/LW2/images_for_report/9.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 78 KiB

@ -1,100 +0,0 @@
8.0000000e+00 1.1000000e+01 8.0000000e+00 9.0000000e+00 7.0000000e+00 6.0000000e+00 1.1000000e+01 2.0000000e+00 8.0000000e+00 1.1000000e+01 9.0000000e+00 5.0000000e+00 4.0000000e+00 1.0000000e+01 4.0000000e+00 4.0000000e+00 3.0000000e+00 6.0000000e+00 5.0000000e+00 4.0000000e+00 1.0000000e+00 6.0000000e+00 8.0000000e+00 6.0000000e+00 1.0000000e+01 7.0000000e+00 7.0000000e+00 1.2000000e+01 1.0000000e+00 7.0000000e+00 4.0000000e+00 9.0000000e+00
4.0000000e+00 5.0000000e+00 4.0000000e+00 3.0000000e+00 2.0000000e+00 5.0000000e+00 1.1000000e+01 2.0000000e+00 8.0000000e+00 1.1000000e+01 9.0000000e+00 4.0000000e+00 1.0000000e+00 1.1000000e+01 2.0000000e+00 4.0000000e+00 5.0000000e+00 6.0000000e+00 7.0000000e+00 9.0000000e+00 9.0000000e+00 8.0000000e+00 1.0000000e+01 4.0000000e+00 3.0000000e+00 6.0000000e+00 8.0000000e+00 9.0000000e+00 5.0000000e+00 1.3000000e+01 8.0000000e+00 8.0000000e+00
3.0000000e+00 3.0000000e+00 5.0000000e+00 2.0000000e+00 3.0000000e+00 8.0000000e+00 6.0000000e+00 6.0000000e+00 4.0000000e+00 7.0000000e+00 7.0000000e+00 8.0000000e+00 7.0000000e+00 5.0000000e+00 2.0000000e+00 7.0000000e+00 3.0000000e+00 5.0000000e+00 6.0000000e+00 4.0000000e+00 3.0000000e+00 9.0000000e+00 7.0000000e+00 1.0000000e+00 9.0000000e+00 1.0000000e+01 4.0000000e+00 7.0000000e+00 2.0000000e+00 8.0000000e+00 3.0000000e+00 8.0000000e+00
2.0000000e+00 6.0000000e+00 3.0000000e+00 4.0000000e+00 2.0000000e+00 7.0000000e+00 7.0000000e+00 0.0000000e+00 7.0000000e+00 1.3000000e+01 6.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 1.0000000e+00 8.0000000e+00 6.0000000e+00 9.0000000e+00 8.0000000e+00 8.0000000e+00 1.0000000e+01 7.0000000e+00 6.0000000e+00 5.0000000e+00 5.0000000e+00 7.0000000e+00 6.0000000e+00 8.0000000e+00 7.0000000e+00 1.0000000e+01 8.0000000e+00 9.0000000e+00
3.0000000e+00 6.0000000e+00 4.0000000e+00 4.0000000e+00 4.0000000e+00 7.0000000e+00 6.0000000e+00 6.0000000e+00 4.0000000e+00 6.0000000e+00 7.0000000e+00 8.0000000e+00 7.0000000e+00 5.0000000e+00 2.0000000e+00 7.0000000e+00 9.0000000e+00 1.4000000e+01 9.0000000e+00 8.0000000e+00 6.0000000e+00 3.0000000e+00 8.0000000e+00 4.0000000e+00 6.0000000e+00 1.0000000e+01 1.1000000e+01 1.2000000e+01 5.0000000e+00 8.0000000e+00 4.0000000e+00 6.0000000e+00
4.0000000e+00 7.0000000e+00 5.0000000e+00 5.0000000e+00 4.0000000e+00 9.0000000e+00 6.0000000e+00 6.0000000e+00 5.0000000e+00 6.0000000e+00 8.0000000e+00 6.0000000e+00 8.0000000e+00 5.0000000e+00 2.0000000e+00 7.0000000e+00 8.0000000e+00 1.1000000e+01 8.0000000e+00 9.0000000e+00 7.0000000e+00 6.0000000e+00 1.1000000e+01 2.0000000e+00 8.0000000e+00 1.1000000e+01 9.0000000e+00 5.0000000e+00 4.0000000e+00 1.0000000e+01 4.0000000e+00 4.0000000e+00
2.0000000e+00 3.0000000e+00 3.0000000e+00 2.0000000e+00 1.0000000e+00 6.0000000e+00 1.1000000e+01 2.0000000e+00 7.0000000e+00 1.0000000e+01 9.0000000e+00 5.0000000e+00 1.0000000e+00 1.0000000e+01 2.0000000e+00 5.0000000e+00 6.0000000e+00 1.1000000e+01 6.0000000e+00 6.0000000e+00 3.0000000e+00 6.0000000e+00 8.0000000e+00 5.0000000e+00 3.0000000e+00 1.3000000e+01 9.0000000e+00 8.0000000e+00 3.0000000e+00 1.0000000e+01 3.0000000e+00 8.0000000e+00
6.0000000e+00 1.0000000e+01 8.0000000e+00 8.0000000e+00 7.0000000e+00 6.0000000e+00 7.0000000e+00 7.0000000e+00 7.0000000e+00 7.0000000e+00 9.0000000e+00 9.0000000e+00 4.0000000e+00 1.0000000e+01 6.0000000e+00 8.0000000e+00 5.0000000e+00 1.0000000e+01 4.0000000e+00 5.0000000e+00 3.0000000e+00 9.0000000e+00 5.0000000e+00 4.0000000e+00 3.0000000e+00 9.0000000e+00 4.0000000e+00 5.0000000e+00 4.0000000e+00 7.0000000e+00 5.0000000e+00 8.0000000e+00
0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 0.0000000e+00 7.0000000e+00 7.0000000e+00 4.0000000e+00 4.0000000e+00 7.0000000e+00 6.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 7.0000000e+00 1.0000000e+01 7.0000000e+00 8.0000000e+00 5.0000000e+00 8.0000000e+00 6.0000000e+00 8.0000000e+00 6.0000000e+00 1.0000000e+01 5.0000000e+00 9.0000000e+00 5.0000000e+00 9.0000000e+00 6.0000000e+00 5.0000000e+00
3.0000000e+00 1.0000000e+01 4.0000000e+00 8.0000000e+00 2.0000000e+00 7.0000000e+00 7.0000000e+00 0.0000000e+00 8.0000000e+00 1.3000000e+01 6.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 1.0000000e+00 8.0000000e+00 2.0000000e+00 2.0000000e+00 4.0000000e+00 4.0000000e+00 2.0000000e+00 7.0000000e+00 1.0000000e+01 1.0000000e+00 7.0000000e+00 7.0000000e+00 1.1000000e+01 8.0000000e+00 1.0000000e+00 1.1000000e+01 2.0000000e+00 8.0000000e+00
4.0000000e+00 1.0000000e+01 6.0000000e+00 8.0000000e+00 4.0000000e+00 7.0000000e+00 7.0000000e+00 0.0000000e+00 8.0000000e+00 1.3000000e+01 6.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 1.0000000e+00 8.0000000e+00 3.0000000e+00 6.0000000e+00 4.0000000e+00 4.0000000e+00 3.0000000e+00 7.0000000e+00 8.0000000e+00 6.0000000e+00 4.0000000e+00 1.0000000e+01 7.0000000e+00 6.0000000e+00 3.0000000e+00 9.0000000e+00 3.0000000e+00 8.0000000e+00
3.0000000e+00 6.0000000e+00 4.0000000e+00 4.0000000e+00 2.0000000e+00 8.0000000e+00 6.0000000e+00 1.1000000e+01 1.0000000e+00 6.0000000e+00 9.0000000e+00 8.0000000e+00 7.0000000e+00 6.0000000e+00 0.0000000e+00 8.0000000e+00 2.0000000e+00 4.0000000e+00 3.0000000e+00 2.0000000e+00 1.0000000e+00 4.0000000e+00 1.1000000e+01 2.0000000e+00 6.0000000e+00 1.1000000e+01 1.0000000e+01 5.0000000e+00 1.0000000e+00 1.1000000e+01 2.0000000e+00 5.0000000e+00
6.0000000e+00 7.0000000e+00 9.0000000e+00 5.0000000e+00 7.0000000e+00 4.0000000e+00 7.0000000e+00 3.0000000e+00 5.0000000e+00 1.0000000e+01 1.0000000e+01 1.1000000e+01 8.0000000e+00 6.0000000e+00 3.0000000e+00 7.0000000e+00 4.0000000e+00 8.0000000e+00 6.0000000e+00 6.0000000e+00 4.0000000e+00 7.0000000e+00 8.0000000e+00 7.0000000e+00 6.0000000e+00 1.0000000e+01 6.0000000e+00 5.0000000e+00 3.0000000e+00 8.0000000e+00 4.0000000e+00 8.0000000e+00
7.0000000e+00 1.5000000e+01 6.0000000e+00 8.0000000e+00 4.0000000e+00 9.0000000e+00 7.0000000e+00 3.0000000e+00 6.0000000e+00 1.3000000e+01 3.0000000e+00 5.0000000e+00 3.0000000e+00 8.0000000e+00 6.0000000e+00 1.0000000e+01 5.0000000e+00 6.0000000e+00 6.0000000e+00 8.0000000e+00 9.0000000e+00 9.0000000e+00 8.0000000e+00 6.0000000e+00 3.0000000e+00 7.0000000e+00 7.0000000e+00 8.0000000e+00 6.0000000e+00 1.0000000e+01 7.0000000e+00 4.0000000e+00
5.0000000e+00 1.1000000e+01 7.0000000e+00 8.0000000e+00 9.0000000e+00 8.0000000e+00 7.0000000e+00 6.0000000e+00 5.0000000e+00 6.0000000e+00 7.0000000e+00 8.0000000e+00 8.0000000e+00 6.0000000e+00 2.0000000e+00 8.0000000e+00 4.0000000e+00 7.0000000e+00 6.0000000e+00 8.0000000e+00 5.0000000e+00 9.0000000e+00 9.0000000e+00 5.0000000e+00 4.0000000e+00 6.0000000e+00 6.0000000e+00 9.0000000e+00 3.0000000e+00 7.0000000e+00 8.0000000e+00 6.0000000e+00
5.0000000e+00 7.0000000e+00 6.0000000e+00 5.0000000e+00 7.0000000e+00 8.0000000e+00 8.0000000e+00 6.0000000e+00 5.0000000e+00 7.0000000e+00 6.0000000e+00 8.0000000e+00 7.0000000e+00 9.0000000e+00 7.0000000e+00 6.0000000e+00 3.0000000e+00 3.0000000e+00 4.0000000e+00 2.0000000e+00 1.0000000e+00 4.0000000e+00 1.3000000e+01 3.0000000e+00 2.0000000e+00 1.0000000e+01 1.1000000e+01 7.0000000e+00 2.0000000e+00 1.1000000e+01 1.0000000e+00 8.0000000e+00
1.0000000e+00 4.0000000e+00 2.0000000e+00 3.0000000e+00 1.0000000e+00 7.0000000e+00 7.0000000e+00 0.0000000e+00 7.0000000e+00 1.3000000e+01 6.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 1.0000000e+00 8.0000000e+00 4.0000000e+00 7.0000000e+00 6.0000000e+00 5.0000000e+00 5.0000000e+00 1.1000000e+01 6.0000000e+00 3.0000000e+00 4.0000000e+00 9.0000000e+00 3.0000000e+00 6.0000000e+00 7.0000000e+00 6.0000000e+00 2.0000000e+00 8.0000000e+00
4.0000000e+00 4.0000000e+00 5.0000000e+00 6.0000000e+00 3.0000000e+00 7.0000000e+00 7.0000000e+00 1.2000000e+01 1.0000000e+00 7.0000000e+00 9.0000000e+00 8.0000000e+00 8.0000000e+00 6.0000000e+00 0.0000000e+00 8.0000000e+00 4.0000000e+00 6.0000000e+00 6.0000000e+00 4.0000000e+00 4.0000000e+00 6.0000000e+00 8.0000000e+00 2.0000000e+00 8.0000000e+00 1.1000000e+01 7.0000000e+00 9.0000000e+00 2.0000000e+00 9.0000000e+00 4.0000000e+00 8.0000000e+00
2.0000000e+00 6.0000000e+00 3.0000000e+00 4.0000000e+00 2.0000000e+00 7.0000000e+00 7.0000000e+00 0.0000000e+00 6.0000000e+00 1.3000000e+01 6.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 1.0000000e+00 8.0000000e+00 2.0000000e+00 5.0000000e+00 4.0000000e+00 3.0000000e+00 3.0000000e+00 9.0000000e+00 6.0000000e+00 3.0000000e+00 5.0000000e+00 1.0000000e+01 4.0000000e+00 6.0000000e+00 3.0000000e+00 7.0000000e+00 3.0000000e+00 8.0000000e+00
2.0000000e+00 3.0000000e+00 3.0000000e+00 4.0000000e+00 1.0000000e+00 8.0000000e+00 1.4000000e+01 0.0000000e+00 6.0000000e+00 6.0000000e+00 1.1000000e+01 8.0000000e+00 0.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 4.0000000e+00 1.1000000e+01 6.0000000e+00 8.0000000e+00 4.0000000e+00 1.0000000e+01 5.0000000e+00 4.0000000e+00 5.0000000e+00 1.4000000e+01 4.0000000e+00 1.0000000e+01 0.0000000e+00 7.0000000e+00 1.0000000e+00 6.0000000e+00
4.0000000e+00 1.0000000e+01 6.0000000e+00 8.0000000e+00 5.0000000e+00 1.0000000e+01 1.1000000e+01 2.0000000e+00 7.0000000e+00 5.0000000e+00 1.1000000e+01 7.0000000e+00 1.0000000e+00 1.1000000e+01 1.0000000e+00 8.0000000e+00 6.0000000e+00 1.0000000e+01 6.0000000e+00 5.0000000e+00 4.0000000e+00 9.0000000e+00 6.0000000e+00 3.0000000e+00 7.0000000e+00 1.0000000e+01 4.0000000e+00 7.0000000e+00 5.0000000e+00 7.0000000e+00 8.0000000e+00 7.0000000e+00
4.0000000e+00 6.0000000e+00 5.0000000e+00 4.0000000e+00 3.0000000e+00 8.0000000e+00 7.0000000e+00 1.2000000e+01 1.0000000e+00 6.0000000e+00 9.0000000e+00 8.0000000e+00 8.0000000e+00 6.0000000e+00 0.0000000e+00 8.0000000e+00 7.0000000e+00 1.0000000e+01 9.0000000e+00 8.0000000e+00 9.0000000e+00 8.0000000e+00 6.0000000e+00 7.0000000e+00 4.0000000e+00 7.0000000e+00 6.0000000e+00 9.0000000e+00 6.0000000e+00 8.0000000e+00 8.0000000e+00 3.0000000e+00
4.0000000e+00 5.0000000e+00 5.0000000e+00 6.0000000e+00 5.0000000e+00 7.0000000e+00 1.0000000e+01 4.0000000e+00 5.0000000e+00 8.0000000e+00 7.0000000e+00 8.0000000e+00 4.0000000e+00 7.0000000e+00 6.0000000e+00 6.0000000e+00 5.0000000e+00 1.1000000e+01 5.0000000e+00 6.0000000e+00 4.0000000e+00 8.0000000e+00 6.0000000e+00 3.0000000e+00 5.0000000e+00 9.0000000e+00 5.0000000e+00 7.0000000e+00 5.0000000e+00 9.0000000e+00 5.0000000e+00 8.0000000e+00
1.0000000e+00 7.0000000e+00 0.0000000e+00 4.0000000e+00 0.0000000e+00 7.0000000e+00 7.0000000e+00 4.0000000e+00 4.0000000e+00 7.0000000e+00 6.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 2.0000000e+00 3.0000000e+00 2.0000000e+00 1.0000000e+00 1.0000000e+00 7.0000000e+00 8.0000000e+00 6.0000000e+00 7.0000000e+00 8.0000000e+00 9.0000000e+00 7.0000000e+00 3.0000000e+00 1.0000000e+01 1.0000000e+00 8.0000000e+00
2.0000000e+00 6.0000000e+00 3.0000000e+00 4.0000000e+00 1.0000000e+00 7.0000000e+00 1.2000000e+01 0.0000000e+00 5.0000000e+00 7.0000000e+00 1.0000000e+01 8.0000000e+00 0.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 5.0000000e+00 1.0000000e+01 6.0000000e+00 7.0000000e+00 5.0000000e+00 9.0000000e+00 8.0000000e+00 6.0000000e+00 5.0000000e+00 6.0000000e+00 5.0000000e+00 4.0000000e+00 6.0000000e+00 1.0000000e+01 3.0000000e+00 5.0000000e+00
2.0000000e+00 1.0000000e+01 2.0000000e+00 8.0000000e+00 2.0000000e+00 8.0000000e+00 7.0000000e+00 0.0000000e+00 9.0000000e+00 7.0000000e+00 6.0000000e+00 7.0000000e+00 0.0000000e+00 8.0000000e+00 3.0000000e+00 7.0000000e+00 3.0000000e+00 8.0000000e+00 4.0000000e+00 6.0000000e+00 3.0000000e+00 7.0000000e+00 7.0000000e+00 5.0000000e+00 9.0000000e+00 7.0000000e+00 6.0000000e+00 8.0000000e+00 2.0000000e+00 8.0000000e+00 7.0000000e+00 8.0000000e+00
7.0000000e+00 1.1000000e+01 1.1000000e+01 8.0000000e+00 8.0000000e+00 7.0000000e+00 6.0000000e+00 3.0000000e+00 5.0000000e+00 9.0000000e+00 8.0000000e+00 9.0000000e+00 8.0000000e+00 6.0000000e+00 2.0000000e+00 8.0000000e+00 3.0000000e+00 6.0000000e+00 3.0000000e+00 4.0000000e+00 3.0000000e+00 6.0000000e+00 9.0000000e+00 7.0000000e+00 3.0000000e+00 7.0000000e+00 5.0000000e+00 8.0000000e+00 2.0000000e+00 7.0000000e+00 5.0000000e+00 1.1000000e+01
9.0000000e+00 1.1000000e+01 7.0000000e+00 6.0000000e+00 3.0000000e+00 5.0000000e+00 9.0000000e+00 3.0000000e+00 9.0000000e+00 1.3000000e+01 7.0000000e+00 5.0000000e+00 2.0000000e+00 1.0000000e+01 3.0000000e+00 5.0000000e+00 3.0000000e+00 4.0000000e+00 4.0000000e+00 3.0000000e+00 1.0000000e+00 5.0000000e+00 1.2000000e+01 3.0000000e+00 3.0000000e+00 9.0000000e+00 1.1000000e+01 7.0000000e+00 2.0000000e+00 1.0000000e+01 1.0000000e+00 8.0000000e+00
1.0000000e+00 4.0000000e+00 2.0000000e+00 3.0000000e+00 1.0000000e+00 7.0000000e+00 8.0000000e+00 0.0000000e+00 7.0000000e+00 1.3000000e+01 6.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 1.0000000e+00 7.0000000e+00 6.0000000e+00 9.0000000e+00 9.0000000e+00 7.0000000e+00 5.0000000e+00 3.0000000e+00 9.0000000e+00 3.0000000e+00 7.0000000e+00 1.1000000e+01 1.2000000e+01 1.2000000e+01 4.0000000e+00 7.0000000e+00 4.0000000e+00 5.0000000e+00
6.0000000e+00 1.0000000e+01 8.0000000e+00 8.0000000e+00 7.0000000e+00 9.0000000e+00 6.0000000e+00 6.0000000e+00 5.0000000e+00 6.0000000e+00 7.0000000e+00 6.0000000e+00 8.0000000e+00 6.0000000e+00 2.0000000e+00 6.0000000e+00 6.0000000e+00 1.0000000e+01 6.0000000e+00 8.0000000e+00 4.0000000e+00 5.0000000e+00 1.2000000e+01 4.0000000e+00 6.0000000e+00 1.2000000e+01 9.0000000e+00 4.0000000e+00 2.0000000e+00 1.2000000e+01 2.0000000e+00 4.0000000e+00
1.0000000e+00 0.0000000e+00 2.0000000e+00 0.0000000e+00 0.0000000e+00 7.0000000e+00 6.0000000e+00 9.0000000e+00 0.0000000e+00 7.0000000e+00 8.0000000e+00 8.0000000e+00 5.0000000e+00 6.0000000e+00 0.0000000e+00 8.0000000e+00 2.0000000e+00 7.0000000e+00 3.0000000e+00 5.0000000e+00 3.0000000e+00 7.0000000e+00 7.0000000e+00 3.0000000e+00 7.0000000e+00 6.0000000e+00 7.0000000e+00 1.0000000e+01 2.0000000e+00 8.0000000e+00 6.0000000e+00 8.0000000e+00
1.0000000e+00 1.1000000e+01 0.0000000e+00 8.0000000e+00 0.0000000e+00 7.0000000e+00 7.0000000e+00 4.0000000e+00 4.0000000e+00 7.0000000e+00 6.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 4.0000000e+00 1.0000000e+01 5.0000000e+00 7.0000000e+00 3.0000000e+00 5.0000000e+00 3.0000000e+00 7.0000000e+00 7.0000000e+00 2.0000000e+00 2.0000000e+00 4.0000000e+00 1.0000000e+00 6.0000000e+00 1.0000000e+00 5.0000000e+00
5.0000000e+00 8.0000000e+00 7.0000000e+00 6.0000000e+00 6.0000000e+00 4.0000000e+00 7.0000000e+00 3.0000000e+00 4.0000000e+00 1.0000000e+01 1.0000000e+01 1.0000000e+01 5.0000000e+00 6.0000000e+00 2.0000000e+00 6.0000000e+00 6.0000000e+00 8.0000000e+00 8.0000000e+00 6.0000000e+00 8.0000000e+00 8.0000000e+00 6.0000000e+00 4.0000000e+00 3.0000000e+00 9.0000000e+00 5.0000000e+00 8.0000000e+00 5.0000000e+00 9.0000000e+00 1.1000000e+01 1.0000000e+01
4.0000000e+00 6.0000000e+00 6.0000000e+00 6.0000000e+00 5.0000000e+00 5.0000000e+00 8.0000000e+00 4.0000000e+00 8.0000000e+00 8.0000000e+00 8.0000000e+00 9.0000000e+00 3.0000000e+00 9.0000000e+00 7.0000000e+00 6.0000000e+00 3.0000000e+00 8.0000000e+00 4.0000000e+00 6.0000000e+00 2.0000000e+00 7.0000000e+00 6.0000000e+00 8.0000000e+00 7.0000000e+00 6.0000000e+00 5.0000000e+00 1.1000000e+01 1.0000000e+00 8.0000000e+00 5.0000000e+00 1.1000000e+01
3.0000000e+00 5.0000000e+00 5.0000000e+00 6.0000000e+00 1.0000000e+00 8.0000000e+00 1.5000000e+01 1.0000000e+00 5.0000000e+00 7.0000000e+00 1.1000000e+01 8.0000000e+00 0.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 2.0000000e+00 6.0000000e+00 2.0000000e+00 4.0000000e+00 2.0000000e+00 3.0000000e+00 8.0000000e+00 5.0000000e+00 9.0000000e+00 8.0000000e+00 8.0000000e+00 1.3000000e+01 0.0000000e+00 8.0000000e+00 6.0000000e+00 9.0000000e+00
1.0000000e+00 1.0000000e+00 1.0000000e+00 1.0000000e+00 0.0000000e+00 7.0000000e+00 7.0000000e+00 2.0000000e+00 7.0000000e+00 7.0000000e+00 6.0000000e+00 9.0000000e+00 0.0000000e+00 8.0000000e+00 2.0000000e+00 8.0000000e+00 3.0000000e+00 3.0000000e+00 3.0000000e+00 5.0000000e+00 1.0000000e+00 0.0000000e+00 1.0000000e+00 6.0000000e+00 6.0000000e+00 0.0000000e+00 1.0000000e+00 5.0000000e+00 0.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00
7.0000000e+00 8.0000000e+00 8.0000000e+00 9.0000000e+00 8.0000000e+00 7.0000000e+00 8.0000000e+00 4.0000000e+00 6.0000000e+00 6.0000000e+00 8.0000000e+00 7.0000000e+00 4.0000000e+00 9.0000000e+00 1.0000000e+01 9.0000000e+00 7.0000000e+00 9.0000000e+00 1.0000000e+01 8.0000000e+00 1.1000000e+01 7.0000000e+00 6.0000000e+00 5.0000000e+00 5.0000000e+00 7.0000000e+00 6.0000000e+00 8.0000000e+00 7.0000000e+00 1.0000000e+01 8.0000000e+00 8.0000000e+00
5.0000000e+00 1.0000000e+01 6.0000000e+00 8.0000000e+00 4.0000000e+00 5.0000000e+00 1.1000000e+01 1.0000000e+00 9.0000000e+00 8.0000000e+00 1.1000000e+01 9.0000000e+00 1.0000000e+00 1.0000000e+01 1.0000000e+00 7.0000000e+00 4.0000000e+00 4.0000000e+00 5.0000000e+00 2.0000000e+00 3.0000000e+00 8.0000000e+00 6.0000000e+00 6.0000000e+00 4.0000000e+00 6.0000000e+00 7.0000000e+00 8.0000000e+00 8.0000000e+00 6.0000000e+00 2.0000000e+00 7.0000000e+00
5.0000000e+00 6.0000000e+00 8.0000000e+00 4.0000000e+00 4.0000000e+00 7.0000000e+00 6.0000000e+00 2.0000000e+00 5.0000000e+00 9.0000000e+00 7.0000000e+00 8.0000000e+00 8.0000000e+00 5.0000000e+00 2.0000000e+00 8.0000000e+00 4.0000000e+00 7.0000000e+00 5.0000000e+00 5.0000000e+00 6.0000000e+00 8.0000000e+00 7.0000000e+00 6.0000000e+00 6.0000000e+00 6.0000000e+00 6.0000000e+00 6.0000000e+00 2.0000000e+00 8.0000000e+00 6.0000000e+00 9.0000000e+00
3.0000000e+00 6.0000000e+00 4.0000000e+00 4.0000000e+00 4.0000000e+00 8.0000000e+00 6.0000000e+00 6.0000000e+00 4.0000000e+00 7.0000000e+00 7.0000000e+00 8.0000000e+00 7.0000000e+00 5.0000000e+00 2.0000000e+00 7.0000000e+00 5.0000000e+00 8.0000000e+00 7.0000000e+00 6.0000000e+00 5.0000000e+00 8.0000000e+00 1.0000000e+01 5.0000000e+00 4.0000000e+00 1.1000000e+01 4.0000000e+00 3.0000000e+00 1.0000000e+00 1.0000000e+01 3.0000000e+00 8.0000000e+00
5.0000000e+00 9.0000000e+00 5.0000000e+00 6.0000000e+00 4.0000000e+00 5.0000000e+00 1.2000000e+01 4.0000000e+00 6.0000000e+00 1.1000000e+01 9.0000000e+00 4.0000000e+00 2.0000000e+00 1.2000000e+01 2.0000000e+00 4.0000000e+00 1.2000000e+01 1.3000000e+01 9.0000000e+00 8.0000000e+00 4.0000000e+00 7.0000000e+00 9.0000000e+00 6.0000000e+00 4.0000000e+00 1.1000000e+01 4.0000000e+00 5.0000000e+00 5.0000000e+00 9.0000000e+00 5.0000000e+00 8.0000000e+00
5.0000000e+00 9.0000000e+00 7.0000000e+00 7.0000000e+00 8.0000000e+00 8.0000000e+00 7.0000000e+00 6.0000000e+00 4.0000000e+00 6.0000000e+00 7.0000000e+00 8.0000000e+00 8.0000000e+00 6.0000000e+00 2.0000000e+00 7.0000000e+00 2.0000000e+00 1.0000000e+00 2.0000000e+00 3.0000000e+00 2.0000000e+00 7.0000000e+00 7.0000000e+00 5.0000000e+00 6.0000000e+00 7.0000000e+00 6.0000000e+00 9.0000000e+00 2.0000000e+00 8.0000000e+00 5.0000000e+00 1.0000000e+01
1.0000000e+00 4.0000000e+00 0.0000000e+00 6.0000000e+00 0.0000000e+00 7.0000000e+00 7.0000000e+00 4.0000000e+00 4.0000000e+00 7.0000000e+00 6.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 1.0000000e+00 0.0000000e+00 1.0000000e+00 1.0000000e+00 0.0000000e+00 7.0000000e+00 7.0000000e+00 1.1000000e+01 1.0000000e+00 7.0000000e+00 6.0000000e+00 8.0000000e+00 3.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00
8.0000000e+00 1.3000000e+01 7.0000000e+00 7.0000000e+00 3.0000000e+00 6.0000000e+00 9.0000000e+00 3.0000000e+00 8.0000000e+00 1.3000000e+01 6.0000000e+00 6.0000000e+00 2.0000000e+00 8.0000000e+00 5.0000000e+00 4.0000000e+00 4.0000000e+00 3.0000000e+00 5.0000000e+00 5.0000000e+00 3.0000000e+00 7.0000000e+00 7.0000000e+00 1.2000000e+01 1.0000000e+00 7.0000000e+00 9.0000000e+00 8.0000000e+00 8.0000000e+00 6.0000000e+00 0.0000000e+00 8.0000000e+00
2.0000000e+00 7.0000000e+00 4.0000000e+00 4.0000000e+00 1.0000000e+00 9.0000000e+00 1.5000000e+01 1.0000000e+00 5.0000000e+00 6.0000000e+00 1.1000000e+01 9.0000000e+00 0.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 3.0000000e+00 1.0000000e+00 4.0000000e+00 2.0000000e+00 2.0000000e+00 6.0000000e+00 7.0000000e+00 4.0000000e+00 7.0000000e+00 7.0000000e+00 6.0000000e+00 1.0000000e+01 3.0000000e+00 8.0000000e+00 4.0000000e+00 9.0000000e+00
2.0000000e+00 1.0000000e+01 4.0000000e+00 7.0000000e+00 1.0000000e+00 7.0000000e+00 1.4000000e+01 0.0000000e+00 6.0000000e+00 7.0000000e+00 1.1000000e+01 8.0000000e+00 0.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 3.0000000e+00 6.0000000e+00 4.0000000e+00 4.0000000e+00 4.0000000e+00 8.0000000e+00 8.0000000e+00 6.0000000e+00 6.0000000e+00 7.0000000e+00 6.0000000e+00 6.0000000e+00 2.0000000e+00 8.0000000e+00 6.0000000e+00 9.0000000e+00
5.0000000e+00 7.0000000e+00 7.0000000e+00 5.0000000e+00 6.0000000e+00 7.0000000e+00 6.0000000e+00 6.0000000e+00 5.0000000e+00 7.0000000e+00 7.0000000e+00 1.1000000e+01 1.0000000e+01 6.0000000e+00 2.0000000e+00 9.0000000e+00 4.0000000e+00 1.0000000e+01 4.0000000e+00 8.0000000e+00 3.0000000e+00 7.0000000e+00 7.0000000e+00 1.4000000e+01 2.0000000e+00 5.0000000e+00 6.0000000e+00 8.0000000e+00 6.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00
7.0000000e+00 1.0000000e+01 6.0000000e+00 5.0000000e+00 3.0000000e+00 8.0000000e+00 9.0000000e+00 2.0000000e+00 7.0000000e+00 1.1000000e+01 7.0000000e+00 7.0000000e+00 2.0000000e+00 9.0000000e+00 4.0000000e+00 6.0000000e+00 5.0000000e+00 7.0000000e+00 7.0000000e+00 5.0000000e+00 4.0000000e+00 5.0000000e+00 8.0000000e+00 5.0000000e+00 1.0000000e+00 8.0000000e+00 1.0000000e+01 9.0000000e+00 8.0000000e+00 1.1000000e+01 0.0000000e+00 8.0000000e+00
0.0000000e+00 3.0000000e+00 0.0000000e+00 4.0000000e+00 0.0000000e+00 7.0000000e+00 7.0000000e+00 4.0000000e+00 4.0000000e+00 7.0000000e+00 6.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 2.0000000e+00 2.0000000e+00 2.0000000e+00 2.0000000e+00 1.0000000e+00 7.0000000e+00 8.0000000e+00 5.0000000e+00 2.0000000e+00 7.0000000e+00 8.0000000e+00 1.0000000e+01 2.0000000e+00 9.0000000e+00 4.0000000e+00 8.0000000e+00
0.0000000e+00 3.0000000e+00 0.0000000e+00 2.0000000e+00 0.0000000e+00 9.0000000e+00 7.0000000e+00 2.0000000e+00 6.0000000e+00 7.0000000e+00 6.0000000e+00 7.0000000e+00 0.0000000e+00 8.0000000e+00 1.0000000e+00 7.0000000e+00 3.0000000e+00 7.0000000e+00 3.0000000e+00 5.0000000e+00 1.0000000e+00 0.0000000e+00 1.0000000e+00 6.0000000e+00 6.0000000e+00 0.0000000e+00 0.0000000e+00 6.0000000e+00 0.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00
5.0000000e+00 1.0000000e+01 6.0000000e+00 8.0000000e+00 4.0000000e+00 5.0000000e+00 1.1000000e+01 1.0000000e+00 9.0000000e+00 8.0000000e+00 1.1000000e+01 9.0000000e+00 1.0000000e+00 1.0000000e+01 1.0000000e+00 7.0000000e+00 3.0000000e+00 5.0000000e+00 4.0000000e+00 7.0000000e+00 3.0000000e+00 7.0000000e+00 7.0000000e+00 1.4000000e+01 2.0000000e+00 5.0000000e+00 6.0000000e+00 8.0000000e+00 6.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00
5.0000000e+00 1.0000000e+01 6.0000000e+00 8.0000000e+00 4.0000000e+00 7.0000000e+00 7.0000000e+00 1.2000000e+01 2.0000000e+00 8.0000000e+00 9.0000000e+00 8.0000000e+00 8.0000000e+00 6.0000000e+00 0.0000000e+00 8.0000000e+00 4.0000000e+00 7.0000000e+00 5.0000000e+00 5.0000000e+00 4.0000000e+00 7.0000000e+00 8.0000000e+00 6.0000000e+00 6.0000000e+00 6.0000000e+00 5.0000000e+00 8.0000000e+00 3.0000000e+00 6.0000000e+00 6.0000000e+00 9.0000000e+00
6.0000000e+00 9.0000000e+00 6.0000000e+00 7.0000000e+00 5.0000000e+00 6.0000000e+00 1.1000000e+01 3.0000000e+00 7.0000000e+00 1.1000000e+01 9.0000000e+00 5.0000000e+00 2.0000000e+00 1.2000000e+01 2.0000000e+00 4.0000000e+00 3.0000000e+00 4.0000000e+00 5.0000000e+00 3.0000000e+00 3.0000000e+00 7.0000000e+00 7.0000000e+00 3.0000000e+00 6.0000000e+00 1.0000000e+01 6.0000000e+00 8.0000000e+00 3.0000000e+00 8.0000000e+00 3.0000000e+00 8.0000000e+00
6.0000000e+00 9.0000000e+00 9.0000000e+00 7.0000000e+00 7.0000000e+00 8.0000000e+00 7.0000000e+00 2.0000000e+00 4.0000000e+00 9.0000000e+00 7.0000000e+00 8.0000000e+00 8.0000000e+00 7.0000000e+00 2.0000000e+00 8.0000000e+00 2.0000000e+00 3.0000000e+00 4.0000000e+00 2.0000000e+00 2.0000000e+00 7.0000000e+00 2.0000000e+00 1.0000000e+00 2.0000000e+00 7.0000000e+00 2.0000000e+00 8.0000000e+00 2.0000000e+00 7.0000000e+00 2.0000000e+00 7.0000000e+00
3.0000000e+00 3.0000000e+00 4.0000000e+00 2.0000000e+00 2.0000000e+00 9.0000000e+00 6.0000000e+00 7.0000000e+00 3.0000000e+00 6.0000000e+00 7.0000000e+00 6.0000000e+00 6.0000000e+00 6.0000000e+00 1.0000000e+00 5.0000000e+00 7.0000000e+00 7.0000000e+00 7.0000000e+00 5.0000000e+00 5.0000000e+00 6.0000000e+00 1.0000000e+01 4.0000000e+00 3.0000000e+00 8.0000000e+00 7.0000000e+00 7.0000000e+00 9.0000000e+00 1.3000000e+01 3.0000000e+00 4.0000000e+00
4.0000000e+00 4.0000000e+00 6.0000000e+00 3.0000000e+00 3.0000000e+00 1.0000000e+01 6.0000000e+00 3.0000000e+00 4.0000000e+00 9.0000000e+00 4.0000000e+00 7.0000000e+00 7.0000000e+00 6.0000000e+00 2.0000000e+00 8.0000000e+00 5.0000000e+00 7.0000000e+00 8.0000000e+00 5.0000000e+00 5.0000000e+00 9.0000000e+00 5.0000000e+00 1.0000000e+00 6.0000000e+00 9.0000000e+00 3.0000000e+00 8.0000000e+00 4.0000000e+00 7.0000000e+00 4.0000000e+00 1.0000000e+01
6.0000000e+00 1.2000000e+01 7.0000000e+00 6.0000000e+00 5.0000000e+00 7.0000000e+00 3.0000000e+00 2.0000000e+00 2.0000000e+00 8.0000000e+00 4.0000000e+00 1.0000000e+01 8.0000000e+00 1.0000000e+00 2.0000000e+00 8.0000000e+00 8.0000000e+00 1.5000000e+01 1.0000000e+01 8.0000000e+00 5.0000000e+00 1.2000000e+01 5.0000000e+00 2.0000000e+00 5.0000000e+00 1.2000000e+01 3.0000000e+00 7.0000000e+00 5.0000000e+00 6.0000000e+00 0.0000000e+00 8.0000000e+00
2.0000000e+00 3.0000000e+00 4.0000000e+00 1.0000000e+00 2.0000000e+00 5.0000000e+00 6.0000000e+00 3.0000000e+00 4.0000000e+00 1.0000000e+01 1.0000000e+01 1.0000000e+01 4.0000000e+00 7.0000000e+00 1.0000000e+00 7.0000000e+00 3.0000000e+00 7.0000000e+00 5.0000000e+00 5.0000000e+00 2.0000000e+00 5.0000000e+00 1.2000000e+01 4.0000000e+00 6.0000000e+00 1.2000000e+01 9.0000000e+00 4.0000000e+00 1.0000000e+00 1.0000000e+01 3.0000000e+00 4.0000000e+00
1.0000000e+00 1.0000000e+01 0.0000000e+00 8.0000000e+00 1.0000000e+00 7.0000000e+00 7.0000000e+00 5.0000000e+00 3.0000000e+00 7.0000000e+00 6.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 3.0000000e+00 7.0000000e+00 4.0000000e+00 5.0000000e+00 2.0000000e+00 0.0000000e+00 1.0000000e+00 4.0000000e+00 5.0000000e+00 1.0000000e+00 1.0000000e+00 7.0000000e+00 0.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00
4.0000000e+00 7.0000000e+00 6.0000000e+00 5.0000000e+00 6.0000000e+00 7.0000000e+00 7.0000000e+00 4.0000000e+00 5.0000000e+00 7.0000000e+00 6.0000000e+00 9.0000000e+00 5.0000000e+00 8.0000000e+00 5.0000000e+00 7.0000000e+00 6.0000000e+00 9.0000000e+00 6.0000000e+00 4.0000000e+00 4.0000000e+00 8.0000000e+00 8.0000000e+00 5.0000000e+00 3.0000000e+00 1.0000000e+01 5.0000000e+00 6.0000000e+00 5.0000000e+00 1.0000000e+01 5.0000000e+00 6.0000000e+00
6.0000000e+00 7.0000000e+00 8.0000000e+00 5.0000000e+00 6.0000000e+00 8.0000000e+00 6.0000000e+00 2.0000000e+00 5.0000000e+00 9.0000000e+00 8.0000000e+00 8.0000000e+00 8.0000000e+00 4.0000000e+00 2.0000000e+00 7.0000000e+00 2.0000000e+00 4.0000000e+00 3.0000000e+00 3.0000000e+00 2.0000000e+00 5.0000000e+00 1.0000000e+01 3.0000000e+00 5.0000000e+00 1.0000000e+01 9.0000000e+00 5.0000000e+00 1.0000000e+00 1.0000000e+01 3.0000000e+00 6.0000000e+00
5.0000000e+00 9.0000000e+00 6.0000000e+00 7.0000000e+00 4.0000000e+00 8.0000000e+00 7.0000000e+00 1.3000000e+01 2.0000000e+00 6.0000000e+00 9.0000000e+00 8.0000000e+00 8.0000000e+00 6.0000000e+00 0.0000000e+00 8.0000000e+00 3.0000000e+00 5.0000000e+00 4.0000000e+00 5.0000000e+00 3.0000000e+00 8.0000000e+00 7.0000000e+00 7.0000000e+00 4.0000000e+00 6.0000000e+00 6.0000000e+00 9.0000000e+00 2.0000000e+00 8.0000000e+00 4.0000000e+00 9.0000000e+00
6.0000000e+00 1.0000000e+01 8.0000000e+00 8.0000000e+00 9.0000000e+00 8.0000000e+00 7.0000000e+00 7.0000000e+00 5.0000000e+00 6.0000000e+00 5.0000000e+00 8.0000000e+00 1.0000000e+01 8.0000000e+00 1.0000000e+01 1.2000000e+01 8.0000000e+00 9.0000000e+00 8.0000000e+00 5.0000000e+00 3.0000000e+00 3.0000000e+00 1.1000000e+01 2.0000000e+00 3.0000000e+00 1.1000000e+01 1.1000000e+01 8.0000000e+00 7.0000000e+00 1.1000000e+01 0.0000000e+00 7.0000000e+00
6.0000000e+00 8.0000000e+00 6.0000000e+00 6.0000000e+00 3.0000000e+00 6.0000000e+00 1.1000000e+01 2.0000000e+00 9.0000000e+00 1.2000000e+01 9.0000000e+00 4.0000000e+00 1.0000000e+00 1.1000000e+01 3.0000000e+00 4.0000000e+00 4.0000000e+00 2.0000000e+00 5.0000000e+00 4.0000000e+00 4.0000000e+00 9.0000000e+00 6.0000000e+00 6.0000000e+00 4.0000000e+00 6.0000000e+00 7.0000000e+00 6.0000000e+00 8.0000000e+00 6.0000000e+00 2.0000000e+00 6.0000000e+00
5.0000000e+00 8.0000000e+00 8.0000000e+00 6.0000000e+00 5.0000000e+00 1.0000000e+01 5.0000000e+00 3.0000000e+00 5.0000000e+00 9.0000000e+00 4.0000000e+00 7.0000000e+00 8.0000000e+00 6.0000000e+00 2.0000000e+00 9.0000000e+00 3.0000000e+00 6.0000000e+00 5.0000000e+00 4.0000000e+00 6.0000000e+00 8.0000000e+00 6.0000000e+00 5.0000000e+00 4.0000000e+00 7.0000000e+00 7.0000000e+00 8.0000000e+00 7.0000000e+00 9.0000000e+00 7.0000000e+00 8.0000000e+00
1.0000000e+00 4.0000000e+00 0.0000000e+00 5.0000000e+00 0.0000000e+00 7.0000000e+00 7.0000000e+00 4.0000000e+00 4.0000000e+00 7.0000000e+00 6.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 2.0000000e+00 7.0000000e+00 3.0000000e+00 4.0000000e+00 0.0000000e+00 7.0000000e+00 1.1000000e+01 1.0000000e+00 3.0000000e+00 8.0000000e+00 1.2000000e+01 8.0000000e+00 1.0000000e+00 1.1000000e+01 0.0000000e+00 8.0000000e+00
4.0000000e+00 7.0000000e+00 6.0000000e+00 5.0000000e+00 6.0000000e+00 7.0000000e+00 9.0000000e+00 6.0000000e+00 3.0000000e+00 7.0000000e+00 6.0000000e+00 8.0000000e+00 5.0000000e+00 9.0000000e+00 5.0000000e+00 8.0000000e+00 3.0000000e+00 1.0000000e+01 6.0000000e+00 8.0000000e+00 4.0000000e+00 1.2000000e+01 2.0000000e+00 3.0000000e+00 3.0000000e+00 1.0000000e+01 2.0000000e+00 9.0000000e+00 2.0000000e+00 6.0000000e+00 4.0000000e+00 8.0000000e+00
2.0000000e+00 7.0000000e+00 3.0000000e+00 5.0000000e+00 2.0000000e+00 7.0000000e+00 9.0000000e+00 0.0000000e+00 6.0000000e+00 1.3000000e+01 6.0000000e+00 7.0000000e+00 0.0000000e+00 8.0000000e+00 1.0000000e+00 7.0000000e+00 1.0000000e+00 3.0000000e+00 2.0000000e+00 2.0000000e+00 1.0000000e+00 5.0000000e+00 8.0000000e+00 4.0000000e+00 5.0000000e+00 1.2000000e+01 8.0000000e+00 1.0000000e+01 1.0000000e+00 1.0000000e+01 2.0000000e+00 8.0000000e+00
8.0000000e+00 1.0000000e+01 8.0000000e+00 8.0000000e+00 6.0000000e+00 7.0000000e+00 1.0000000e+01 2.0000000e+00 8.0000000e+00 1.1000000e+01 9.0000000e+00 5.0000000e+00 3.0000000e+00 1.0000000e+01 5.0000000e+00 4.0000000e+00 2.0000000e+00 3.0000000e+00 3.0000000e+00 5.0000000e+00 0.0000000e+00 7.0000000e+00 1.0000000e+01 1.0000000e+00 3.0000000e+00 7.0000000e+00 1.2000000e+01 8.0000000e+00 1.0000000e+00 1.1000000e+01 0.0000000e+00 8.0000000e+00
5.0000000e+00 1.0000000e+01 8.0000000e+00 7.0000000e+00 7.0000000e+00 9.0000000e+00 6.0000000e+00 2.0000000e+00 4.0000000e+00 8.0000000e+00 5.0000000e+00 7.0000000e+00 7.0000000e+00 6.0000000e+00 2.0000000e+00 8.0000000e+00 1.0000000e+00 2.0000000e+00 2.0000000e+00 3.0000000e+00 1.0000000e+00 8.0000000e+00 7.0000000e+00 4.0000000e+00 1.0000000e+00 7.0000000e+00 8.0000000e+00 1.0000000e+01 2.0000000e+00 9.0000000e+00 3.0000000e+00 9.0000000e+00
4.0000000e+00 4.0000000e+00 6.0000000e+00 3.0000000e+00 4.0000000e+00 6.0000000e+00 6.0000000e+00 3.0000000e+00 4.0000000e+00 1.0000000e+01 9.0000000e+00 9.0000000e+00 7.0000000e+00 6.0000000e+00 2.0000000e+00 9.0000000e+00 2.0000000e+00 4.0000000e+00 4.0000000e+00 3.0000000e+00 2.0000000e+00 7.0000000e+00 8.0000000e+00 2.0000000e+00 9.0000000e+00 1.1000000e+01 6.0000000e+00 8.0000000e+00 1.0000000e+00 8.0000000e+00 5.0000000e+00 7.0000000e+00
3.0000000e+00 8.0000000e+00 4.0000000e+00 6.0000000e+00 2.0000000e+00 7.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 1.4000000e+01 6.0000000e+00 6.0000000e+00 0.0000000e+00 8.0000000e+00 1.0000000e+00 7.0000000e+00 6.0000000e+00 9.0000000e+00 9.0000000e+00 7.0000000e+00 6.0000000e+00 6.0000000e+00 1.3000000e+01 7.0000000e+00 2.0000000e+00 1.2000000e+01 5.0000000e+00 2.0000000e+00 1.0000000e+00 1.1000000e+01 4.0000000e+00 8.0000000e+00
4.0000000e+00 6.0000000e+00 5.0000000e+00 7.0000000e+00 5.0000000e+00 8.0000000e+00 9.0000000e+00 4.0000000e+00 5.0000000e+00 8.0000000e+00 7.0000000e+00 8.0000000e+00 4.0000000e+00 7.0000000e+00 8.0000000e+00 7.0000000e+00 3.0000000e+00 6.0000000e+00 4.0000000e+00 4.0000000e+00 4.0000000e+00 6.0000000e+00 8.0000000e+00 8.0000000e+00 4.0000000e+00 7.0000000e+00 6.0000000e+00 8.0000000e+00 2.0000000e+00 7.0000000e+00 5.0000000e+00 1.1000000e+01
4.0000000e+00 7.0000000e+00 6.0000000e+00 5.0000000e+00 8.0000000e+00 1.1000000e+01 7.0000000e+00 3.0000000e+00 4.0000000e+00 8.0000000e+00 4.0000000e+00 7.0000000e+00 5.0000000e+00 5.0000000e+00 2.0000000e+00 6.0000000e+00 3.0000000e+00 4.0000000e+00 4.0000000e+00 3.0000000e+00 2.0000000e+00 7.0000000e+00 6.0000000e+00 6.0000000e+00 5.0000000e+00 6.0000000e+00 6.0000000e+00 9.0000000e+00 2.0000000e+00 9.0000000e+00 4.0000000e+00 9.0000000e+00
4.0000000e+00 7.0000000e+00 6.0000000e+00 8.0000000e+00 6.0000000e+00 8.0000000e+00 8.0000000e+00 5.0000000e+00 6.0000000e+00 7.0000000e+00 5.0000000e+00 8.0000000e+00 3.0000000e+00 9.0000000e+00 8.0000000e+00 9.0000000e+00 4.0000000e+00 7.0000000e+00 5.0000000e+00 8.0000000e+00 5.0000000e+00 8.0000000e+00 1.1000000e+01 5.0000000e+00 1.0000000e+00 5.0000000e+00 8.0000000e+00 1.2000000e+01 2.0000000e+00 1.0000000e+01 5.0000000e+00 8.0000000e+00
1.0000000e+00 1.0000000e+00 1.0000000e+00 2.0000000e+00 1.0000000e+00 7.0000000e+00 7.0000000e+00 1.0000000e+00 7.0000000e+00 7.0000000e+00 6.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 2.0000000e+00 8.0000000e+00 7.0000000e+00 8.0000000e+00 9.0000000e+00 7.0000000e+00 1.0000000e+01 8.0000000e+00 7.0000000e+00 4.0000000e+00 5.0000000e+00 7.0000000e+00 6.0000000e+00 8.0000000e+00 8.0000000e+00 1.0000000e+01 9.0000000e+00 4.0000000e+00
1.0000000e+00 4.0000000e+00 2.0000000e+00 3.0000000e+00 1.0000000e+00 7.0000000e+00 7.0000000e+00 0.0000000e+00 7.0000000e+00 1.3000000e+01 6.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 4.0000000e+00 7.0000000e+00 6.0000000e+00 5.0000000e+00 4.0000000e+00 5.0000000e+00 1.1000000e+01 3.0000000e+00 5.0000000e+00 1.3000000e+01 7.0000000e+00 5.0000000e+00 1.0000000e+00 1.0000000e+01 2.0000000e+00 7.0000000e+00
2.0000000e+00 5.0000000e+00 3.0000000e+00 4.0000000e+00 2.0000000e+00 7.0000000e+00 1.2000000e+01 3.0000000e+00 6.0000000e+00 7.0000000e+00 1.1000000e+01 8.0000000e+00 2.0000000e+00 1.1000000e+01 1.0000000e+00 8.0000000e+00 4.0000000e+00 1.0000000e+01 5.0000000e+00 7.0000000e+00 4.0000000e+00 7.0000000e+00 8.0000000e+00 3.0000000e+00 1.2000000e+01 9.0000000e+00 6.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 8.0000000e+00 7.0000000e+00
1.0000000e+00 4.0000000e+00 3.0000000e+00 2.0000000e+00 1.0000000e+00 7.0000000e+00 7.0000000e+00 1.0000000e+00 8.0000000e+00 1.4000000e+01 6.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 1.0000000e+00 8.0000000e+00 1.0000000e+00 0.0000000e+00 2.0000000e+00 0.0000000e+00 0.0000000e+00 7.0000000e+00 1.4000000e+01 1.0000000e+00 4.0000000e+00 7.0000000e+00 1.0000000e+01 8.0000000e+00 0.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00
3.0000000e+00 9.0000000e+00 4.0000000e+00 6.0000000e+00 2.0000000e+00 7.0000000e+00 7.0000000e+00 0.0000000e+00 8.0000000e+00 1.4000000e+01 6.0000000e+00 9.0000000e+00 0.0000000e+00 8.0000000e+00 1.0000000e+00 8.0000000e+00 6.0000000e+00 7.0000000e+00 6.0000000e+00 5.0000000e+00 5.0000000e+00 6.0000000e+00 1.1000000e+01 4.0000000e+00 2.0000000e+00 8.0000000e+00 7.0000000e+00 6.0000000e+00 9.0000000e+00 1.2000000e+01 4.0000000e+00 5.0000000e+00
1.0000000e+00 6.0000000e+00 3.0000000e+00 4.0000000e+00 3.0000000e+00 8.0000000e+00 7.0000000e+00 2.0000000e+00 4.0000000e+00 8.0000000e+00 5.0000000e+00 5.0000000e+00 3.0000000e+00 9.0000000e+00 4.0000000e+00 5.0000000e+00 5.0000000e+00 1.0000000e+01 6.0000000e+00 9.0000000e+00 6.0000000e+00 8.0000000e+00 8.0000000e+00 7.0000000e+00 5.0000000e+00 5.0000000e+00 8.0000000e+00 9.0000000e+00 3.0000000e+00 8.0000000e+00 5.0000000e+00 8.0000000e+00
3.0000000e+00 8.0000000e+00 4.0000000e+00 6.0000000e+00 2.0000000e+00 7.0000000e+00 7.0000000e+00 0.0000000e+00 6.0000000e+00 1.3000000e+01 6.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 1.0000000e+00 8.0000000e+00 3.0000000e+00 9.0000000e+00 4.0000000e+00 7.0000000e+00 4.0000000e+00 5.0000000e+00 1.0000000e+01 1.0000000e+00 7.0000000e+00 1.0000000e+01 9.0000000e+00 7.0000000e+00 1.0000000e+00 1.0000000e+01 3.0000000e+00 6.0000000e+00
4.0000000e+00 7.0000000e+00 5.0000000e+00 5.0000000e+00 4.0000000e+00 7.0000000e+00 7.0000000e+00 7.0000000e+00 6.0000000e+00 6.0000000e+00 7.0000000e+00 9.0000000e+00 3.0000000e+00 1.0000000e+01 6.0000000e+00 7.0000000e+00 3.0000000e+00 9.0000000e+00 4.0000000e+00 7.0000000e+00 2.0000000e+00 7.0000000e+00 7.0000000e+00 6.0000000e+00 8.0000000e+00 5.0000000e+00 6.0000000e+00 7.0000000e+00 0.0000000e+00 8.0000000e+00 9.0000000e+00 7.0000000e+00
3.0000000e+00 3.0000000e+00 3.0000000e+00 2.0000000e+00 1.0000000e+00 5.0000000e+00 1.2000000e+01 3.0000000e+00 5.0000000e+00 1.1000000e+01 9.0000000e+00 4.0000000e+00 2.0000000e+00 1.1000000e+01 1.0000000e+00 5.0000000e+00 5.0000000e+00 6.0000000e+00 6.0000000e+00 7.0000000e+00 6.0000000e+00 7.0000000e+00 1.0000000e+01 5.0000000e+00 6.0000000e+00 8.0000000e+00 6.0000000e+00 8.0000000e+00 4.0000000e+00 8.0000000e+00 7.0000000e+00 6.0000000e+00
5.0000000e+00 1.0000000e+01 6.0000000e+00 8.0000000e+00 5.0000000e+00 4.0000000e+00 1.2000000e+01 5.0000000e+00 5.0000000e+00 1.2000000e+01 9.0000000e+00 4.0000000e+00 2.0000000e+00 1.2000000e+01 1.0000000e+00 5.0000000e+00 7.0000000e+00 1.1000000e+01 7.0000000e+00 8.0000000e+00 4.0000000e+00 3.0000000e+00 1.0000000e+01 2.0000000e+00 7.0000000e+00 1.0000000e+01 1.2000000e+01 6.0000000e+00 1.0000000e+00 1.1000000e+01 2.0000000e+00 5.0000000e+00
3.0000000e+00 1.0000000e+01 4.0000000e+00 8.0000000e+00 3.0000000e+00 7.0000000e+00 9.0000000e+00 0.0000000e+00 7.0000000e+00 1.3000000e+01 6.0000000e+00 7.0000000e+00 0.0000000e+00 9.0000000e+00 2.0000000e+00 7.0000000e+00 3.0000000e+00 3.0000000e+00 4.0000000e+00 4.0000000e+00 2.0000000e+00 7.0000000e+00 7.0000000e+00 1.4000000e+01 1.0000000e+00 7.0000000e+00 7.0000000e+00 8.0000000e+00 3.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00
7.0000000e+00 9.0000000e+00 1.0000000e+01 7.0000000e+00 6.0000000e+00 4.0000000e+00 6.0000000e+00 4.0000000e+00 5.0000000e+00 1.1000000e+01 1.1000000e+01 1.1000000e+01 9.0000000e+00 3.0000000e+00 4.0000000e+00 6.0000000e+00 4.0000000e+00 9.0000000e+00 6.0000000e+00 7.0000000e+00 7.0000000e+00 8.0000000e+00 7.0000000e+00 6.0000000e+00 6.0000000e+00 7.0000000e+00 6.0000000e+00 6.0000000e+00 2.0000000e+00 8.0000000e+00 6.0000000e+00 1.0000000e+01
8.0000000e+00 8.0000000e+00 1.1000000e+01 7.0000000e+00 1.2000000e+01 8.0000000e+00 8.0000000e+00 4.0000000e+00 4.0000000e+00 7.0000000e+00 6.0000000e+00 7.0000000e+00 1.2000000e+01 7.0000000e+00 8.0000000e+00 3.0000000e+00 5.0000000e+00 5.0000000e+00 5.0000000e+00 8.0000000e+00 3.0000000e+00 3.0000000e+00 8.0000000e+00 6.0000000e+00 1.2000000e+01 7.0000000e+00 6.0000000e+00 1.5000000e+01 0.0000000e+00 8.0000000e+00 7.0000000e+00 6.0000000e+00
5.0000000e+00 9.0000000e+00 6.0000000e+00 7.0000000e+00 6.0000000e+00 7.0000000e+00 5.0000000e+00 1.1000000e+01 1.0000000e+00 7.0000000e+00 9.0000000e+00 8.0000000e+00 9.0000000e+00 5.0000000e+00 2.0000000e+00 8.0000000e+00 4.0000000e+00 5.0000000e+00 6.0000000e+00 5.0000000e+00 6.0000000e+00 8.0000000e+00 7.0000000e+00 5.0000000e+00 5.0000000e+00 7.0000000e+00 6.0000000e+00 7.0000000e+00 5.0000000e+00 8.0000000e+00 9.0000000e+00 1.0000000e+01
1.0000000e+00 4.0000000e+00 1.0000000e+00 3.0000000e+00 1.0000000e+00 7.0000000e+00 7.0000000e+00 1.0000000e+00 7.0000000e+00 7.0000000e+00 6.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 2.0000000e+00 8.0000000e+00 2.0000000e+00 6.0000000e+00 3.0000000e+00 4.0000000e+00 3.0000000e+00 6.0000000e+00 6.0000000e+00 8.0000000e+00 5.0000000e+00 6.0000000e+00 7.0000000e+00 7.0000000e+00 2.0000000e+00 9.0000000e+00 6.0000000e+00 1.0000000e+01
6.0000000e+00 1.0000000e+01 6.0000000e+00 8.0000000e+00 4.0000000e+00 7.0000000e+00 7.0000000e+00 1.2000000e+01 2.0000000e+00 7.0000000e+00 9.0000000e+00 8.0000000e+00 9.0000000e+00 6.0000000e+00 0.0000000e+00 8.0000000e+00 4.0000000e+00 8.0000000e+00 6.0000000e+00 6.0000000e+00 6.0000000e+00 6.0000000e+00 7.0000000e+00 6.0000000e+00 4.0000000e+00 8.0000000e+00 6.0000000e+00 8.0000000e+00 5.0000000e+00 8.0000000e+00 6.0000000e+00 1.0000000e+01
5.0000000e+00 9.0000000e+00 4.0000000e+00 5.0000000e+00 2.0000000e+00 8.0000000e+00 8.0000000e+00 3.0000000e+00 6.0000000e+00 1.3000000e+01 4.0000000e+00 6.0000000e+00 1.0000000e+00 7.0000000e+00 4.0000000e+00 9.0000000e+00 3.0000000e+00 7.0000000e+00 4.0000000e+00 5.0000000e+00 3.0000000e+00 7.0000000e+00 7.0000000e+00 3.0000000e+00 1.1000000e+01 8.0000000e+00 6.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 7.0000000e+00 8.0000000e+00
4.0000000e+00 1.1000000e+01 5.0000000e+00 8.0000000e+00 3.0000000e+00 7.0000000e+00 1.4000000e+01 0.0000000e+00 5.0000000e+00 7.0000000e+00 1.0000000e+01 8.0000000e+00 0.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 3.0000000e+00 4.0000000e+00 4.0000000e+00 3.0000000e+00 2.0000000e+00 5.0000000e+00 1.2000000e+01 3.0000000e+00 3.0000000e+00 9.0000000e+00 1.1000000e+01 7.0000000e+00 2.0000000e+00 1.1000000e+01 1.0000000e+00 8.0000000e+00
3.0000000e+00 4.0000000e+00 5.0000000e+00 3.0000000e+00 3.0000000e+00 9.0000000e+00 6.0000000e+00 3.0000000e+00 4.0000000e+00 9.0000000e+00 5.0000000e+00 7.0000000e+00 6.0000000e+00 5.0000000e+00 1.0000000e+00 8.0000000e+00 2.0000000e+00 2.0000000e+00 3.0000000e+00 3.0000000e+00 1.0000000e+00 1.0000000e+01 6.0000000e+00 3.0000000e+00 6.0000000e+00 1.2000000e+01 4.0000000e+00 9.0000000e+00 0.0000000e+00 7.0000000e+00 1.0000000e+00 7.0000000e+00
2.0000000e+00 5.0000000e+00 4.0000000e+00 7.0000000e+00 1.0000000e+00 8.0000000e+00 1.4000000e+01 0.0000000e+00 6.0000000e+00 6.0000000e+00 1.1000000e+01 8.0000000e+00 0.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 5.0000000e+00 6.0000000e+00 6.0000000e+00 8.0000000e+00 3.0000000e+00 8.0000000e+00 7.0000000e+00 6.0000000e+00 9.0000000e+00 4.0000000e+00 6.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 9.0000000e+00 8.0000000e+00
1.0000000e+00 6.0000000e+00 0.0000000e+00 4.0000000e+00 0.0000000e+00 7.0000000e+00 7.0000000e+00 4.0000000e+00 4.0000000e+00 7.0000000e+00 6.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 1.0000000e+00 0.0000000e+00 2.0000000e+00 0.0000000e+00 0.0000000e+00 7.0000000e+00 6.0000000e+00 1.0000000e+01 4.0000000e+00 7.0000000e+00 1.2000000e+01 8.0000000e+00 2.0000000e+00 1.0000000e+01 0.0000000e+00 8.0000000e+00
5.0000000e+00 8.0000000e+00 6.0000000e+00 7.0000000e+00 6.0000000e+00 6.0000000e+00 9.0000000e+00 5.0000000e+00 7.0000000e+00 8.0000000e+00 8.0000000e+00 8.0000000e+00 4.0000000e+00 1.3000000e+01 9.0000000e+00 6.0000000e+00 3.0000000e+00 8.0000000e+00 4.0000000e+00 6.0000000e+00 2.0000000e+00 7.0000000e+00 7.0000000e+00 4.0000000e+00 1.4000000e+01 9.0000000e+00 6.0000000e+00 8.0000000e+00 0.0000000e+00 8.0000000e+00 8.0000000e+00 8.0000000e+00
4.0000000e+00 9.0000000e+00 4.0000000e+00 4.0000000e+00 2.0000000e+00 7.0000000e+00 1.0000000e+01 2.0000000e+00 5.0000000e+00 1.3000000e+01 5.0000000e+00 4.0000000e+00 1.0000000e+00 8.0000000e+00 5.0000000e+00 8.0000000e+00 3.0000000e+00 7.0000000e+00 4.0000000e+00 5.0000000e+00 3.0000000e+00 7.0000000e+00 8.0000000e+00 7.0000000e+00 5.0000000e+00 1.0000000e+01 8.0000000e+00 7.0000000e+00 3.0000000e+00 8.0000000e+00 3.0000000e+00 8.0000000e+00
6.0000000e+00 1.0000000e+01 6.0000000e+00 7.0000000e+00 5.0000000e+00 5.0000000e+00 1.1000000e+01 3.0000000e+00 7.0000000e+00 1.1000000e+01 1.0000000e+01 5.0000000e+00 2.0000000e+00 1.2000000e+01 2.0000000e+00 4.0000000e+00 5.0000000e+00 1.1000000e+01 4.0000000e+00 8.0000000e+00 4.0000000e+00 6.0000000e+00 1.1000000e+01 2.0000000e+00 3.0000000e+00 1.2000000e+01 6.0000000e+00 5.0000000e+00 2.0000000e+00 9.0000000e+00 8.0000000e+00 8.0000000e+00
3.0000000e+00 1.0000000e+00 3.0000000e+00 1.0000000e+00 1.0000000e+00 8.0000000e+00 6.0000000e+00 1.1000000e+01 0.0000000e+00 7.0000000e+00 9.0000000e+00 8.0000000e+00 7.0000000e+00 6.0000000e+00 0.0000000e+00 8.0000000e+00 6.0000000e+00 1.0000000e+01 6.0000000e+00 8.0000000e+00 4.0000000e+00 3.0000000e+00 9.0000000e+00 5.0000000e+00 6.0000000e+00 1.1000000e+01 1.1000000e+01 9.0000000e+00 3.0000000e+00 9.0000000e+00 1.0000000e+00 7.0000000e+00

Разница между файлами не показана из-за своего большого размера Загрузить разницу

@ -1,474 +0,0 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "mWA2s-HPT5L9"
},
"outputs": [],
"source": [
"10 % 3"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "8_zCzPa3T_VE"
},
"outputs": [],
"source": [
"from google.colab import drive\n",
"drive.mount('/content/drive')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "hBLeHBeiUOAy"
},
"outputs": [],
"source": [
"import os\n",
"os.chdir('/content/drive/MyDrive/Colab Notebooks/is_lab2')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "dREn2NGEUfIy"
},
"outputs": [],
"source": [
"!wget -N http://uit.mpei.ru/git/main/is_dnn/raw/branch/main/labworks/LW2/lab02_lib.py"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "FVyzYbb6Up8S"
},
"outputs": [],
"source": [
"!wget -N http://uit.mpei.ru/git/main/is_dnn/raw/branch/main/labworks/LW2/data/letter_train.txt\n",
"!wget -N http://uit.mpei.ru/git/main/is_dnn/raw/branch/main/labworks/LW2/data/letter_test.txt\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "QGPmkl3FU2Et"
},
"outputs": [],
"source": [
"# импорт модулей\n",
"import numpy as np\n",
"import lab02_lib as lib\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Hlmf3aY4dbg6"
},
"source": [
"2. Сгенерировать индивидуальный набор двумерных данных в пространстве\n",
"признаков с координатами центра (k, k), где k – номер бригады. Вывести\n",
"полученные данные на рисунок и в консоль.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "r7gSmNgWdXo2"
},
"outputs": [],
"source": [
"k = 10\n",
"data = lib.datagen(k, k, 1000, 2)\n",
"print('Размерность данных:', data.shape)\n",
"print('Пример данных:', data)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Na7tT2TReMcu"
},
"source": [
"3-4. Создать и обучить автокодировщик AE1 простой архитектуры, выбрав\n",
"небольшое количество эпох обучения. Зафиксировать в таблице вида\n",
"табл.1 количество скрытых слоёв и нейронов в них.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "emmU0JGJeOVD"
},
"outputs": [],
"source": [
"# AE1 — простая сеть, меньше эпох\n",
"patience = 300\n",
"ae1_trained, IRE1, IREth1 = lib.create_fit_save_ae(\n",
" data, 'out/AE1.h5', 'out/AE1_ire_th.txt',\n",
" 1000, False, patience, verbose_every_n_epochs = 100, early_stopping_delta = 0.001\n",
")\n",
"lib.ire_plot('training', IRE1, IREth1, 'AE1')\n",
"print('AE1 IREth =', IREth1)\n",
"\n",
"#1\n",
"#1"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "1Pu38Xylsvjr"
},
"source": [
"5-6. Создать и обучить второй автокодировщик AE2 с усложненной\n",
"архитектурой, задав большее количество эпох обучения.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "CToPhfVgs4Ya"
},
"outputs": [],
"source": [
"# AE2 — более сложная сеть, больше эпох\n",
"ae2_trained, IRE2, IREth2 = lib.create_fit_save_ae(\n",
" data, 'out/AE2.h5', 'out/AE2_ire_th.txt',\n",
" 3000, False, patience, verbose_every_n_epochs = 500, early_stopping_delta = 0.001\n",
")\n",
"lib.ire_plot('training', IRE2, IREth2, 'AE2')\n",
"print('AE2 IREth =', IREth2)\n",
"\n",
"# 5 3 2 3 5"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "aiMYnnw5ybt2"
},
"source": [
"8. Рассчитать характеристики качества обучения EDCA для AE1 и AE2.\n",
"Визуализировать и сравнить области пространства признаков,\n",
"распознаваемые автокодировщиками AE1 и AE2. Сделать вывод о\n",
"пригодности AE1 и AE2 для качественного обнаружения аномалий."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "N6F98jegybGj"
},
"outputs": [],
"source": [
"#AE1\n",
"numb_square = 20\n",
"xx, yy, Z1 = lib.square_calc(numb_square, data, ae1_trained, IREth1, '1', True)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "Rc5-WXjC9rAk"
},
"outputs": [],
"source": [
"#AE2\n",
"numb_square = 20\n",
"xx, yy, Z2 = lib.square_calc(numb_square, data, ae2_trained, IREth2, '2', True)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "id6lkBOi9y1v"
},
"outputs": [],
"source": [
"#Сравнение\n",
"lib.plot2in1(data, xx, yy, Z1, Z2)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "NZRB1Vg1y0ta"
},
"source": [
"9. Изучить сохраненный набор данных и пространство признаков. Создать\n",
"тестовую выборку, состоящую, как минимум, из 4ёх элементов, не\n",
"входящих в обучающую выборку. Элементы должны быть такими, чтобы\n",
"AE1 распознавал их как норму, а AE2 детектировал как аномалии."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "on7YZMauy4ZS"
},
"outputs": [],
"source": [
"with open('data_test.txt', 'w') as file:\n",
" file.write(\"10.5 9.5\\n\")\n",
" file.write(\"9.0 10.2\\n\")\n",
" file.write(\"9.6 10.5\\n\")\n",
" file.write(\"9.0 9.0\\n\")\n",
"data_test = np.loadtxt('data_test.txt', dtype=float)\n",
"print(data_test)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "8FuMOxLu_wVZ"
},
"outputs": [],
"source": [
"data_test = np.loadtxt('data_test.txt', dtype=float)\n",
"print(data_test)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "cib_DiqazAWM"
},
"source": [
"10. Применить обученные автокодировщики AE1 и AE2 к тестовым данным\n",
"и вывести значения ошибки реконструкции для каждого элемента тестовой\n",
"выборки относительно порога на график и в консоль."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "IprWT-m4zDR1"
},
"outputs": [],
"source": [
"# AE1\n",
"predicted_labels1, ire1 = lib.predict_ae(ae1_trained, data_test, IREth1)\n",
"lib.anomaly_detection_ae(predicted_labels1, ire1, IREth1)\n",
"lib.ire_plot('test', ire1, IREth1, 'AE1')\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "3jD3wEhr5f6t"
},
"outputs": [],
"source": [
"# AE2\n",
"predicted_labels2, ire2 = lib.predict_ae(ae2_trained, data_test, IREth2)\n",
"lib.anomaly_detection_ae(predicted_labels2, ire2, IREth2)\n",
"lib.ire_plot('test', ire2, IREth2, 'AE2')"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "67myAxUazRQ1"
},
"source": [
"11. Визуализировать элементы обучающей и тестовой выборки в областях\n",
"пространства признаков, распознаваемых автокодировщиками AE1 и AE2."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "jzFhJTrNzS4A"
},
"outputs": [],
"source": [
"lib.plot2in1_anomaly(data, xx, yy, Z1, Z2, data_test)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "hpP0MebIzZFi"
},
"source": [
"12-13 таблицы и выводы\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "RF2lQ2NMzdIZ"
},
"source": [
"Часть 2\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "R_YSpxv0zj0W"
},
"source": [
"2. Загрузить многомерную обучающую выборку реальных данных\n",
"name_train.txt."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "XRZI769HzjMQ"
},
"outputs": [],
"source": [
"train = np.loadtxt('letter_train.txt', dtype=float)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "sDimn5kIzvff"
},
"source": [
"3. Вывести полученные данные и их размерность в консоли."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "dbb7jXUjzzNT"
},
"outputs": [],
"source": [
"print('train.shape =', train.shape)\n",
"print('Пример train:', train)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "cCoweu23z4sx"
},
"source": [
"4-6. Создать и обучить автокодировщик с подходящей для данных\n",
"архитектурой. Выбрать необходимое количество эпох обучения"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "mqiCTs1H0HL5"
},
"outputs": [],
"source": [
"patience = 5000\n",
"ae3_trained, IRE3, IREth3 = lib.create_fit_save_ae(\n",
" train, 'out/AE3.h5', 'out/AE3_ire_th.txt',\n",
" 100000, False, patience, verbose_every_n_epochs = 1000, early_stopping_delta = 0.001, early_stopping_value = 0.01\n",
")\n",
"\n",
"\n",
"# 32 16 12 8 7 8 12 16 32\n",
"\n",
"# 30 24 19 15 11 15 19 24 30\n",
"\n",
"# 28 21 16 12 9 12 16 21 28\n",
"# 32 26 22 18 15 12 15 18 22 26 32\n",
"# 35 28 21 14 7 14 21 28 35"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "S-bT1nnDckWS"
},
"outputs": [],
"source": [
"lib.ire_plot('training', IRE3, IREth3, 'AE3')\n",
"print('AE3 IREth =', IREth3)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "HUoWlB7T4lPH"
},
"source": [
"8. Подать тестовую выборку на вход обученного автокодировщика для\n",
"обнаружения аномалий. Вывести график ошибки реконструкции\n",
"элементов тестовой выборки относительно порога."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "m9o31pOLG5IR"
},
"outputs": [],
"source": [
"test = np.loadtxt('letter_test.txt', dtype=float)\n",
"print('test.shape =', test.shape)\n",
"print('Пример train:', test)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "gyGWxfCt4jT5"
},
"outputs": [],
"source": [
"predicted_labels3, ire3 = lib.predict_ae(ae3_trained, test, IREth3)\n",
"lib.anomaly_detection_ae(predicted_labels3, ire3, IREth3)\n",
"lib.ire_plot('test', ire3, IREth3, 'AE3')"
]
}
],
"metadata": {
"accelerator": "GPU",
"colab": {
"authorship_tag": "ABX9TyP7I3xYtv8vwrxTVttwH659",
"gpuType": "T4",
"provenance": []
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
},
"language_info": {
"name": "python"
}
},
"nbformat": 4,
"nbformat_minor": 0
}

Двоичные данные
labworks/LW2/out/AE1.h5

Двоичный файл не отображается.

Двоичные данные
labworks/LW2/out/AE1_AE2_train_def.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 21 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 23 KiB

Двоичные данные
labworks/LW2/out/AE1_train_def.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 37 KiB

Двоичные данные
labworks/LW2/out/AE2.h5

Двоичный файл не отображается.

Двоичные данные
labworks/LW2/out/AE2_train_def.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 34 KiB

Двоичные данные
labworks/LW2/out/AE3.h5

Двоичный файл не отображается.

Двоичные данные
labworks/LW2/out/IRE_testAE1.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 31 KiB

Двоичные данные
labworks/LW2/out/IRE_testAE2.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 42 KiB

Двоичные данные
labworks/LW2/out/IRE_testAE3.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 73 KiB

Двоичные данные
labworks/LW2/out/IRE_trainingAE1.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 45 KiB

Двоичные данные
labworks/LW2/out/IRE_trainingAE2.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 111 KiB

Двоичные данные
labworks/LW2/out/IRE_trainingAE3.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 92 KiB

Двоичные данные
labworks/LW2/out/XtXd_1.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 96 KiB

Двоичные данные
labworks/LW2/out/XtXd_1_metrics.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 107 KiB

Двоичные данные
labworks/LW2/out/XtXd_2.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 69 KiB

Двоичные данные
labworks/LW2/out/XtXd_2_metrics.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 82 KiB

@ -1,5 +0,0 @@
------------Оценка качества AE2 С ПОМОЩЬЮ НОВЫХ МЕТРИК------------
Approx = 0.36
Excess = 1.7777777777777777
Deficit = 0.0
Coating = 1.0

Двоичные данные
labworks/LW2/out/train_set.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 46 KiB

@ -1,471 +0,0 @@
# Отчёт по лабораторной работе №2
**Кобзев Александр, Кирсанов Егор — А-01-22**
## 1.1. В среде Google Colab создали новый блокнот (notebook). Импортировали необходимые для работы библиотеки и модули.
```python
from google.colab import drive
drive.mount('/content/drive')
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks/is_lab2')
```
```
!wget -N http://uit.mpei.ru/git/main/is_dnn/raw/branch/main/labworks/LW2/lab02_lib.py
!wget -N http://uit.mpei.ru/git/main/is_dnn/raw/branch/main/labworks/LW2/data/letter_train.txt
!wget -N http://uit.mpei.ru/git/main/is_dnn/raw/branch/main/labworks/LW2/data/letter_test.txt
```
``` python
# импорт модулей
import numpy as np
import lab02_lib as lib
```
---
## 1.2. Сгенерировали индивидуальный набор двумерных данных в пространстве признаков с координатами центра (k, k), где k=10 – номер бригады. Вывели полученные данные на рисунок и в консоль:
```python
k = 10
data = lib.datagen(k, k, 1000, 2)
print('Размерность данных:', data.shape)
print('Пример данных:', data)
```
![Данные](images_for_report/1.png)
```
Размерность данных: (1000, 2)
Пример данных: [[ 9.91598657 9.75579359]
[ 9.97948747 9.98708802]
[ 9.99042489 10.01396366]
...
[ 9.97013826 9.93047258]
[10.00891654 9.94318369]
[10.04614761 9.91592173]]
```
---
## 1.3. Создали и обучили автокодировщик AE1 простой архитектуры, выбрав небольшое количество эпох обучения.
```python
patience = 300
ae1_trained, IRE1, IREth1 = lib.create_fit_save_ae(
data, 'out/AE1.h5', 'out/AE1_ire_th.txt',
1000, False, patience, verbose_every_n_epochs = 100, early_stopping_delta = 0.001
)
```
---
## 1.4. Зафиксировали ошибку MSE, на которой обучение завершилось. Построили график ошибки реконструкции обучающей выборки. Зафиксировали порог ошибки реконструкции – порог обнаружения аномалий.
MSE = 56.8932
```python
lib.ire_plot('training', IRE1, IREth1, 'AE1')
print('AE1 IREth =', IREth1)
```
![График ошибки реконструкции обучающей выборки](images_for_report/2.png)
```
Порог ошибки реконструкции:
AE1 IREth = 10.98
```
---
## 1.5. Создали и обучили второй автокодировщик AE2 с усложненной архитектурой, задав большее количество эпох обучения.
```python
ae2_trained, IRE2, IREth2 = lib.create_fit_save_ae(
data, 'out/AE2.h5', 'out/AE2_ire_th.txt',
3000, False, patience, verbose_every_n_epochs = 500, early_stopping_delta = 0.001
)
```
---
## 1.6. Зафиксировали ошибку MSE, на которой обучение завершилось. Построили график ошибки реконструкции обучающей выборки. Зафиксировали порог ошибки реконструкции – порог обнаружения аномалий.
MSE = 0.0225
```python
lib.ire_plot('training', IRE2, IREth2, 'AE2')
print('AE2 IREth =', IREth2)
```
![График ошибки реконструкции обучающей выборки](images_for_report/3.png)
```
Порог ошибки реконструкции:
AE2 IREth = 0.55
```
---
## 1.7. Рассчитали характеристики качества обучения EDCA для AE1 и AE2. Визуализировали и сравнить области пространства признаков, распознаваемые автокодировщиками AE1 и AE2. Сделать вывод о пригодности AE1 и AE2 для качественного обнаружения аномалий.
```python
# AE1
numb_square = 20
xx, yy, Z1 = lib.square_calc(numb_square, data, ae1_trained, IREth1, '1', True)
```
![Грфик](images_for_report/4.png)
```
amount: 18
amount_ae: 293
```
![Грфик](images_for_report/5.png)
![Грфик](images_for_report/6.png)
```
Оценка качества AE1
IDEAL = 0. Excess: 15.277777777777779
IDEAL = 0. Deficit: 0.0
IDEAL = 1. Coating: 1.0
summa: 1.0
IDEAL = 1. Extrapolation precision (Approx): 0.06143344709897611
```
```python
# AE2
numb_square = 20
xx, yy, Z2 = lib.square_calc(numb_square, data, ae2_trained, IREth2, '2', True)
```
![Грфик](images_for_report/7.png)
```
amount: 18
amount_ae: 50
```
![Грфик](images_for_report/8.png)
![Грфик](images_for_report/9.png)
```
Оценка качества AE2
IDEAL = 0. Excess: 1.7777777777777777
IDEAL = 0. Deficit: 0.0
IDEAL = 1. Coating: 1.0
summa: 1.0
IDEAL = 1. Extrapolation precision (Approx): 0.36
```
```python
# Сравнение
lib.plot2in1(data, xx, yy, Z1, Z2)
```
![Грфик](images_for_report/10.png)
---
## 1.8. Если автокодировщик AE2 недостаточно точно аппроксимирует область обучающих данных, то подобрать подходящие параметры автокодировщика и повторить шаги (6) – (8).
Немного изменили параметры автокодировщика AE2 для более качесвенной аппроксимации(использовались выше)
---
## 1.9. Изучили сохраненный набор данных и пространство признаков. Создали тестовую выборку, состоящую, как минимум, из 4ёх элементов, не входящих в обучающую выборку. Элементы должны быть такими, чтобы AE1 распознавал их как норму, а AE2 детектировал как аномалии.
```python
with open('data_test.txt', 'w') as file:
file.write("10.5 9.5\n")
file.write("9.0 10.2\n")
file.write("9.6 10.5\n")
file.write("9.0 9.0\n")
data_test = np.loadtxt('data_test.txt', dtype=float)
print(data_test)
```
```
[[10.5 9.5]
[ 9. 10.2]
[ 9.6 10.5]
[ 9. 9. ]]
```
---
## 1.10. Применили обученные автокодировщики AE1 и AE2 к тестовым данным и вывели значения ошибки реконструкции для каждого элемента тестовой выборки относительно порога на график и в консоль.
```python
# AE1
predicted_labels1, ire1 = lib.predict_ae(ae1_trained, data_test, IREth1)
lib.anomaly_detection_ae(predicted_labels1, ire1, IREth1)
lib.ire_plot('test', ire1, IREth1, 'AE1')
```
```
Аномалий не обнаружено
```
![Грфик](images_for_report/11.png)
```python
# AE2
predicted_labels2, ire2 = lib.predict_ae(ae2_trained, data_test, IREth2)
lib.anomaly_detection_ae(predicted_labels2, ire2, IREth2)
lib.ire_plot('test', ire2, IREth2, 'AE2')
```
```
i Labels IRE IREth
0 [1.] [0.62] 0.55
1 [1.] [1.05] 0.55
2 [1.] [0.77] 0.55
3 [1.] [1.29] 0.55
Обнаружено 4.0 аномалий
```
![Грфик](images_for_report/12.png)
---
## 1.11. Визуализирывали элементы обучающей и тестовой выборки в областях пространства признаков, распознаваемых автокодировщиками AE1 и AE2.
```python
lib.plot2in1_anomaly(data, xx, yy, Z1, Z2, data_test)
```
![Грфик](images_for_report/13.png)
---
## 1.12. Результаты исследования занесли в таблицу:
<table>
<thead>
<tr>
<th> </th>
<th>Количество скрытых слоёв</th>
<th>Количество нейронов в скрытых слоях</th>
<th>Количество эпох обучения</th>
<th>Ошибка MSE_stop</th>
<th>Порог ошибки реконструкции</th>
<th>Значение показателя Excess</th>
<th>Значение показателя Approx</th>
<th>Количество обнаруженных аномалий</th>
</tr>
</thead>
<tbody>
<tr>
<td>АЕ1</td>
<td align="center">1</td>
<td align="center">1</td>
<td align="center">1000</td>
<td align="center">56.89</td>
<td align="center">10.98</td>
<td align="center">15.28</td>
<td align="center">0.06</td>
<td align="center">0</td>
</tr>
<tr>
<td>АЕ2</td>
<td align="center">5</td>
<td align="center">5 3 2 3 5</td>
<td align="center">3000</td>
<td align="center">0.02</td>
<td align="center">0.55</td>
<td align="center">1.78</td>
<td align="center">0.36</td>
<td align="center">4</td>
</tr>
</tbody>
</table>
---
## 1.13. Сделали выводы о требованиях к:
- данным для обучения,
- архитектуре автокодировщика,
- количеству эпох обучения,
- ошибке MSE_stop, приемлемой для останова обучения,
- ошибке реконструкции обучающей выборки (порогу обнаружения аномалий),
- характеристикам качества обучения EDCA одноклассового классификатора
для качественного обнаружения аномалий в данных.
- Данные для обучения: должны содержать только нормальные примеры без выбросов и полно описывать область нормы.
- Архитектура автокодировщика: симметричная, с узким «бутылочным горлышком»
- Количество эпох: достаточно большое, чтобы сеть обучилась, но без переобучения, в для нашего набора оптимально окло 3000.
- Ошибка MSE_stop: должна быть небольшой, но не меньше 0.01 , дабы избежать переобучение.
- Порог ошибки реконструкции: выбирается по максимуму IRE обучающей выборки; высокий порог → пропуски аномалий.
- Характеристики EDCA: хорошая модель имеет низкий Excess, высокий Approx ≈ 1; такие модели точнее очерчивают область нормы и лучше детектируют аномалии.
---
## 2.1. Изучили описание своего набора реальных данных
Набор Letter Recognition предназначен для распознавания букв английского алфавита по 16 числовым признакам, описывающим изображение буквы.
Для задачи обнаружения аномалий из исходных данных выделены три буквы, формирующие нормальный класс, а для аномалий — случайные буквы, не входящие в нормальный класс.
Чтобы усложнить задачу, данные объединены попарно, в результате чего размерность увеличена до 32 признаков. Таким образом, каждый аномальный пример частично содержит признаки нормального класса, что делает задачу более сложной для автокодировщика.
| Количество признаков | Количество примеров | Количество нормальных примеров | Количество аномальных примеров |
| ----- | ----- | ------ | ----- |
| **32** | **1600** | **1500** | **100** |
---
## 2.2. Загрузили многомерную обучающую выборку реальных данных name_train.txt.
```python
train = np.loadtxt('letter_train.txt', dtype=float)
```
---
## 2.3. Вывели полученные данные и их размерность в консоли.
```python
print('train.shape =', train.shape)
print('Пример train:', train)
```
```
train.shape = (1500, 32)
Пример train: [[ 6. 10. 5. ... 10. 2. 7.]
[ 0. 6. 0. ... 8. 1. 7.]
[ 4. 7. 5. ... 8. 2. 8.]
...
[ 7. 10. 10. ... 8. 5. 6.]
[ 7. 7. 10. ... 6. 0. 8.]
[ 3. 4. 5. ... 9. 5. 5.]]
```
---
## 2.4. Cоздали и обучили автокодировщик с подходящей для данных архитектурой.
```python
patience = 5000
ae3_trained, IRE3, IREth3 = lib.create_fit_save_ae(
train, 'out/AE3.h5', 'out/AE3_ire_th.txt',
100000, False, patience, verbose_every_n_epochs = 5000, early_stopping_delta = 0.001
)
```
---
## 2.5. Зафиксирывали ошибку MSE, на которой обучение завершилось. Построили график ошибки реконструкции обучающей выборки. Зафиксирывали порог ошибки реконструкции – порог обнаружения аномалий.
MSE = 0.4862
```python
lib.ire_plot('training', IRE3, IREth3, 'AE3')
print('AE3 IREth =', IREth3)
```
![Грфик](images_for_report/14.png)
```
Порог ошибки реконструкции:
AE3 IREth = 10.75
```
---
## 2.6. Сделать вывод о пригодности обученного автокодировщика для качественного обнаружения аномалий. Если порог ошибки реконструкции слишком велик, то подобрать подходящие параметры автокодировщика и повторить шаги (4) – (6).
### Очент высокий порог, так что попробуем другю структуру:
MSE = 0.3363
```python
lib.ire_plot('training', IRE3, IREth3, 'AE3')
print('AE3 IREth =', IREth3)
```
![Грфик](images_for_report/15.png)
```
Порог ошибки реконструкции:
AE3 IREth = 6.75
```
Отсановимся на этой модели
---
## 2.7. Изучили и загрузили тестовую выборку letter_test.txt.
```python
test = np.loadtxt('letter_test.txt', dtype=float)
print('test.shape =', test.shape)
print('Пример train:', test)
```
```
test.shape = (100, 32)
Пример train: [[ 8. 11. 8. ... 7. 4. 9.]
[ 4. 5. 4. ... 13. 8. 8.]
[ 3. 3. 5. ... 8. 3. 8.]
...
[ 4. 9. 4. ... 8. 3. 8.]
[ 6. 10. 6. ... 9. 8. 8.]
[ 3. 1. 3. ... 9. 1. 7.]]
```
---
## 2.8. Подали тестовую выборку на вход обученного автокодировщика для обнаружения аномалий. Вывели график ошибки реконструкции элементов тестовой выборки относительно порога.
```python
predicted_labels3_v1, ire3_v1 = lib.predict_ae(ae3_v1_trained, test, IREth3_v1)
lib.ire_plot('test', ire3_v1, IREth3_v1, 'AE3_v1')
```
```
i Labels IRE IREth
0 [1.] [9.78] 6.75
1 [1.] [8.92] 6.75
2 [1.] [14.27] 6.75
...
99 [1.] [15.66] 6.75
Обнаружено 91.0 аномалий
```
![Грфик](images_for_report/16.png)
---
## 2.9. Если результаты обнаружения аномалий не удовлетворительные (обнаружено менее 70% аномалий), то подобрать подходящие параметры автокодировщика и повторить шаги (4) – (9).
Результаты приемлемы
---
## 2.10. Параметры наилучшего автокодировщика и результаты обнаружения аномалий занести в таблицу:
| Dataset name | Кол-во скрытых слоёв | Кол-во нейронов в скрытых слоях | Кол-во эпох обучения | Ошибка MSE_stop | Порог ошибки реконструкции |% обнаруженных аномалий |
| --- | --- | --- | --- | --- | --- | --- |
| Letter | 9 | 35 28 21 14 7 14 21 28 35 | 100000 | 0.3363 | 6.75 | 91% |
---
## 2.11. Сделать выводы о требованиях к:
- данным для обучения,
- архитектуре автокодировщика,
- количеству эпох обучения,
- ошибке MSE_stop, приемлемой для останова обучения,
- ошибке реконструкции обучающей выборки (порогу обнаруженияаномалий)
для качественного обнаружения аномалий в случае, когда размерность
пространства признаков высока.
- Данные для обучения: должны содержать только нормальные объекты(отсутсвие аномалий).
- Архитектура автокодировщика: симметричная, 9 скрытых слоёв с наличием бутылочного горлышка
- Количество эпох: около 100 000 достаточно для стабилизации ошибки и точного восстановления данных.
- Ошибка MSE_stop: практика показала, что 0.34 — приемлемое значение для высокоразмерного набора Letter.
- Качество обнаружения: 91 % аномалий — модель адекватно аппроксимирует область нормы и надёжно выделяет отклонения.

Двоичные данные
labworks/LW3/IS_lab_4.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 3.9 KiB

Двоичные данные
labworks/LW3/IS_lab_4_90.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 3.9 KiB

Двоичные данные
labworks/LW3/IS_lab_7.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 854 B

Двоичные данные
labworks/LW3/IS_lab_7_90.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 883 B

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Двоичные данные
labworks/LW3/best_model_100.keras

Двоичный файл не отображается.

Двоичные данные
labworks/LW3/images_for_report/1.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 7.1 KiB

Двоичные данные
labworks/LW3/images_for_report/2.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 7.0 KiB

Двоичные данные
labworks/LW3/images_for_report/3.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 31 KiB

Двоичные данные
labworks/LW3/images_for_report/4.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 6.5 KiB

Двоичные данные
labworks/LW3/images_for_report/5.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 6.6 KiB

Двоичные данные
labworks/LW3/images_for_report/6.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 121 KiB

Двоичные данные
labworks/LW3/images_for_report/7.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 10 KiB

Двоичные данные
labworks/LW3/images_for_report/8.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 12 KiB

Двоичные данные
labworks/LW3/images_for_report/9.png

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 54 KiB

@ -1,611 +0,0 @@
# Отчёт по лабораторной работе №3
**Кобзев Александр, Кирсанов Егор — А-01-22**
## 1.1. В среде Google Colab создали новый блокнот (notebook). Импортировали необходимые для работы библиотеки и модули.
```python
from google.colab import drive
drive.mount('/content/drive')
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks/is_lab3')
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.models import Sequential
import matplotlib.pyplot as plt
import numpy as np
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.metrics import ConfusionMatrixDisplay
```
---
## 1.2. Загрузили набор данных MNIST, содержащий размеченные изображения рукописных цифр.
```python
from keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()
```
---
## 1.3. Разбили набор данных на обучающие и тестовые данные в соотношении 60 000:10 000 элементов. При разбиении параметр random_state выбрали равным (4k – 1)=39, где k=10 –номер бригады. Вывели размерности полученных обучающих и тестовых массивов данных.
```python
from sklearn.model_selection import train_test_split
X = np.concatenate((X_train, X_test))
y = np.concatenate((y_train, y_test))
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size = 10000,
train_size = 60000,
random_state = 39)
# вывод размерностей
print('Shape of X train:', X_train.shape)
print('Shape of y train:', y_train.shape)
print('Shape of X test:', X_test.shape)
print('Shape of y test:', y_test.shape)
```
```
Shape of X train: (60000, 28, 28)
Shape of y train: (60000,)
Shape of X test: (10000, 28, 28)
Shape of y test: (10000,)
```
---
## 1.4. Провели предобработку данных: привели обучающие и тестовые данные к формату, пригодному для обучения сверточной нейронной сети. Входные данные принимают значения от 0 до 1, метки цифр закодированы по принципу «one-hot encoding». Вывели размерности предобработанных обучающих и тестовых массивов данных.
```python
# Зададим параметры данных и модели
num_classes = 10
input_shape = (28, 28, 1)
# Приведение входных данных к диапазону [0, 1]
X_train = X_train / 255
X_test = X_test / 255
# Расширяем размерность входных данных, чтобы каждое изображение имело размерность (высота, ширина, количество каналов)
X_train = np.expand_dims(X_train, -1)
X_test = np.expand_dims(X_test, -1)
print('Shape of transformed X train:', X_train.shape)
print('Shape of transformed X test:', X_test.shape)
# переведем метки в one-hot
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)
print('Shape of transformed y train:', y_train.shape)
print('Shape of transformed y test:', y_test.shape)
```
```
Shape of transformed X train: (60000, 28, 28, 1)
Shape of transformed X test: (10000, 28, 28, 1)
Shape of transformed y train: (60000, 10)
Shape of transformed y test: (10000, 10)
```
---
## 1.5. Реализовали модель сверточной нейронной сети и обучили ее на обучающих данных с выделением части обучающих данных в качестве валидационных. Вывели информацию об архитектуре нейронной сети.
```python
# создаем модель
model = Sequential()
model.add(layers.Conv2D(32, kernel_size=(3, 3), activation="relu", input_shape=input_shape))
model.add(layers.MaxPooling2D(pool_size=(2, 2)))
model.add(layers.Conv2D(64, kernel_size=(3, 3), activation="relu"))
model.add(layers.MaxPooling2D(pool_size=(2, 2)))
model.add(layers.Dropout(0.5))
model.add(layers.Flatten())
model.add(layers.Dense(num_classes, activation="softmax"))
model.summary()
```
```
Model: "sequential_2"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type) ┃ Output Shape ┃ Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_4 (Conv2D) │ (None, 26, 26, 32) │ 320 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_4 (MaxPooling2D) │ (None, 13, 13, 32) │ 0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_5 (Conv2D) │ (None, 11, 11, 64) │ 18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_5 (MaxPooling2D) │ (None, 5, 5, 64) │ 0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_2 (Dropout) │ (None, 5, 5, 64) │ 0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_2 (Flatten) │ (None, 1600) │ 0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_2 (Dense) │ (None, 10) │ 16,010 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
Total params: 34,826 (136.04 KB)
Trainable params: 34,826 (136.04 KB)
Non-trainable params: 0 (0.00 B)
```
```python
# компилируем и обучаем модель
batch_size = 512
epochs = 15
model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, validation_split=0.1)
```
---
## 1.6. Оценили качество обучения на тестовых данных. Вывели значение функции ошибки и значение метрики качества классификации на тестовых данных.
```python
# Оценка качества работы модели на тестовых данных
scores = model.evaluate(X_test, y_test)
print('Loss on test data:', scores[0])
print('Accuracy on test data:', scores[1])
```
```
313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 3ms/step - accuracy: 0.9883 - loss: 0.0410
Loss on test data: 0.04110224172472954
Accuracy on test data: 0.988099992275238
```
---
## 1.7. Подали на вход обученной модели два тестовых изображения. Вывели изображения, истинные метки и результаты распознавания.
```python
for n in [123,321]:
result = model.predict(X_test[n:n+1])
print('NN output:', result)
plt.imshow(X_test[n].reshape(28,28), cmap=plt.get_cmap('gray'))
plt.show()
print('Real mark: ', np.argmax(y_test[n]))
print('NN answer: ', np.argmax(result))
```
![image](images_for_report/1.png)
```
Real mark: 6
NN answer: 6
```
![image](images_for_report/2.png)
```
Real mark: 4
NN answer: 4
```
---
## 1.8. Вывели отчет о качестве классификации тестовой выборки и матрицу ошибок для тестовой выборки.
```python
# истинные метки классов
true_labels = np.argmax(y_test, axis=1)
# предсказанные метки классов
predicted_labels = np.argmax(model.predict(X_test), axis=1)
# отчет о качестве классификации
print(classification_report(true_labels, predicted_labels))
# вычисление матрицы ошибок
conf_matrix = confusion_matrix(true_labels, predicted_labels)
# отрисовка матрицы ошибок в виде "тепловой карты"
display = ConfusionMatrixDisplay(confusion_matrix=conf_matrix)
display.plot()
plt.show()
```
```
313/313 ━━━━━━━━━━━━━━━━━━━━ 1s 2ms/step
precision recall f1-score support
0 0.99 0.99 0.99 990
1 0.99 0.99 0.99 1155
2 0.99 0.99 0.99 1025
3 0.99 0.99 0.99 1016
4 0.99 0.99 0.99 959
5 0.99 0.99 0.99 889
6 0.99 0.99 0.99 997
7 0.99 0.98 0.98 1034
8 0.99 0.98 0.98 991
9 0.99 0.98 0.98 944
accuracy 0.99 10000
macro avg 0.99 0.99 0.99 10000
weighted avg 0.99 0.99 0.99 10000
```
![image](images_for_report/3.png)
---
## 1.9. Загрузили, предобработали и подали на вход обученной нейронной сети собственное изображение, созданное при выполнении лабораторной работы №1. Вывели изображение и результат распознавания.
```python
# загрузка собственного изображения
from PIL import Image
file_data = Image.open('/content/drive/MyDrive/Colab Notebooks/IS_lab_4.png')
file_data = file_data.convert('L') # перевод в градации серого
test_img = np.array(file_data)
# вывод собственного изображения
plt.imshow(test_img, cmap=plt.get_cmap('gray'))
plt.show()
# предобработка
test_img = test_img / 255
test_img = np.reshape(test_img, (1,28,28,1))
# распознавание
result = model.predict(test_img)
print('I think it\'s ', np.argmax(result))
```
![image](images_for_report/4.png)
```
I think it's 4
```
```python
from PIL import Image
file_data = Image.open('/content/drive/MyDrive/Colab Notebooks/IS_lab_7.png')
file_data = file_data.convert('L') # перевод в градации серого
test_img = np.array(file_data)
# вывод собственного изображения
plt.imshow(test_img, cmap=plt.get_cmap('gray'))
plt.show()
# предобработка
test_img = test_img / 255
test_img = np.reshape(test_img, (1,28,28,1))
# распознавание
result = model.predict(test_img)
print('I think it\'s ', np.argmax(result))
```
![image](images_for_report/5.png)
```
I think it's 7
```
---
## 1.10. Загрузили с диска модель, сохраненную при выполнении лабораторной работы №1. Вывели информацию об архитектуре модели. Повторили для этой модели п. 6.
```python
model_lr1 = keras.models.load_model("/content/drive/MyDrive/Colab Notebooks/best_model_100.keras")
model_lr1.summary()
```
```
Model: "sequential_16"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type) ┃ Output Shape ┃ Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ dense_26 (Dense) │ (None, 100) │ 78,500 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_27 (Dense) │ (None, 10) │ 1,010 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
Total params: 79,512 (310.60 KB)
Trainable params: 79,510 (310.59 KB)
Non-trainable params: 0 (0.00 B)
Optimizer params: 2 (12.00 B)
```
```python
X_train_flat = X.reshape(70000, 28*28)
X_train_flat = X_train_flat / 255.0
X_train_flat, X_test_flat, y_train_flat, y_test_flat = train_test_split(
X_train_flat, y, test_size=10000, train_size=60000, random_state=39
)
y_train_flat = keras.utils.to_categorical(y_train_flat, num_classes)
y_test_flat = keras.utils.to_categorical(y_test_flat, num_classes)
print('Shape of transformed X train:', X_train_flat.shape)
print('Shape of transformed X test:', X_test_flat.shape)
print('Shape of transformed y train:', y_train_flat.shape)
print('Shape of transformed y test:', y_test_flat.shape)
```
```
Shape of transformed X train: (60000, 784)
Shape of transformed X test: (10000, 784)
Shape of transformed y train: (60000, 10)
Shape of transformed y test: (10000, 10)
```
```python
scores = model_lr1.evaluate(X_test_flat, y_test_flat)
print('Loss on test data:', scores[0])
print('Accuracy on test data:', scores[1])
```
```
313/313 ━━━━━━━━━━━━━━━━━━━━ 2s 5ms/step - accuracy: 0.9153 - loss: 0.3012
Loss on test data: 0.2998492121696472
Accuracy on test data: 0.9138000011444092
```
---
## 1.11. Сравнить обученную модель сверточной сети и наилучшую модель полносвязной сети из лабораторной работы №1 по следующим показателям:
- количество настраиваемых параметров в сети
- количество эпох обучения
- качество классификации тестовой выборки.
| Модель | Количество настраиваемых параметров | Количество эпох обучения | Качество классификации тестовой выборки |
|----------|-------------------------------------|---------------------------|-----------------------------------------|
| Сверточная | 34 826 | 15 | accuracy: 0.9880; loss: 0.041 |
| Полносвязная | 79,512 | 150 | accuracy: 0.914; loss: 0.299 |
### Сверточная нейронная сеть показала себя более эффективной: она обучается быстрее, требует меньше параметров и при этом обеспечивает более высокое качество распознавания изображений по сравнению с полносвязной моделью.
---
## 2. Изменили изменив набор данных MNIST на CIFAR-10
### При этом:
- в п. 3 разбиение данных на обучающие и тестовые произвести в соотношении 50 000:10 000
- после разбиения данных (между п. 3 и 4) вывести 25 изображений из обучающей выборки с подписями классов
- в п. 7 одно из тестовых изображений должно распознаваться корректно, а другое – ошибочно.
---
## 2.1. Загрузили набор данных CIFAR-10, содержащий цветные изображения размеченные на 10 классов: самолет, автомобиль, птица, кошка, олень, собака, лягушка, лошадь, корабль, грузовик.
```python
from keras.datasets import cifar10
(X_train, y_train), (X_test, y_test) = cifar10.load_data()
```
---
## 2.2. Разбили набор данных на обучающие и тестовые данные в соотношении 60 000:10 000 элементов. Параметр random_state выбрали равным (4k – 1)=39, где k=10 – номер бригады. Вывели размерности полученных обучающих и тестовых массивов данных.
```python
# создание своего разбиения датасета
# объединяем в один набор
X = np.concatenate((X_train, X_test))
y = np.concatenate((y_train, y_test))
# разбиваем по вариантам
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=10000, train_size=50000, random_state=39
)
# вывод размерностей
print('Shape of X train:', X_train.shape)
print('Shape of y train:', y_train.shape)
print('Shape of X test:', X_test.shape)
print('Shape of y test:', y_test.shape)
```
```
Shape of X train: (50000, 32, 32, 3)
Shape of y train: (50000, 1)
Shape of X test: (10000, 32, 32, 3)
Shape of y test: (10000, 1)
```
### Вывели 25 изображений из обучающей выборки с подписями классов:
```python
class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer',
'dog', 'frog', 'horse', 'ship', 'truck']
plt.figure(figsize=(10,10))
for i in range(25):
plt.subplot(5,5,i+1)
plt.xticks([])
plt.yticks([])
plt.grid(False)
plt.imshow(X_train[i])
plt.xlabel(class_names[y_train[i][0]])
plt.show()
```
![image](images_for_report/6.png)
---
## 2.3. Провели предобработку данных: привели обучающие и тестовые данные к формату, пригодному для обучения сверточной нейронной сети. Входные данные принимают значения от 0 до 1, метки цифр закодированы по принципу «one-hot encoding». Вывели размерности предобработанных обучающих и тестовых массивов данных.
```python
# Зададим параметры данных и модели
num_classes = 10
input_shape = (32, 32, 3)
# Приведение входных данных к диапазону [0, 1]
X_train = X_train / 255.0
X_test = X_test / 255.0
print('Shape of transformed X train:', X_train.shape)
print('Shape of transformed X test:', X_test.shape)
# Переводим метки в one-hot encoding
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)
print('Shape of transformed y train:', y_train.shape)
print('Shape of transformed y test:', y_test.shape)
```
```
Shape of transformed X train: (50000, 32, 32, 3)
Shape of transformed X test: (10000, 32, 32, 3)
Shape of transformed y train: (50000, 10)
Shape of transformed y test: (10000, 10)
```
---
## 2.4. Реализовали модель сверточной нейронной сети и обучили ее на обучающих данных с выделением части обучающих данных в качестве валидационных. Вывели информацию об архитектуре нейронной сети.
```python
model = Sequential()
model.add(layers.Conv2D(32, (3,3), padding="same", activation="relu",
input_shape=input_shape))
model.add(layers.BatchNormalization())
model.add(layers.Conv2D(32, (3,3), padding="same", activation="relu"))
model.add(layers.BatchNormalization())
model.add(layers.BatchNormalization())
model.add(layers.Dropout(0.25))
model.add(layers.Conv2D(64, (3,3), padding="same", activation="relu"))
model.add(layers.Conv2D(64, (3,3), padding="same", activation="relu"))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Dropout(0.25))
model.add(layers.Conv2D(128, (3,3), padding="same", activation="relu"))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Dropout(0.25))
model.add(layers.Flatten())
model.add(layers.Dense(128, activation="relu"))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(num_classes, activation="softmax"))
model.summary()
```
```
Model: "sequential_15"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type) ┃ Output Shape ┃ Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ conv2d_52 (Conv2D) │ (None, 32, 32, 32) │ 896 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ batch_normalization_29 │ (None, 32, 32, 32) │ 128 │
│ (BatchNormalization) │ │ │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_53 (Conv2D) │ (None, 32, 32, 32) │ 9,248 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ batch_normalization_30 │ (None, 32, 32, 32) │ 128 │
│ (BatchNormalization) │ │ │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ batch_normalization_31 │ (None, 32, 32, 32) │ 128 │
│ (BatchNormalization) │ │ │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_37 (Dropout) │ (None, 32, 32, 32) │ 0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_54 (Conv2D) │ (None, 32, 32, 64) │ 18,496 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_55 (Conv2D) │ (None, 32, 32, 64) │ 36,928 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_34 (MaxPooling2D) │ (None, 16, 16, 64) │ 0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_38 (Dropout) │ (None, 16, 16, 64) │ 0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ conv2d_56 (Conv2D) │ (None, 16, 16, 128) │ 73,856 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ max_pooling2d_35 (MaxPooling2D) │ (None, 8, 8, 128) │ 0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_39 (Dropout) │ (None, 8, 8, 128) │ 0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ flatten_15 (Flatten) │ (None, 8192) │ 0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_27 (Dense) │ (None, 128) │ 1,048,704 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_40 (Dropout) │ (None, 128) │ 0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_28 (Dense) │ (None, 10) │ 1,290 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
Total params: 1,189,802 (4.54 MB)
Trainable params: 1,189,610 (4.54 MB)
Non-trainable params: 192 (768.00 B)
```
```python
# компилируем и обучаем модель
model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
model.fit(X_train, y_train, batch_size=64, validation_split=0.1, epochs=50)
```
---
## 2.5. Оценили качество обучения на тестовых данных. Вывели значение функции ошибки и значение метрики качества классификации на тестовых данных.
```python
# Оценка качества работы модели на тестовых данных
scores = model.evaluate(X_test, y_test)
print('Loss on test data:', scores[0])
print('Accuracy on test data:', scores[1])
```
```
313/313 ━━━━━━━━━━━━━━━━━━━━ 2s 5ms/step - accuracy: 0.7982 - loss: 0.6423
Loss on test data: 0.6325967311859131
Accuracy on test data: 0.8019000291824341
```
---
## 2.6. Подали на вход обученной модели два тестовых изображения. Вывели изображения, истинные метки и результаты распознавания.
```python
# вывод двух тестовых изображений и результатов распознавания
for n in [7, 16]:
result = model.predict(X_test[n:n+1])
plt.imshow(X_test[n].reshape(32,32,3), cmap=plt.get_cmap('gray'))
plt.show()
print('Real mark: ', np.argmax(y_test[n]))
print('NN answer: ', np.argmax(result))
```
![image](images_for_report/7.png)
```
Real mark: 4
NN answer: 0
```
![image](images_for_report/8.png)
```
Real mark: 4
NN answer: 4
```
---
## 2.7. Вывели отчет о качестве классификации тестовой выборки и матрицу ошибок для тестовой выборки.
```python
# истинные метки классов
true_labels = np.argmax(y_test, axis=1)
# предсказанные метки классов
predicted_labels = np.argmax(model.predict(X_test), axis=1)
# отчет о качестве классификации
print(classification_report(true_labels, predicted_labels, target_names=class_names))
# вычисление матрицы ошибок
conf_matrix = confusion_matrix(true_labels, predicted_labels)
# отрисовка матрицы ошибок в виде "тепловой карты"
display = ConfusionMatrixDisplay(confusion_matrix=conf_matrix, display_labels=class_names)
display.plot()
plt.show()
```
```
313/313 ━━━━━━━━━━━━━━━━━━━━ 4s 8ms/step
precision recall f1-score support
airplane 0.78 0.85 0.81 983
automobile 0.90 0.93 0.91 1026
bird 0.73 0.69 0.71 1007
cat 0.63 0.64 0.64 1011
deer 0.81 0.75 0.78 985
dog 0.70 0.71 0.71 974
frog 0.86 0.79 0.82 1007
horse 0.81 0.84 0.83 982
ship 0.88 0.93 0.90 1026
truck 0.92 0.88 0.90 999
accuracy 0.80 10000
macro avg 0.80 0.80 0.80 10000
weighted avg 0.80 0.80 0.80 10000
```
![image](images_for_report/9.png)
### Модель успешно обучилась распознавать изображения из CIFAR-10, однако справляется с задачей хуже, чем на MNIST. Это связано с тем, что цветные изображения сложнее и содержат больше разнообразия, поэтому нейросети требуется более глубокая архитектура и больше ресурсов для достижения высокой точности.

Двоичные данные
labworks/LW4/1.jpg

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 22 KiB

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

@ -0,0 +1,7 @@
## Лабораторныа работа №4
## Распознавание последовательностей
* [Задание](IS_Lab04_2023.pdf)
* [Методические указания](IS_Lab04_Metod_2023.pdf)

@ -1,367 +0,0 @@
# Отчёт по лабораторной работе №4
**Кирсанов Егор, Кобзев Александр — А-01-22**
---
## 1. В среде Google Colab создали новый блокнот (notebook). Настроили блокнот для работы с аппаратным ускорителем GPU.
```python
from google.colab import drive
drive.mount('/content/drive')
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks/is_lab4')
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.models import Sequential
import matplotlib.pyplot as plt
import numpy as np
```
```python
import tensorflow as tf
device_name = tf.test.gpu_device_name()
if device_name != '/device:GPU:0':
raise SystemError('GPU device not found')
print('Found GPU at: {}'.format(device_name))
```
```
Found GPU at: /device:GPU:0
```
---
## 2. Загрузили набор данных IMDb, содержащий оцифрованные отзывы на фильмы, размеченные на два класса: позитивные и негативные. При загрузке набора данных параметр seed выбрали равным (4k – 1) = 39, где k = 10 – номер бригады. Вывели размеры полученных обучающих и тестовых массивов данных.
```python
# загрузка датасета
from keras.datasets import imdb
vocabulary_size = 5000
index_from = 3
(X_train, y_train), (X_test, y_test) = imdb.load_data(
path="imdb.npz",
num_words=vocabulary_size,
skip_top=0,
maxlen=None,
seed=39,
start_char=1,
oov_char=2,
index_from=index_from
)
# вывод размерностей
print('Shape of X train:', X_train.shape)
print('Shape of y train:', y_train.shape)
print('Shape of X test:', X_test.shape)
print('Shape of y test:', y_test.shape)
```
```
Shape of X train: (25000,)
Shape of y train: (25000,)
Shape of X test: (25000,)
Shape of y test: (25000,)
```
---
## 3. Вывели один отзыв из обучающего множества в виде списка индексовслов. Преобразовали список индексов в текст и вывели отзыв в виде текста. Вывели длину отзыва. Вывели метку класса данного отзыва и название класса (1 – Positive, 0 – Negative).
```python
# создание словаря для перевода индексов в слова
# загрузка словаря "слово:индекс"
word_to_id = imdb.get_word_index()
# уточнение словаря
word_to_id = {key:(value + index_from) for key,value in word_to_id.items()}
word_to_id["<PAD>"] = 0
word_to_id["<START>"] = 1
word_to_id["<UNK>"] = 2
word_to_id["<UNUSED>"] = 3
# создание обратного словаря "индекс:слово"
id_to_word = {value:key for key,value in word_to_id.items()}
```
```python
print(X_train[39])
print('len:',len(X_train[39]))
```
```
[1, 3206, 2, 3413, 3852, 2, 2, 73, 256, 19, 4396, 3033, 34, 488, 2, 47, 2993, 4058, 11, 63, 29, 4653, 1496, 27, 4122, 54, 4, 1334, 1914, 380, 1587, 56, 351, 18, 147, 2, 2, 15, 29, 238, 30, 4, 455, 564, 167, 1024, 2, 2, 2, 4, 2, 65, 33, 6, 2, 1062, 3861, 6, 3793, 1166, 7, 1074, 1545, 6, 171, 2, 1134, 388, 7, 3569, 2, 567, 31, 255, 37, 47, 6, 3161, 1244, 3119, 19, 6, 2, 11, 12, 2611, 120, 41, 419, 2, 17, 4, 3777, 2, 4952, 2468, 1457, 6, 2434, 4268, 23, 4, 1780, 1309, 5, 1728, 283, 8, 113, 105, 1037, 2, 285, 11, 6, 4800, 2905, 182, 5, 2, 183, 125, 19, 6, 327, 2, 7, 2, 668, 1006, 4, 478, 116, 39, 35, 321, 177, 1525, 2294, 6, 226, 176, 2, 2, 17, 2, 1220, 119, 602, 2, 2, 592, 2, 17, 2, 2, 1405, 2, 597, 503, 1468, 2, 2, 17, 2, 1947, 3702, 884, 1265, 3378, 1561, 2, 17, 2, 2, 992, 3217, 2393, 4923, 2, 17, 2, 2, 1255, 2, 2, 2, 117, 17, 6, 254, 2, 568, 2297, 5, 2, 2, 17, 1047, 2, 2186, 2, 1479, 488, 2, 4906, 627, 166, 1159, 2552, 361, 7, 2877, 2, 2, 665, 718, 2, 2, 2, 603, 4716, 127, 4, 2873, 2, 56, 11, 646, 227, 531, 26, 670, 2, 17, 6, 2, 2, 3510, 2, 17, 6, 2, 2, 2, 3014, 17, 6, 2, 668, 2, 503, 1468, 2, 19, 11, 4, 1746, 5, 2, 4778, 11, 31, 7, 41, 1273, 154, 255, 555, 6, 1156, 5, 737, 431]
len: 274
```
```python
review_as_text = ' '.join(id_to_word[id] for id in X_train[39])
print(review_as_text)
print('len:',len(review_as_text))
```
```
<START> troubled <UNK> magazine photographer <UNK> <UNK> well played with considerable intensity by michael <UNK> has horrific nightmares in which he brutally murders his models when the lovely ladies start turning up dead for real <UNK> <UNK> that he might be the killer writer director william <UNK> <UNK> <UNK> the <UNK> story at a <UNK> pace builds a reasonable amount of tension delivers a few <UNK> effective moments of savage <UNK> violence one woman who has a plastic garbage bag with a <UNK> in it placed over her head <UNK> as the definite <UNK> inducing highlight puts a refreshing emphasis on the nicely drawn and engaging true to life characters further <UNK> everything in a plausible everyday world and <UNK> things off with a nice <UNK> of <UNK> female nudity the fine acting from an excellent cast helps matters a whole lot <UNK> <UNK> as <UNK> charming love interest <UNK> <UNK> james <UNK> as <UNK> <UNK> double <UNK> brother b j <UNK> <UNK> as <UNK> concerned psychiatrist dr frank curtis don <UNK> as <UNK> <UNK> gay assistant louis pamela <UNK> as <UNK> <UNK> detective <UNK> <UNK> <UNK> little as a hard <UNK> police chief and <UNK> <UNK> as sweet <UNK> model <UNK> r michael <UNK> polished cinematography makes impressive occasional use of breathtaking <UNK> <UNK> shots jack <UNK> <UNK> <UNK> score likewise does the trick <UNK> up in cool bit parts are robert <UNK> as a <UNK> <UNK> sally <UNK> as a <UNK> <UNK> <UNK> shower as a <UNK> female <UNK> b j <UNK> with in the ring and <UNK> bay in one of her standard old woman roles a solid and enjoyable picture
len: 1584
```
---
## 4. Вывели максимальную и минимальную длину отзыва в обучающем множестве.
```python
print('MAX Len: ',len(max(X_train, key=len)))
print('MIN Len: ',len(min(X_train, key=len)))
```
```
MAX Len: 2494
MIN Len: 11
```
---
## 5. Провели предобработку данных. Выбрали единую длину, к которой будутприведены все отзывы. Короткие отзывы дополнили спецсимволами, а длинные обрезали до выбранной длины.
```python
#предобработка данных
from tensorflow.keras.utils import pad_sequences
max_words = 500
X_train = pad_sequences(X_train, maxlen=max_words, value=0, padding='pre', truncating='post')
X_test = pad_sequences(X_test, maxlen=max_words, value=0, padding='pre', truncating='post')
```
---
## 6. Повторили п. 4.
```python
print('MAX Len: ',len(max(X_train, key=len)))
print('MIN Len: ',len(min(X_train, key=len)))
```
```
MAX Len: 500
MIN Len: 500
```
---
## 7. Повторили п. 3. Сделали вывод о том, как отзыв преобразовался после предобработки.
```python
print(X_train[39])
print('len:',len(X_train[39]))
```
```
[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 3206 2 3413 3852 2 2 73 256 19 4396 3033
34 488 2 47 2993 4058 11 63 29 4653 1496 27 4122 54
4 1334 1914 380 1587 56 351 18 147 2 2 15 29 238
30 4 455 564 167 1024 2 2 2 4 2 65 33 6
2 1062 3861 6 3793 1166 7 1074 1545 6 171 2 1134 388
7 3569 2 567 31 255 37 47 6 3161 1244 3119 19 6
2 11 12 2611 120 41 419 2 17 4 3777 2 4952 2468
1457 6 2434 4268 23 4 1780 1309 5 1728 283 8 113 105
1037 2 285 11 6 4800 2905 182 5 2 183 125 19 6
...
2 2 3510 2 17 6 2 2 2 3014 17 6 2 668
2 503 1468 2 19 11 4 1746 5 2 4778 11 31 7
41 1273 154 255 555 6 1156 5 737 431]
len: 500
```
```python
review_as_text = ' '.join(id_to_word[id] for id in X_train[17])
print(review_as_text)
print('len:',len(review_as_text))
```
```
<PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <PAD> <START> when many people say it's the worst movie i've ever seen they tend to say that about virtually any movie they didn't like however of the nearly <UNK> movies i can remember ever seeing this one is one of two that i walked away from feeling personally <UNK> and angry this is my first movie review by the way and i <UNK> with imdb just to <UNK> at this movie's <UNK> i went to see it when it was in the theaters myself and my two buddies were 3 of 5 people there and after 15 years i can't remember very many <UNK> but my attitude upon leaving the theater is still <UNK> clear br br spoiler alert br br oh my where to begin fat loser left at <UNK> goes on <UNK> weekend meets blonde <UNK> who takes an interest in him takes him home to meet the family they're all <UNK> and he's the main course pathetic attempt at a dramatic escape kicks all their <UNK> and runs off with the <UNK> girlfriend they live happily ever after <UNK> firstly the gags are so bad that it took me a while to understand that they were trying to be funny and that this was a comedy the special effects what few there are look like they were done 15 years earlier the big dramatic ending was so <UNK> and poorly acted that it was nearly unbearable to watch he <UNK> out the entire <UNK> family with <UNK> <UNK> in the <UNK> that stand up tom and jerry style when they step on them i'm sure that there's much much more but i have no intention on seeing it again for a <UNK>
len: 2741
```
### После предобработки отзыв был приведён к фиксированной длине: в начале последовательности появились токены <PAD>, которые заполнили недостающие позиции. Содержательная часть отзыва сохранилась, но была сдвинута вправо, что обеспечивает единый формат данных для подачи в нейронную сеть.
---
## 8. Вывели предобработанные массивы обучающих и тестовых данных и их размерности.
```python
# вывод данных
print('X train: \n',X_train)
print('X train: \n',X_test)
# вывод размерностей
print('Shape of X train:', X_train.shape)
print('Shape of X test:', X_test.shape)
```
```
X train:
[[ 0 0 0 ... 7 4 2407]
[ 0 0 0 ... 34 705 2]
[ 0 0 0 ... 2222 8 369]
...
[ 0 0 0 ... 11 4 4596]
[ 0 0 0 ... 574 42 24]
[ 0 0 0 ... 7 13 3891]]
X train:
[[ 0 0 0 ... 6 52 20]
[ 0 0 0 ... 62 30 821]
[ 0 0 0 ... 24 3081 25]
...
[ 0 0 0 ... 19 666 3159]
[ 0 0 0 ... 7 15 1716]
[ 0 0 0 ... 1194 61 113]]
Shape of X train: (25000, 500)
Shape of X test: (25000, 500)
```
---
## 9. Реализовали модель рекуррентной нейронной сети, состоящей из слоев Embedding, LSTM, Dropout, Dense, и обучили ее на обучающих данных с выделением части обучающих данных в качестве валидационных. Вывели информацию об архитектуре нейронной сети. Добились качества обучения по метрике accuracy не менее 0.8.
```python
embed_dim = 32
lstm_units = 64
model = Sequential()
model.add(layers.Embedding(input_dim=vocabulary_size, output_dim=embed_dim, input_length=max_words, input_shape=(max_words,)))
model.add(layers.LSTM(lstm_units))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(1, activation='sigmoid'))
model.summary()
```
```
Model: "sequential_2"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type) ┃ Output Shape ┃ Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ embedding_2 (Embedding) │ (None, 500, 32) │ 160,000 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ lstm_2 (LSTM) │ (None, 64) │ 24,832 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dropout_2 (Dropout) │ (None, 64) │ 0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_2 (Dense) │ (None, 1) │ 65 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
Total params: 184,897 (722.25 KB)
Trainable params: 184,897 (722.25 KB)
Non-trainable params: 0 (0.00 B)
```
```python
# компилируем и обучаем модель
batch_size = 64
epochs = 3
model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"])
model.fit(X_train, y_train, batch_size=batch_size, epochs=epochs, validation_split=0.2)
```
```
Epoch 1/3
313/313 ━━━━━━━━━━━━━━━━━━━━ 8s 20ms/step - accuracy: 0.6648 - loss: 0.5901 - val_accuracy: 0.8204 - val_loss: 0.4243
Epoch 2/3
313/313 ━━━━━━━━━━━━━━━━━━━━ 7s 22ms/step - accuracy: 0.8623 - loss: 0.3341 - val_accuracy: 0.8492 - val_loss: 0.3553
Epoch 3/3
313/313 ━━━━━━━━━━━━━━━━━━━━ 6s 19ms/step - accuracy: 0.8987 - loss: 0.2659 - val_accuracy: 0.8632 - val_loss: 0.3416
<keras.src.callbacks.history.History at 0x7f1e723806b0>
```
```python
test_loss, test_acc = model.evaluate(X_test, y_test)
print(f"\nTest accuracy: {test_acc}")
```
```
782/782 ━━━━━━━━━━━━━━━━━━━━ 7s 9ms/step - accuracy: 0.8770 - loss: 0.3202
Test accuracy: 0.8710799813270569
```
---
## 10. Оценили качество обучения на тестовых данных:
- вывести значение метрики качества классификации на тестовых данных,
- вывести отчет о качестве классификации тестовой выборки.
- построить ROC-кривую по результату обработки тестовой выборки и вычислить площадь под ROC-кривой (AUC ROC).
```python
#значение метрики качества классификации на тестовых данных
print(f"\nTest accuracy: {test_acc}")
```
```
Test accuracy: 0.8710799813270569
```
```python
#отчет о качестве классификации тестовой выборки
y_score = model.predict(X_test)
y_pred = [1 if y_score[i,0]>=0.5 else 0 for i in range(len(y_score))]
from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred, labels = [0, 1], target_names=['Negative', 'Positive']))
```
```
782/782 ━━━━━━━━━━━━━━━━━━━━ 5s 7ms/step
precision recall f1-score support
Negative 0.89 0.85 0.87 12500
Positive 0.86 0.89 0.87 12500
accuracy 0.87 25000
macro avg 0.87 0.87 0.87 25000
weighted avg 0.87 0.87 0.87 25000
```
```python
#построение ROC-кривой и AUC ROC
from sklearn.metrics import roc_curve, auc
fpr, tpr, thresholds = roc_curve(y_test, y_score)
plt.plot(fpr, tpr)
plt.grid()
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC')
plt.show()
print('AUC ROC:', auc(fpr, tpr))
```
![image](1.jpg)
```
AUC ROC: 0.9419218976
```
---
## 11. Сделали выводы по результатам применения рекуррентной нейронной сети для решения задачи определения тональности текста.
### В результате выполнения лабораторной работы была построена рекуррентная нейронная сеть на основе слоёв Embedding и LSTM, которая успешно справилась с задачей определения тональности текста. Модель достигла требуемого качества: accuracy выше 0.8 и AUC ROC выше 0.9, что подтверждает её способность эффективно различать позитивные и негативные отзывы. Полученные результаты демонстрируют, что рекуррентные сети хорошо подходят для анализа текстовой информации и работы с последовательностями.
Загрузка…
Отмена
Сохранить