Сравнить коммиты
5 Коммитов
| Автор | SHA1 | Дата |
|---|---|---|
|
|
b6238272b4 | 2 месяцев назад |
|
|
98c3a55a43 | 2 месяцев назад |
|
|
4ea5a02099 | 3 месяцев назад |
|
|
dee57ad5f2 | 3 месяцев назад |
|
|
40fb6b5620 | 3 месяцев назад |
|
После Ширина: | Высота: | Размер: 3.9 KiB |
|
После Ширина: | Высота: | Размер: 3.9 KiB |
|
После Ширина: | Высота: | Размер: 854 B |
|
После Ширина: | Высота: | Размер: 883 B |
|
После Ширина: | Высота: | Размер: 5.6 KiB |
|
После Ширина: | Высота: | Размер: 19 KiB |
|
После Ширина: | Высота: | Размер: 30 KiB |
|
После Ширина: | Высота: | Размер: 20 KiB |
|
После Ширина: | Высота: | Размер: 29 KiB |
|
После Ширина: | Высота: | Размер: 18 KiB |
|
После Ширина: | Высота: | Размер: 18 KiB |
|
После Ширина: | Высота: | Размер: 8.6 KiB |
|
После Ширина: | Высота: | Размер: 8.7 KiB |
|
После Ширина: | Высота: | Размер: 8.9 KiB |
|
После Ширина: | Высота: | Размер: 8.7 KiB |
|
После Ширина: | Высота: | Размер: 13 KiB |
|
После Ширина: | Высота: | Размер: 24 KiB |
|
После Ширина: | Высота: | Размер: 16 KiB |
|
После Ширина: | Высота: | Размер: 28 KiB |
|
После Ширина: | Высота: | Размер: 16 KiB |
|
После Ширина: | Высота: | Размер: 28 KiB |
|
После Ширина: | Высота: | Размер: 16 KiB |
|
После Ширина: | Высота: | Размер: 27 KiB |
@ -0,0 +1,508 @@
|
|||||||
|
# Отчёт по лабораторной работе №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()
|
||||||
|
```
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 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()
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
```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()
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
---
|
||||||
|
|
||||||
|
## 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())
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
```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()
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
```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())
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
```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()
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
```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())
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
```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()
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
```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())
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
```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()
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
```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())
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
```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()
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
```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)))
|
||||||
|
```
|
||||||
|

|
||||||
|
|
||||||
|
```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)))
|
||||||
|
```
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 13. Создали собственные изображения рукописных цифр, подобное представленным в наборе MNIST. Цифру выбрали как остаток от деления на 10 числа своего дня рождения (14 июля → 14 mod 10 = 4, 7 ноября → 7 mod 10 = 7). Сохранили изображения. Загрузили, предобработали и подали на вход обученной нейронной сети собственные изображения. Вывели изображения и результаты распознавания.
|
||||||
|
|
||||||
|
### Для 7:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
```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))
|
||||||
|
```
|
||||||
|

|
||||||
|
|
||||||
|
### Для 4:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
```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))
|
||||||
|
```
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 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))
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
```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))
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
**Вывод:** модель неустойчива к повороту изображений, так как не обучалась на повернутых данных.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Заключение
|
||||||
|
Изучены принципы построения и обучения нейронных сетей в Keras на примере распознавания цифр MNIST. Лучшая точность достигнута простой моделью с одним скрытым слоем из 100 нейронов. При усложнении архитектуры наблюдается переобучение. Сеть корректно классифицирует собственные изображения, но ошибается на повернутых.
|
||||||
@ -0,0 +1,4 @@
|
|||||||
|
10.5 9.5
|
||||||
|
9.0 10.2
|
||||||
|
9.6 10.5
|
||||||
|
9.0 9.0
|
||||||
|
После Ширина: | Высота: | Размер: 43 KiB |
|
После Ширина: | Высота: | Размер: 21 KiB |
|
После Ширина: | Высота: | Размер: 29 KiB |
|
После Ширина: | Высота: | Размер: 40 KiB |
|
После Ширина: | Высота: | Размер: 22 KiB |
|
После Ширина: | Высота: | Размер: 86 KiB |
|
После Ширина: | Высота: | Размер: 89 KiB |
|
После Ширина: | Высота: | Размер: 70 KiB |
|
После Ширина: | Высота: | Размер: 43 KiB |
|
После Ширина: | Высота: | Размер: 108 KiB |
|
После Ширина: | Высота: | Размер: 34 KiB |
|
После Ширина: | Высота: | Размер: 90 KiB |
|
После Ширина: | Высота: | Размер: 104 KiB |
|
После Ширина: | Высота: | Размер: 32 KiB |
|
После Ширина: | Высота: | Размер: 66 KiB |
|
После Ширина: | Высота: | Размер: 78 KiB |
@ -0,0 +1,100 @@
|
|||||||
|
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
|
||||||
@ -0,0 +1,474 @@
|
|||||||
|
{
|
||||||
|
"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
|
||||||
|
}
|
||||||
|
После Ширина: | Высота: | Размер: 21 KiB |
|
После Ширина: | Высота: | Размер: 23 KiB |
@ -0,0 +1 @@
|
|||||||
|
10.98
|
||||||
|
После Ширина: | Высота: | Размер: 37 KiB |
@ -0,0 +1 @@
|
|||||||
|
0.55
|
||||||
|
После Ширина: | Высота: | Размер: 34 KiB |
@ -0,0 +1 @@
|
|||||||
|
6.75
|
||||||
|
После Ширина: | Высота: | Размер: 31 KiB |
|
После Ширина: | Высота: | Размер: 42 KiB |
|
После Ширина: | Высота: | Размер: 73 KiB |
|
После Ширина: | Высота: | Размер: 45 KiB |
|
После Ширина: | Высота: | Размер: 111 KiB |
|
После Ширина: | Высота: | Размер: 92 KiB |
|
После Ширина: | Высота: | Размер: 96 KiB |
|
После Ширина: | Высота: | Размер: 107 KiB |
|
После Ширина: | Высота: | Размер: 69 KiB |
|
После Ширина: | Высота: | Размер: 82 KiB |
@ -0,0 +1,5 @@
|
|||||||
|
------------Оценка качества AE2 С ПОМОЩЬЮ НОВЫХ МЕТРИК------------
|
||||||
|
Approx = 0.36
|
||||||
|
Excess = 1.7777777777777777
|
||||||
|
Deficit = 0.0
|
||||||
|
Coating = 1.0
|
||||||
|
После Ширина: | Высота: | Размер: 46 KiB |
@ -0,0 +1,471 @@
|
|||||||
|
# Отчёт по лабораторной работе №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)
|
||||||
|
```
|
||||||
|

|
||||||
|
|
||||||
|
```
|
||||||
|
Размерность данных: (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)
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
```
|
||||||
|
Порог ошибки реконструкции:
|
||||||
|
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)
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
```
|
||||||
|
Порог ошибки реконструкции:
|
||||||
|
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)
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
```
|
||||||
|
amount: 18
|
||||||
|
amount_ae: 293
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
```
|
||||||
|
Оценка качества 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)
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
```
|
||||||
|
amount: 18
|
||||||
|
amount_ae: 50
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|

|
||||||
|
|
||||||
|
```
|
||||||
|
Оценка качества 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)
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 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')
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
Аномалий не обнаружено
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
```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 аномалий
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
## 1.11. Визуализирывали элементы обучающей и тестовой выборки в областях пространства признаков, распознаваемых автокодировщиками AE1 и AE2.
|
||||||
|
|
||||||
|
```python
|
||||||
|
lib.plot2in1_anomaly(data, xx, yy, Z1, Z2, data_test)
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 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)
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
```
|
||||||
|
Порог ошибки реконструкции:
|
||||||
|
AE3 IREth = 10.75
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2.6. Сделать вывод о пригодности обученного автокодировщика для качественного обнаружения аномалий. Если порог ошибки реконструкции слишком велик, то подобрать подходящие параметры автокодировщика и повторить шаги (4) – (6).
|
||||||
|
|
||||||
|
### Очент высокий порог, так что попробуем другю структуру:
|
||||||
|
|
||||||
|
|
||||||
|
MSE = 0.3363
|
||||||
|
|
||||||
|
```python
|
||||||
|
lib.ire_plot('training', IRE3, IREth3, 'AE3')
|
||||||
|
print('AE3 IREth =', IREth3)
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
```
|
||||||
|
Порог ошибки реконструкции:
|
||||||
|
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 аномалий
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 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 % аномалий — модель адекватно аппроксимирует область нормы и надёжно выделяет отклонения.
|
||||||
|
|
||||||
|
После Ширина: | Высота: | Размер: 3.9 KiB |
|
После Ширина: | Высота: | Размер: 3.9 KiB |
|
После Ширина: | Высота: | Размер: 854 B |
|
После Ширина: | Высота: | Размер: 883 B |
|
После Ширина: | Высота: | Размер: 7.1 KiB |
|
После Ширина: | Высота: | Размер: 7.0 KiB |
|
После Ширина: | Высота: | Размер: 31 KiB |
|
После Ширина: | Высота: | Размер: 6.5 KiB |
|
После Ширина: | Высота: | Размер: 6.6 KiB |
|
После Ширина: | Высота: | Размер: 121 KiB |
|
После Ширина: | Высота: | Размер: 10 KiB |
|
После Ширина: | Высота: | Размер: 12 KiB |
|
После Ширина: | Высота: | Размер: 54 KiB |
@ -0,0 +1,611 @@
|
|||||||
|
# Отчёт по лабораторной работе №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))
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
```
|
||||||
|
Real mark: 6
|
||||||
|
NN answer: 6
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
```
|
||||||
|
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
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 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))
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
```
|
||||||
|
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))
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
```
|
||||||
|
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()
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 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))
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
```
|
||||||
|
Real mark: 4
|
||||||
|
NN answer: 0
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
```
|
||||||
|
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
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
### Модель успешно обучилась распознавать изображения из CIFAR-10, однако справляется с задачей хуже, чем на MNIST. Это связано с тем, что цветные изображения сложнее и содержат больше разнообразия, поэтому нейросети требуется более глубокая архитектура и больше ресурсов для достижения высокой точности.
|
||||||
|
После Ширина: | Высота: | Размер: 22 KiB |
@ -1,7 +0,0 @@
|
|||||||
## Лабораторныа работа №4
|
|
||||||
|
|
||||||
## Распознавание последовательностей
|
|
||||||
|
|
||||||
* [Задание](IS_Lab04_2023.pdf)
|
|
||||||
|
|
||||||
* [Методические указания](IS_Lab04_Metod_2023.pdf)
|
|
||||||
@ -0,0 +1,367 @@
|
|||||||
|
# Отчёт по лабораторной работе №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))
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
```
|
||||||
|
AUC ROC: 0.9419218976
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 11. Сделали выводы по результатам применения рекуррентной нейронной сети для решения задачи определения тональности текста.
|
||||||
|
|
||||||
|
### В результате выполнения лабораторной работы была построена рекуррентная нейронная сеть на основе слоёв Embedding и LSTM, которая успешно справилась с задачей определения тональности текста. Модель достигла требуемого качества: accuracy выше 0.8 и AUC ROC выше 0.9, что подтверждает её способность эффективно различать позитивные и негативные отзывы. Полученные результаты демонстрируют, что рекуррентные сети хорошо подходят для анализа текстовой информации и работы с последовательностями.
|
||||||