msproper commited on
Commit
720053f
·
1 Parent(s): 650ab6c

фрфррф

Browse files
Files changed (1) hide show
  1. Untitled0_(2).ipynb +208 -0
Untitled0_(2).ipynb ADDED
@@ -0,0 +1,208 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "nbformat": 4,
3
+ "nbformat_minor": 0,
4
+ "metadata": {
5
+ "colab": {
6
+ "provenance": []
7
+ },
8
+ "kernelspec": {
9
+ "name": "python3",
10
+ "display_name": "Python 3"
11
+ },
12
+ "language_info": {
13
+ "name": "python"
14
+ }
15
+ },
16
+ "cells": [
17
+ {
18
+ "cell_type": "markdown",
19
+ "source": [
20
+ "#Энкодер"
21
+ ],
22
+ "metadata": {
23
+ "id": "oHA0mAwVHTxj"
24
+ }
25
+ },
26
+ {
27
+ "cell_type": "code",
28
+ "execution_count": null,
29
+ "metadata": {
30
+ "id": "Q4nxvuyjHHzY"
31
+ },
32
+ "outputs": [],
33
+ "source": [
34
+ "import numpy as np\n",
35
+ "import matplotlib.pyplot as plt\n",
36
+ "from tensorflow.keras.datasets import mnist # библиотека базы выборок Mnist\n",
37
+ "from tensorflow import keras\n",
38
+ "from tensorflow.keras.layers import Dense, Flatten, Reshape, Input, Lambda\n",
39
+ "import keras.backend as K"
40
+ ]
41
+ },
42
+ {
43
+ "cell_type": "code",
44
+ "source": [
45
+ "#print(mnist.load_data())\n",
46
+ "(train_x, train_y), (test_x, test_y) = mnist.load_data()\n",
47
+ "\n",
48
+ "train_x = train_x / 255\n",
49
+ "test_x = test_x / 255\n",
50
+ "\n",
51
+ "\n",
52
+ "train_x = np.reshape(train_x, (len(train_x), 28*28))\n",
53
+ "test_x = np.reshape(test_x, (len(test_x), 28*28))\n",
54
+ "\n"
55
+ ],
56
+ "metadata": {
57
+ "id": "yXlYmFIRH93a"
58
+ },
59
+ "execution_count": null,
60
+ "outputs": []
61
+ },
62
+ {
63
+ "cell_type": "code",
64
+ "source": [
65
+ "inputs = Input(shape = (28*28, ))\n",
66
+ "x = Dense(150, activation='relu')(inputs)\n",
67
+ "x = Dense(40, activation='relu')(x)\n",
68
+ "x = Dense(10, activation='relu')(x)\n",
69
+ "encoder = Dense(3, activation='linear')(x)\n",
70
+ "\n",
71
+ "inputs_dec = Input(shape = (3, ))\n",
72
+ "x = Dense(10, activation='relu')(inputs_dec)\n",
73
+ "x = Dense(40, activation='relu')(x)\n",
74
+ "x = Dense(150, activation='relu')(x)\n",
75
+ "decoder = Dense(28*28, activation = 'relu')(x)\n"
76
+ ],
77
+ "metadata": {
78
+ "id": "hMBakqR4LTqk"
79
+ },
80
+ "execution_count": null,
81
+ "outputs": []
82
+ },
83
+ {
84
+ "cell_type": "code",
85
+ "source": [
86
+ "encoder_model = keras.Model(inputs, encoder)\n",
87
+ "decoder_model = keras.Model(inputs_dec, decoder)\n",
88
+ "autoenc = keras.Model(inputs, decoder_model(encoder_model(inputs)))"
89
+ ],
90
+ "metadata": {
91
+ "id": "KrjUSjORNKwM"
92
+ },
93
+ "execution_count": null,
94
+ "outputs": []
95
+ },
96
+ {
97
+ "cell_type": "code",
98
+ "source": [
99
+ "autoenc.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])"
100
+ ],
101
+ "metadata": {
102
+ "id": "HS4B9jtaPCVh"
103
+ },
104
+ "execution_count": null,
105
+ "outputs": []
106
+ },
107
+ {
108
+ "cell_type": "code",
109
+ "source": [
110
+ "autoenc.fit(train_x, train_x, epochs=5, batch_size=100)"
111
+ ],
112
+ "metadata": {
113
+ "colab": {
114
+ "base_uri": "https://localhost:8080/"
115
+ },
116
+ "id": "vp9Hnsp0QCGg",
117
+ "outputId": "07d3794b-bc5c-4615-aff7-09a90c37175e"
118
+ },
119
+ "execution_count": null,
120
+ "outputs": [
121
+ {
122
+ "output_type": "stream",
123
+ "name": "stdout",
124
+ "text": [
125
+ "Epoch 1/5\n",
126
+ "600/600 [==============================] - 7s 10ms/step - loss: 0.0332 - accuracy: 0.0110\n",
127
+ "Epoch 2/5\n",
128
+ "600/600 [==============================] - 7s 11ms/step - loss: 0.0330 - accuracy: 0.0095\n",
129
+ "Epoch 3/5\n",
130
+ "600/600 [==============================] - 6s 11ms/step - loss: 0.0328 - accuracy: 0.0102\n",
131
+ "Epoch 4/5\n",
132
+ "600/600 [==============================] - 7s 11ms/step - loss: 0.0327 - accuracy: 0.0105\n",
133
+ "Epoch 5/5\n",
134
+ "600/600 [==============================] - 7s 11ms/step - loss: 0.0326 - accuracy: 0.0106\n"
135
+ ]
136
+ },
137
+ {
138
+ "output_type": "execute_result",
139
+ "data": {
140
+ "text/plain": [
141
+ "<keras.callbacks.History at 0x7f6a0c99f130>"
142
+ ]
143
+ },
144
+ "metadata": {},
145
+ "execution_count": 64
146
+ }
147
+ ]
148
+ },
149
+ {
150
+ "cell_type": "code",
151
+ "source": [
152
+ "n = 5\n",
153
+ "m = 105\n",
154
+ "imgs = test_x[m:n+m]\n",
155
+ "decoded_imgs = autoenc.predict(test_x[:n], batch_size=n)\n",
156
+ "\n",
157
+ "plt.figure(figsize=(2*n, 2*2))\n",
158
+ "for i in range(n):\n",
159
+ " ax = plt.subplot(2, n, i+1)\n",
160
+ " plt.imshow(imgs[i].reshape(28, 28), cmap='gray')\n",
161
+ " ax.get_xaxis().set_visible(False)\n",
162
+ " ax.get_yaxis().set_visible(False)\n",
163
+ "\n",
164
+ " ax2 = plt.subplot(2, n, i+n+1)\n",
165
+ " plt.imshow(decoded_imgs[i].reshape(28, 28), cmap='gray')\n",
166
+ " ax2.get_xaxis().set_visible(False)\n",
167
+ " ax2.get_yaxis().set_visible(False)"
168
+ ],
169
+ "metadata": {
170
+ "colab": {
171
+ "base_uri": "https://localhost:8080/",
172
+ "height": 355
173
+ },
174
+ "id": "ddNWbMcrQccC",
175
+ "outputId": "67e55d35-d8f3-42f4-eefc-21688709b4e6"
176
+ },
177
+ "execution_count": null,
178
+ "outputs": [
179
+ {
180
+ "output_type": "stream",
181
+ "name": "stdout",
182
+ "text": [
183
+ "1/1 [==============================] - 0s 24ms/step\n"
184
+ ]
185
+ },
186
+ {
187
+ "output_type": "display_data",
188
+ "data": {
189
+ "text/plain": [
190
+ "<Figure size 1000x400 with 10 Axes>"
191
+ ],
192
+ "image/png": "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\n"
193
+ },
194
+ "metadata": {}
195
+ }
196
+ ]
197
+ },
198
+ {
199
+ "cell_type": "code",
200
+ "source": [],
201
+ "metadata": {
202
+ "id": "_vPponn-Q1Xu"
203
+ },
204
+ "execution_count": null,
205
+ "outputs": []
206
+ }
207
+ ]
208
+ }