ΠΡΠ° ΡΡΠ°ΡΡΡ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ Π²Π°Ρ ΡΠΎ Π²ΡΠ΅ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠΌ Π΄Π»Ρ Π½Π°ΡΠ°Π»Π° ΡΠ°Π±ΠΎΡΡ Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠ²Π½ΡΠΌΠΈ ΠΌΠΎΠ΄Π΅Π»ΡΠΌΠΈ. ΠΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΠΌ ΠΏΠΎΡΠ°Π³ΠΎΠ²ΠΎΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΏΠΎ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ ΡΡΠ»ΠΎΠ²Π½ΡΡ VAE Π½Π° Π½Π°Π±ΠΎΡΠ°Ρ Π΄Π°Π½Π½ΡΡ Ρ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡΠΌΠΈ ΠΈ ΠΈΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ Π½ΠΎΠ²ΡΡ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½Π½ΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ.
ΠΠΎΡΠΈΠ²Π°ΡΠΈΡ
ΠΠ°ΡΠ΅ΠΌ Π½ΡΠΆΠ½ΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π½ΠΎΠ²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅, Π΅ΡΠ»ΠΈ Π² ΠΌΠΈΡΠ΅ ΠΈ ΡΠ°ΠΊ ΠΎΠ³ΡΠΎΠΌΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΄Π°Π½Π½ΡΡ
? Π‘ΠΎΠ³Π»Π°ΡΠ½ΠΎ IDC, Π² ΠΌΠΈΡΠ΅ Π±ΠΎΠ»Π΅Π΅ 18 Π·Π΅ΡΡΠ°Π±Π°ΠΉΡΠΎΠ² Π΄Π°Π½Π½ΡΡ
.
ΠΠ°ΠΊ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΡ Π½ΠΈΠΊΡΠΎ Π½Π΅ Π²ΠΈΠ΄Π΅Π»?
ΠΡΠΎΡΠΈΡΠ°Π² ΡΡΡ ΡΡΠ°ΡΡΡ, Π²Ρ ΡΠ·Π½Π°Π΅ΡΠ΅, ΡΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ΠΠ°ΡΠΈΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΠΠ²ΡΠΎΡΠ½ΠΊΠΎΠ΄Π΅Ρ, ΠΈ ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°ΡΡ Π²Π°Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ Π½ΠΎΠ²ΡΡ
ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΠΈΠΊΡΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²ΠΈΠ΄Π΅Π». ΠΡ ΠΎΠ±ΡΡΡΠ½ΠΈΠΌ ΠΈΠ΄Π΅ΠΈ ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ, Π»Π΅ΠΆΠ°ΡΠΈΠ΅ Π² Π΅Π³ΠΎ ΠΎΡΠ½ΠΎΠ²Π΅, Π±Π΅Π· ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΠΊΠΈ.
ΠΠ°Π½Π½ΡΠ΅
ΠΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΡΠΈΡΠΎΠΊΠΎ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡΠ° Π΄Π°Π½Π½ΡΡ ΠΠ½Π°ΠΌΠ΅Π½ΠΈΡΠΎΡΡΠ΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ Π½Π°ΠΌ ΡΠΎΠ·Π΄Π°ΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ Π»ΠΈΡ. ΠΡΠΎΡ Π½Π°Π±ΠΎΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°ΡΠ°ΡΡ Ρ ΡΠ°ΠΉΡΠ° CelebFacesA. ΠΠ½ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π±ΠΎΠ»ΡΡΠΎΠΉ Π½Π°Π±ΠΎΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² Π»ΠΈΡ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ Π±ΠΎΠ»Π΅Π΅ 200 ΡΡΡΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Π·Π½Π°ΠΌΠ΅Π½ΠΈΡΠΎΡΡΠ΅ΠΉ, Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΡΠΊΠ°Π·Π°Π½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ 40 Π°ΡΡΠΈΠ±ΡΡΠΎΠ².
- 10.177 Π»ΠΈΡΠ½ΠΎΡΡΠ΅ΠΉ;
- 202.599 ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ;
- 5 Π²Π°ΠΆΠ½Π΅ΠΉΡΠΈΡ Π»ΠΎΠΊΠ°ΡΠΈΠΉ;
- 40 Π±ΠΈΠ½Π°ΡΠ½ΡΡ
Π°ΡΡΠΈΠ±ΡΡΠΎΠ² Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ.
import pandas as pd
df_celeb = pd.read_csv('list_attr_celeba.csv')
df_celeb.head()
ΠΠΈΠΆΠ΅ ΠΌΡ Π²ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠ΅ Π»ΠΈΡΠ° ΠΈ Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ ΠΈΡ
ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅ (Π°ΡΡΠΈΠ±ΡΡΡ). ΠΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΈΠΌΠ΅ΡΡ Π²ΡΡΠΎΡΡ 218 ΠΏΠΈΠΊΡΠ΅Π»Π΅ΠΉ, ΡΠΈΡΠΈΠ½Ρ 178 ΠΏΠΈΠΊΡΠ΅Π»Π΅ΠΉ ΠΈ 3 ΡΠ²Π΅ΡΠΎΠ²ΡΡ
ΠΊΠ°Π½Π°Π»Π°.
import matplotlib.pyplot as plt
import random
from skimage.io import imread
def show_sample_image(nb=3, df=df_celeb, verbose=True):
f, ax = plt.subplots(1, nb, figsize=(10,5))
for i in range(nb):
idx = random.randint(0, df.shape[0]-1)
img_id = df.loc[idx].image_id
img_uri = 'img_align_celeba/' + img_id
img = skimage.io.imread(img_uri)
if verbose:
label = img_id
for col in df.columns:
if df.loc[idx][col]==1:
label = label + '\n' + col
if nb > 1:
ax[i].imshow(img)
ax[i].set_title(label)
else:
ax.imshow(img)
ax.set_title(label)
return img, list(df.loc[idx][1:df.shape[1]])
sample_img, sample_img_meta = show_sample_image()
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Π°Π²ΡΠΎΡΠ½ΠΊΠΎΠ΄Π΅Ρ (AE)?
ΠΡΠΎΡΠΌΠΎΡΡΠ΅Π² Π»ΠΈΡΠ° ΡΡΡΡΡ Π·Π½Π°ΠΌΠ΅Π½ΠΈΡΠΎΡΡΠ΅ΠΉ, Π½Π΅ΠΉΡΠΎΠ½Π½Π°Ρ ΡΠ΅ΡΡ ΠΌΠΎΠΆΠ΅Ρ Π½Π°ΡΡΠΈΡΡΡΡ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π»ΠΈΡΠ° Π»ΡΠ΄Π΅ΠΉ, ΠΊΠΎΡΠΎΡΡΡ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ.
ΠΠ½ΠΎΠ³Π΄Π° ΡΡΠΈΡ ΠΌΠ΅ΡΠΎΠΊ Ρ Π½Π°Ρ Π½Π΅Ρ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±ΡΡΠΈΡΡ Π΄Π²Π΅ Π½Π΅ΠΉΡΠΎΠ½Π½ΡΠ΅ ΡΠ΅ΡΠΈ β ΠΎΠ΄Π½Π° Π±ΡΠ΄Π΅Ρ ΡΡΠ²Π°ΠΈΠ²Π°ΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅, Π° Π²ΡΠΎΡΠ°Ρ β Π²ΠΎΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ, ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΏΠΎΡΠ΅ΡΡ ΡΠ΅ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ. ΠΡΠΎ Π°Π²ΡΠΎΡΠ½ΠΊΠΎΠ΄Π΅Ρ (Π°Π²ΡΠΎΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΡΠΈΠΊ). ΠΠ½ ΡΠ°ΠΊ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π½Π°Ρ ΠΎΠ΄ΠΈΡ Π»ΡΡΡΠΈΠΉ ΡΠΏΠΎΡΠΎΠ± Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ Π²Π΅ΡΡΠΈΡ Π±ΡΠ»Π° ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±Π»ΠΈΠΆΠ΅ ΠΊ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΉ.
ΠΠ²ΡΠΎΡΠ½ΠΊΠΎΠ΄Π΅Ρ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π΄Π²ΡΡ
ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΡ
Π½Π΅ΠΉΡΠΎΠ½Π½ΡΡ
ΡΠ΅ΡΠ΅ΠΉ: ΠΌΠΎΠ΄Π΅Π»ΠΈ ΡΠ½ΠΊΠΎΠ΄Π΅ΡΠ° (ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΡΠΈΠΊΠ°) ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π΄Π΅ΠΊΠΎΠ΄Π΅ΡΠ° (Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΡΠΈΠΊΠ°). ΠΠ³ΠΎ ΡΠ΅Π»Ρ β Π½Π°Ρ
ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π° ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π»ΠΈΡ Π·Π½Π°ΠΌΠ΅Π½ΠΈΡΠΎΡΡΠ΅ΠΉ Π² ΡΠΆΠ°ΡΡΡ ΡΠΎΡΠΌΡ (ΡΠΊΡΡΡΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ) ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠΎΠ±Ρ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½Π°Ρ Π²Π΅ΡΡΠΈΡ Π±ΡΠ»Π° ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±Π»ΠΈΠΆΠ΅ ΠΊ Π²Ρ
ΠΎΠ΄Π½ΠΎΠΉ.
- ΠΠΎΠ΄Π΅Π»Ρ ΡΠ½ΠΊΠΎΠ΄Π΅ΡΠ° ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡ Π²Ρ ΠΎΠ΄Π½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ X Π² ΠΌΠ°Π»Π΅Π½ΡΠΊΠΎΠ΅ ΠΏΠ»ΠΎΡΠ½ΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Z, ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ²Π΅ΡΡΠΎΡΠ½Π°Ρ Π½Π΅ΠΉΡΠΎΠ½Π½Π°Ρ ΡΠ΅ΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠΈΠ»ΡΡΡΡ Π΄Π»Ρ ΡΡΠ²ΠΎΠ΅Π½ΠΈΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΉ.
- ΠΠΎΠ΄Π΅Π»Ρ Π΄Π΅ΠΊΠΎΠ΄Π΅ΡΠ° ΠΌΠΎΠΆΠ½ΠΎ ΡΡΠΈΡΠ°ΡΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠ²Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΡΡ, ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΠΉ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΏΡΠΈΠ·Π½Π°ΠΊΠΈ X'.
- ΠΠ½ΠΊΠΎΠ΄Π΅Ρ ΠΈ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ ΠΎΠ±ΡΡΠ½ΠΎ ΠΎΠ±ΡΡΠ°ΡΡΡΡ Π²ΠΌΠ΅ΡΡΠ΅. Π€ΡΠ½ΠΊΡΠΈΡ ΠΏΠΎΡΠ΅ΡΡ ΡΡΡΠ°ΡΡΠ΅Ρ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΡ ΡΠ΅ΡΡ Π·Π° ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π²ΡΡ
ΠΎΠ΄Π½ΡΡ
Π»ΠΈΡ, ΠΎΡΠ»ΠΈΡΠ°ΡΡΠΈΡ
ΡΡ ΠΎΡ Π²Ρ
ΠΎΠ΄Π½ΡΡ
Π»ΠΈΡ.
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΠ½ΠΊΠΎΠ΄Π΅Ρ ΠΎΠ±ΡΡΠ°Π΅ΡΡΡ ΡΠΎΡ ΡΠ°Π½ΡΡΡ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±ΠΎΠ»ΡΡΠ΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π² ΡΠΊΡΡΡΠΎΠΌ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅ ΠΈ ΡΠ°Π·ΡΠΌΠ½ΠΎ ΠΎΡΠ±ΡΠ°ΡΡΠ²Π°ΡΡ Π½Π΅Π²Π°ΠΆΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ β Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠΌ. ΠΠ΅ΠΊΠΎΠ΄Π΅Ρ ΠΎΠ±ΡΡΠ°Π΅ΡΡΡ ΠΏΡΠ΅Π²ΡΠ°ΡΠ°ΡΡ ΡΠΆΠ°ΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π² ΡΠΊΡΡΡΠΎΠΌ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅ Π² ΡΠ΅Π»ΠΎΠ΅ Π»ΠΈΡΠΎ Π·Π½Π°ΠΌΠ΅Π½ΠΈΡΠΎΡΡΠΈ.
ΠΠ²ΡΠΎΡΠ½ΠΊΠΎΠ΄Π΅ΡΡ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΌΠΈ Π΄Π»Ρ ΡΠΎΠΊΡΠ°ΡΠ΅Π½ΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΠ½ΠΎΡΡΠΈ ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΡΡΠΌΠΎΠ², ΠΈ ΠΌΠΎΠ³ΡΡ ΠΎΡΠ΅Π½Ρ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡΡ ΠΌΠ°ΡΠΈΠ½Π½ΡΠΉ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ Π±Π΅Π· ΡΡΠΈΡΠ΅Π»Ρ.
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ Π²Π°ΡΠΈΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ Π°Π²ΡΠΎΡΠ½ΠΊΠΎΠ΄Π΅Ρ (VAE)?
ΠΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, ΡΠΊΡΡΡΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ Z, ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΠΎΠ΅ ΡΠ½ΠΊΠΎΠ΄Π΅ΡΠΎΠΌ, ΡΠ΅Π΄ΠΊΠΎ Π·Π°ΡΠ΅Π»Π΅Π½ΠΎ, ΡΠΎ Π΅ΡΡΡ ΡΡΡΠ΄Π½ΠΎ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·Π°ΡΡ, ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π² ΡΡΠΎΠΌ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅. ΠΠ½Π°ΡΠ΅Π½ΠΈΡ ΡΠ°Π·Π±ΡΠΎΡΠ°Π½Ρ, ΠΈ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ ΠΎΠ±ΡΡΠ½ΠΎ Ρ ΠΎΡΠΎΡΠΎ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ Π² Π΄Π²ΡΡ ΠΌΠ΅ΡΠ½ΠΎΠΌ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΈ.
ΠΡΠΎ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΠ»Π΅Π·Π½Π°Ρ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡ Π΄Π»Ρ ΡΠΈΡΡΠ΅ΠΌ ΡΠΆΠ°ΡΠΈΡ (ΠΊΠΎΠΌΠΏΡΠ΅ΡΡΠΈΠΈ). ΠΠ΄Π½Π°ΠΊΠΎ Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ Π½ΠΎΠ²ΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Π·Π½Π°ΠΌΠ΅Π½ΠΈΡΠΎΡΡΠ΅ΠΉ ΡΡΠ° ΡΠ°Π·ΡΠ΅ΠΆΠ΅Π½Π½ΠΎΡΡΡ β ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π½Π°ΠΉΡΠΈ ΡΠΊΡΡΡΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ Π±ΡΠ΄Π΅Ρ Π·Π½Π°ΡΡ, ΠΊΠ°ΠΊ ΠΏΡΠΎΠΈΠ·Π²Π΅ΡΡΠΈ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, ΠΏΠΎΡΡΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.
ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, Π΅ΡΠ»ΠΈ Π² ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅ Π΅ΡΡΡ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΊΠ»Π°ΡΡΠ΅ΡΠ°ΠΌΠΈ, ΠΈ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡ Π²Π°ΡΠΈΠ°ΡΠΈΡ ΠΈΠ· ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΊΠ°, Π΅ΠΌΡ Π½Π΅ Ρ Π²Π°ΡΠΈΡ Π·Π½Π°Π½ΠΈΠΉ, ΡΡΠΎΠ±Ρ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠ΅.
ΠΠ°ΡΠΈΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ Π°Π²ΡΠΎΡΠ½ΠΊΠΎΠ΄Π΅Ρ Π΄Π΅Π»Π°Π΅Ρ Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΡΠΌ, Π±ΠΎΠ»Π΅Π΅ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΡΠΌ ΠΈ ΠΌΠ΅Π½Π΅Π΅ ΡΠ°Π·ΡΠ΅ΠΆΠ΅Π½Π½ΡΠΌ. ΠΠ°ΡΡΠ°Π²Π»ΡΡ ΡΠΊΡΡΡΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°ΡΡ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠΌΡ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ, VAE ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π½Π°Π΄ ΡΠΊΡΡΡΡΠΌ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎΠΌ.
ΠΠΌΠ΅ΡΡΠΎ ΠΏΡΡΠΌΠΎΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΡΠΊΡΡΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π΄Π΅ΠΊΠΎΠ΄Π΅ΡΡ, VAE ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΈΡ Π΄Π»Ρ ΡΠ°ΡΡΠ΅ΡΠ° ΡΡΠ΅Π΄Π½ΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΠΎΡΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠΉ. ΠΠ°ΡΠ΅ΠΌ Π²Ρ ΠΎΠ΄ Π΄Π΅ΠΊΠΎΠ΄Π΅ΡΠ° ΡΠΎΠ±ΠΈΡΠ°Π΅ΡΡΡ ΠΈΠ· ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π³ΠΎ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ.
Π ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ VAE Π·Π°ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΡΠΎ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π±ΡΡΡ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ Π±Π»ΠΈΠ·ΠΊΠΈΠΌ ΠΊ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΌΡ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠΌΡ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ, Π²ΠΊΠ»ΡΡΠ°Ρ Π² ΡΡΠ½ΠΊΡΠΈΡ ΠΏΠΎΡΠ΅ΡΡ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΠ΅ ΠΡΠ»ΡΠ±Π°ΠΊΠ°-ΠΠ΅ΠΉΠ±Π»Π΅ΡΠ°. VAE Π±ΡΠ΄Π΅Ρ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ, ΠΈΠ»ΠΈ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΡ Π²Π°ΡΠΈΠ°ΡΠΈΠΈ Π½Π° Π³ΡΠ°Π½ΡΡ , ΠΈ Π½Π΅ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π° Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌ, ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠΌ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΈ.
Π£ΡΠ»ΠΎΠ²Π½ΡΠ΅ Π²Π°ΡΠΈΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ Π°Π²ΡΠΎΡΠ½ΠΊΠΎΠ΄Π΅ΡΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΠΌΠΎΠ΄Π΅Π»ΠΈΡΠΎΠ²Π°ΡΡ Π²Ρ
ΠΎΠ΄ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΊΡΡΡΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ z, Π½ΠΎ ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π²ΡΠΎΠ΄Π΅ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΡ
ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ (ΡΠ»ΡΠ±ΠΊΠ°, ΠΎΡΠΊΠΈ, ΡΠ²Π΅Ρ ΠΊΠΎΠΆΠΈ ΠΈ Ρ.ΠΏ.)
ΠΠ΅Π½Π΅ΡΠ°ΡΠΎΡ Π΄Π°Π½Π½ΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ (ΡΡΠ»ΠΎΠ²Π½ΡΠΉ) VAE, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΌΠΎΠΆΠ΅Ρ ΠΎΠ±ΡΡΠ°ΡΡΡΡ Π½Π° Π»ΠΈΡΠ°Ρ Π·Π½Π°ΠΌΠ΅Π½ΠΈΡΠΎΡΡΠ΅ΠΉ. ΠΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΉ ΠΏΠΎ ΠΏΠ°ΠΌΡΡΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ Keras, ΡΡΠΎΠ±Ρ ΡΠΏΡΠ°Π²ΠΈΡΡΡΡ Ρ Π½Π°ΡΠΈΠΌ Π±ΠΎΠ»ΡΡΠΈΠΌ Π½Π°Π±ΠΎΡΠΎΠΌ Π΄Π°Π½Π½ΡΡ (202599 ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ, ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΠΏΠΎ 10ΠΠ± ΠΊΠ°ΠΆΠ΄ΠΎΠ΅). ΠΠ³ΠΎ ΡΠ΅Π»Ρ β ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΏΠ°ΠΊΠ΅ΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Π½Π° Π»Π΅ΡΡ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ.
import numpy as np
class CustomCelebrityFaceGenerator(Sequence):
# ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡ
def __init__(self, df, batch_size, target_height, target_width, conditioning_dim=0):
self.df = df
self.batch_size = batch_size
self.target_height = target_height
self.target_width = target_width
self.conditioning_dim = conditioning_dim
# ΠΏΠ΅ΡΠ΅ΡΠ°ΡΡΠ΅ΠΌ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΡΠ»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΠΏΠΎΡ
ΠΈ
def on_epoch_end(self):
self.df = self.df.sample(frac=1)
# Π²ΡΠ±Π΅ΡΠ΅ΠΌ ΠΏΠ°ΠΊΠ΅Ρ Π² Π²ΠΈΠ΄Π΅ ΡΠ΅Π½Π·ΠΎΡΠ°
def __getitem__(self, index):
cur_files = self.df.iloc[index*self.batch_size:(index+1)*self.batch_size]
X, y = self.__data_generation(cur_files)
return X, y
#
def __data_generation(self, cur_files):
# ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΠΏΡΡΡΡΠ΅ ΡΠ΅Π½Π·ΠΎΡΡ Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ
X = np.empty(shape=(self.batch_size, self.target_height, self.target_width, 3))
Y = np.empty(shape=(self.batch_size, self.target_height, self.target_width, 3))
# ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΠΏΡΡΡΠΎΠΉ ΡΠ΅Π½Π·ΠΎΡ Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ ΡΡΠ»ΠΎΠ²Π½ΡΡ
ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
if self.conditioning_dim > 0:
C = np.empty(shape=(self.batch_size, self.conditioning_dim))
# ΠΏΡΠΎΡ
ΠΎΠ΄ΠΈΠΌ ΡΠΈΠΊΠ»ΠΎΠΌ ΠΏΠΎ ΡΠ΅ΠΊΡΡΠ΅ΠΌΡ ΠΏΠ°ΠΊΠ΅ΡΡ ΠΈ ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠ΅Π½Π·ΠΎΡΡ
for i in range(0, self.batch_size):
# ΡΠΈΡΠ°Π΅ΠΌ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
file = cur_files.iloc[i]
img_uri = 'img_align_celeba/' + file.image_id
img = skimage.io.imread(img_uri)
# ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌ ΡΠ°Π·ΠΌΠ΅ΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ
if img.shape[0] != self.target_height or img.shape[1] != self.target_width:
img = skimage.transform.resize(img, (self.target_height, self.target_width))
# ΡΠΎΡ
ΡΠ°Π½ΡΠ΅ΠΌ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΡΠ΅Π½Π·ΠΎΡΠ°Ρ
img = img.astype(np.float32) / 255.
X[i] = img
Y[i] = img
# ΡΠΎΡ
ΡΠ°Π½ΡΠ΅ΠΌ ΡΡΠ»ΠΎΠ²Π½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π² ΡΠ΅Π½Π·ΠΎΡΠ°Ρ
if self.conditioning_dim > 0:
C[i] = list(file[1:file.shape[0]])
if self.conditioning_dim > 0:
return [X, C], Y
else:
return X, Y
# ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ²
def __len__(self):
return int(np.floor(self.df.shape[0] / self.batch_size))
ΠΠ΅ΠΉΡΠΎΠ½Π½Π°Ρ ΡΠ΅ΡΡ VAE
ΠΡ Ρ ΠΎΡΠΈΠΌ, ΡΡΠΎΠ±Ρ Π½Π°Ρ ΡΠ½ΠΊΠΎΠ΄Π΅Ρ Π±ΡΠ» ΡΠ²Π΅ΡΡΠΎΡΠ½ΠΎΠΉ Π½Π΅ΠΉΡΠΎΠ½Π½ΠΎΠΉ ΡΠ΅ΡΡΡ, ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΠ΅ΠΉ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π²ΡΠ΄Π°ΡΡΠ΅ΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Q(z | [x,c]), Π³Π΄Π΅ x β Π²Ρ ΠΎΠ΄Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π»ΠΈΡΠ°, c β ΡΡΠ»ΠΎΠ²Π½Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ (Π°ΡΡΠΈΠ±ΡΡΡ Π»ΠΈΡΠ°), Π° z β ΡΠΊΡΡΡΠ°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ. Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΏΡΠΎΡΡΡΡ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ, ΡΠΎΡΡΠΎΡΡΡΡ ΠΈΠ· Π΄Π²ΡΡ ΡΠ²Π΅ΡΡΠΎΡΠ½ΡΡ ΡΠ»ΠΎΠ΅Π² ΠΈ ΡΠ»ΠΎΡ Π³ΡΡΠΏΠΏΠΈΡΠΎΠ²ΠΊΠΈ (pooling).
ΠΠ΅ΠΊΠΎΠ΄Π΅Ρ β ΡΡΠΎ ΡΠ²Π΅ΡΡΠΎΡΠ½Π°Ρ Π½Π΅ΠΉΡΠΎΠ½Π½Π°Ρ ΡΠ΅ΡΡ, ΠΏΠΎΡΡΡΠΎΠ΅Π½Π½Π°Ρ ΠΏΠΎ-Π΄ΡΡΠ³ΠΎΠΌΡ. ΠΡΠΎ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠ²Π½Π°Ρ Π½Π΅ΠΉΡΠΎΠ½Π½Π°Ρ ΡΠ΅ΡΡ, Π²ΡΠ΄Π°ΡΡΠ°Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΏΠΎΡ
ΠΎΠΆΠ΅ΡΡΠΈ P([x,z] | c).
from keras.layers import Conv2D, MaxPooling2D, UpSampling2D
def get_encoder_network(x, num_filters):
x = Conv2D(num_filters, 3, activation='relu', padding='same', kernel_initializer='he_normal')(x)
x = Conv2D(num_filters, 3, activation='relu', padding='same', kernel_initializer='he_normal')(x)
x = MaxPooling2D()(x)
return x
def get_decoder_network(x, num_filters):
x = UpSampling2D()(x)
x = Conv2D(num_filters, 3, activation='relu', padding = 'same', kernel_initializer = 'he_normal')(x)
x = Conv2D(num_filters, 3, activation='relu', padding = 'same', kernel_initializer = 'he_normal')(x)
return x
ΠΠΎΡ ΡΠ°ΠΊ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ° Π²ΡΠ΅ΠΉ ΡΠ΅ΡΠΈ VAE:
from keras.layers import Input, Dense, Reshape, Concatenate, Flatten, Lambda, Reshape
from keras.models import Model
from keras import backend as K
from keras.optimizers import Adam
# ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½Π΅ΠΉΡΠΎΠ½Π½ΠΎΠΉ ΡΠ΅ΡΠΈ Π°Π²ΡΠΎΡΠ½ΠΊΠΎΠ΄Π΅ΡΠ°
def get_vae(height, width, batch_size, latent_dim,
is_variational=True, conditioning_dim=0,
start_filters=8, nb_capacity=3,
optimizer=Adam(lr=0.001)):
# ΠΠ₯ΠΠ ##
# ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠ»ΠΎΠΉ Π΄Π»Ρ Π²Ρ
ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ
# ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΠ΅ΠΌ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ
inputs = Input((height, width, 3))
if conditioning_dim > 0:
condition = Input([conditioning_dim])
condition_up = Dense(height * width)(condition)
condition_up = Reshape([height, width, 1])(condition_up)
inputs_new = Concatenate(axis=3)([inputs, condition_up])
else:
inputs_new = inputs
# ΠΠΠΠΠΠΠ ##
# ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΠΊΠΎΠ΄ΠΈΡΡΡΡΠΈΠ΅ ΡΠ»ΠΎΠΈ
# Π΄ΡΠ±Π»ΠΈΡΡΠ΅ΠΌ ΠΊΠΎΠ΄ΠΈΡΡΡΡΠΈΠ΅ ΡΠ»ΠΎΠΈ, ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Ρ ΡΠΈΠ»ΡΡΡΡ
eblock = get_encoder_network(inputs_new, start_filters)
for i in range(1, nb_capacity+1):
eblock = get_encoder_network(eblock, start_filters*(2**i))
# ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠ»ΠΎΠΉ ΡΠΊΡΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π°
_, *shape_spatial = eblock.get_shape().as_list()
eblock_flat = Flatten()(eblock)
if not is_variational:
z = Dense(latent_dim)(eblock_flat)
else:
# Π²ΡΠ±ΠΎΡΠΊΠ° ΡΠΊΡΡΡΡΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΈΠ· Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ
def sampling(args):
z_mean, z_log_sigma = args
epsilon = K.random_normal(shape=(batch_size, latent_dim), mean=0., stddev=1.)
return z_mean + K.exp(z_log_sigma) * epsilon
z_mean = Dense(latent_dim)(eblock_flat)
z_log_sigma = Dense(latent_dim)(eblock_flat)
z = Lambda(sampling, output_shape=(latent_dim,))([z_mean, z_log_sigma])
if conditioning_dim > 0:
z_ext = Concatenate()([z, condition])
## ΠΠΠΠΠΠΠ ##
# ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΡΡΡΠΈΠ΅ ΡΡΠ°ΡΡΠΈ
inputs_embedding = Input([latent_dim + conditioning_dim])
embedding = Dense(np.prod(shape_spatial), activation='relu')(inputs_embedding)
embedding = Reshape(eblock.shape.as_list()[1:])(embedding)
# Π΄ΡΠ±Π»ΠΈΡΡΠ΅ΠΌ ΠΊΠΎΠ΄ΠΈΡΡΡΡΠΈΠ΅ ΡΠ»ΠΎΠΈ, ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Ρ ΡΠΈΠ»ΡΡΡΡ
dblock = get_decoder_network(embedding, start_filters*(2**nb_capacity))
for i in range(nb_capacity-1, -1, -1):
dblock = get_decoder_network(dblock, start_filters*(2**i))
output = Conv2D(3, 1, activation = 'tanh')(dblock)
## VAE ##
# ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΡΠ΅ΠΌ ΡΠ½ΠΊΠΎΠ΄Π΅Ρ Ρ Π΄Π΅ΠΊΠΎΠ΄Π΅ΡΠΎΠΌ
decoder = Model(input = inputs_embedding, output = output)
if conditioning_dim > 0:
encoder_with_sampling = Model(input = [inputs, condition], output = z)
encoder_with_sampling_ext = Model(input = [inputs, condition], output = z_ext)
vae_out = decoder(encoder_with_sampling_ext([inputs, condition]))
vae = Model(input = [inputs, condition], output = vae_out)
else:
encoder_with_sampling = Model(input = inputs, output = z)
vae_out = decoder(encoder_with_sampling(inputs))
vae = Model(input = inputs, output = vae_out)
# ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ ΠΏΠΎΡΠ΅ΡΠΈ VAE ΠΊΠ°ΠΊ ΡΡΠΌΠΌΡ MSE and ΠΏΠΎΡΠ΅ΡΡ ΡΠ°ΡΡΡΠΎΡΠ½ΠΈΡ ΠΡΠ»ΡΠ±Π°ΠΊΠ°-ΠΠ΅ΠΉΠ±Π»Π΅ΡΠ°
def vae_loss(x, x_decoded_mean):
mse_loss = K.mean(mse(x, x_decoded_mean), axis=(1,2)) * height * width
kl_loss = - 0.5 * K.mean(1 + z_log_sigma - K.square(z_mean) - K.exp(z_log_sigma), axis=-1)
return mse_loss + kl_loss
if is_variational:
vae.compile(loss=vae_loss, optimizer=optimizer)
else:
vae.compile(loss='mse', optimizer=optimizer)
return vae, encoder_with_sampling, decoder
# Π³ΠΈΠΏΠ΅ΡΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ
VARIATIONAL = True
HEIGHT = 128
WIDTH = 128
BATCH_SIZE = 16
LATENT_DIM = 16
START_FILTERS = 32
CAPACITY = 3
CONDITIONING = True
OPTIMIZER = Adam(lr=0.01)
vae, encoder, decoder = get_vae(is_variational=VARIATIONAL,
height=HEIGHT,
width=WIDTH,
batch_size=BATCH_SIZE,
latent_dim=LATENT_DIM,
conditioning_dim=df_celeb.shape[1]-1,
start_filters=START_FILTERS,
nb_capacity=CAPACITY,
optimizer=OPTIMIZER)
ΠΠ±ΡΡΠ΅Π½ΠΈΠ΅
ΠΠΈΠΆΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ ΠΏΡΠΎΡΠ΅ΡΡ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ VAE Π½Π° Π½Π°Π±ΠΎΡΠ΅ Π΄Π°Π½Π½ΡΡ
celebA. ΠΡΠΎΡ ΠΊΠΎΠ΄ Π²ΡΠΏΠΎΠ»Π½ΡΠ»ΡΡ ΠΎΠΊΠΎΠ»ΠΎ 8 ΡΠ°ΡΠΎΠ² Π½Π° ΠΈΠ½ΡΡΠ°Π½ΡΠ΅ AWS Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ 1 GPU.
# Π΄Π΅Π»ΠΈΠΌ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π½Π° ΡΡΠ΅Π½ΠΈΡΠΎΠ²ΠΎΡΠ½ΡΠΉ Π½Π°Π±ΠΎΡ ΠΈ Π½Π°Π±ΠΎΡ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ
msk = np.random.rand(len(df_celeb)) < 0.5
df_celeb_train = df_celeb[msk]
df_celeb_val = df_celeb[~msk]
# ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Π΄Π»Ρ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ
gen = CustomCelebrityFaceGenerator(df_celeb_train,
batch_size=BATCH_SIZE,
target_height=HEIGHT,
target_width=WIDTH,
conditioning_dim=df_celeb.shape[1]-1)
# ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π³Π΅Π½Π΅ΡΠ°ΡΠΎΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Π΄Π»Ρ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ
gen_val = CustomCelebrityFaceGenerator(df_celeb_val,
batch_size=BATCH_SIZE,
target_height=HEIGHT,
target_width=WIDTH,
conditioning_dim=df_celeb.shape[1]-1)
# ΠΎΠ±ΡΡΠ°Π΅ΠΌ Π²Π°ΡΠΈΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ Π°Π²ΡΠΎΡΠ½ΠΊΠΎΠ΄Π΅Ρ
vae.fit_generator(gen, verbose=1, epochs=20, validation_data=gen_val)
ΠΠΈΠ·ΡΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΡΠΊΡΡΡΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ
ΠΠΎΡΠ»Π΅ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΡΠ±ΡΠ°ΡΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ· Π½Π°ΡΠ΅Π³ΠΎ Π½Π°Π±ΠΎΡΠ° Π΄Π°Π½Π½ΡΡ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΡΠ΅Π½Π½ΡΠΉ ΡΠ½ΠΊΠΎΠ΄Π΅Ρ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΊΡΡΡΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ.
# Π²ΡΠ±ΠΈΡΠ°Π΅ΠΌ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
sample_img, sample_img_meta = show_sample_image(nb=1)
# ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡΠ°Ρ Π΅Π³ΠΎ ΡΠΊΡΡΡΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅
def encode_image(img, conditioning, encoder, height, width, batch_size):
# ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌ ΡΠ°Π·ΠΌΠ΅ΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ
if img.shape[0] != height or img.shape[1] != width:
img = skimage.transform.resize(img, (height, width))
# Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅ΠΌ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, ΡΡΠΎΠ±Ρ ΠΎΠ½ΠΎ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°Π»ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΡ ΠΏΠ°ΠΊΠ΅ΡΠ°
img_single = np.expand_dims(img, axis=0)
img_single = img_single.astype(np.float32)
img_single = np.repeat(img_single, batch_size, axis=0)
# ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠ½ΠΊΠΎΠ΄Π΅Ρ Π΄Π»Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ Π² ΡΠΊΡΡΡΠΎΠΌ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅
if conditioning is None:
z = encoder.predict(img_single)
else:
z = encoder.predict([img_single, np.repeat(np.expand_dims(conditioning, axis=0), batch_size, axis=0)])
return z
# Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π² ΡΠΊΡΡΡΠΎΠΌ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π΅, ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠ΅ ΡΠ½ΠΊΠΎΠ΄Π΅ΡΠΎΠΌ
z = encode_image(sample_img.astype(np.float32) / 255.,
np.array(sample_img_meta),
encoder, HEIGHT, WIDTH, BATCH_SIZE)
print('latent sample:\n', z[0])
ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠΎ ΡΠΊΡΡΡΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅, Π²Π΅ΠΊΡΠΎΡ ΠΈΠ· 16 Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΡ
ΡΠΈΡΠ΅Π», ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ, ΠΊΠ°ΠΊ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ» ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅.
def decode_embedding(z, conditioning, decoder):
if z.ndim < 2:
z = np.expand_dims(z, axis=0)
if conditioning is not None:
z = np.concatenate((z, np.repeat(np.expand_dims(conditioning, axis=0), z.shape[0], axis=0)), axis=1)
return decoder.predict(z)
# Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠΊΡΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π°
ret = decode_embedding(z, sample_img_meta, decoder)
plt.imshow(ret[0])
plt.show()
Π₯ΠΎΡΡ ΡΠ΅ΠΊΠΎΠ½ΡΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΡΠ°Π·ΠΌΡΡΠΎ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΠΎΠ½ΠΎ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΡ
ΠΎΠΆΠ΅ Π½Π° ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅: ΠΏΠΎΠ», ΡΠ²Π΅Ρ ΠΎΠ΄Π΅ΠΆΠ΄Ρ, Π²ΠΎΠ»ΠΎΡΡ, ΡΠ»ΡΠ±ΠΊΠ°, ΡΠ²Π΅Ρ ΠΊΠΎΠΆΠΈ.
ΠΠ΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌ Π½ΠΎΠ²ΡΠ΅ Π»ΠΈΡΠ°
Π£ΡΠ»ΠΎΠ²Π½ΡΠ΅ VAE ΠΌΠΎΠ³ΡΡ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΡΠΊΡΡΡΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ, ΡΡΠΎΠ±Ρ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ Π½ΠΎΠ²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅. Π ΡΡΠΎ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π½ΠΎΠ²ΡΡ
ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΄Π΅ΠΊΠΎΠ΄Π΅ΡΠ°, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡ ΡΠ°Π·Π½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Π½Π½ΡΡ
Π°ΡΡΠΈΠ±ΡΡΠΎΠ².
def generate_new_images_vae(nb=16, smiling=None, male=None, no_beard=None, attractive=None,
bald=None, chubby=None, eyeglasses=None, young = None):
sample_training_img, sample_training_img_meta = show_sample_image(nb=1, verbose=False)
plt.clf();
f, ax = plt.subplots(2, nb//2, figsize=(20,7));
for i in range(nb):
meta=2*np.random.rand(meta_cols.shape[0])-1
meta[2] = attractive if attractive else meta[2]
meta[4] = bald if bald else meta[4]
meta[13] = chubby if chubby else meta[13]
meta[15] = eyeglasses if eyeglasses else meta[15]
meta[20] = male if male else meta[20]
meta[24] = no_beard if no_beard else meta[24]
meta[31] = smiling if smiling else meta[31]
meta[39] = young if young else meta[39]
z1 = np.random.rand(LATENT_DIM, LATENT_DIM)
ret = decode_embedding(z1, meta, decoder)
ax[i%2][i//2].imshow(ret[0])
ax[i%2][i//2].set_title('generated img {}'.format(i))
ax[0][0].imshow(sample_training_img)
ax[0][0].set_title('training img')
generate_new_images_vae()
Π₯ΠΎΡΡ Π½Π°Ρ Π²Π°ΡΠΈΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ Π°Π²ΡΠΎΡΠ½ΠΊΠΎΠ΄Π΅Ρ Π²ΡΠ΄Π°Π΅Ρ ΡΠ°Π·ΠΌΡΡΡΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, Π½Π΅ ΠΏΠΎΡ
ΠΎΠΆΠΈΠ΅ Π½Π° ΡΠ΅Π°Π»ΠΈΡΡΠΈΡΠ½ΡΠ΅ ΡΠΎΡΠΎΠ³ΡΠ°ΡΠΈΠΈ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ°ΡΠΏΠΎΠ·Π½Π°ΡΡ Π½Π° ΡΡΠΈΡ
ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡΡ
ΠΏΠΎΠ», ΡΠ²Π΅Ρ ΠΊΠΎΠΆΠΈ, ΡΠ»ΡΠ±ΠΊΡ, ΠΎΡΠΊΠΈ ΠΈ ΡΠ²Π΅Ρ Π²ΠΎΠ»ΠΎΡ Π»ΡΠ΄Π΅ΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π»ΠΈ.
ΠΡ ΡΠ»ΡΠ±ΠΊΠΈ ΡΡΠ°Π½Π΅Ρ ΠΌΠΈΡ ΡΠ²Π΅ΡΠ»Π΅ΠΉ
Π£ΡΠ»ΠΎΠ²Π½ΡΠ΅ VAE ΠΌΠΎΠ³ΡΡ ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡΡ ΠΈΠ½ΡΠ΅ΡΠΏΠΎΠ»ΡΡΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ Π°ΡΡΠΈΠ±ΡΡΠ°ΠΌΠΈ, ΡΠΎ Π΅ΡΡΡ ΠΎΠ½ΠΈ ΡΠΏΠΎΡΠΎΠ±Π½Ρ Π·Π°ΡΡΠ°Π²ΠΈΡΡ Π»ΠΈΡΠΎ ΡΠ»ΡΠ±Π°ΡΡΡΡ ΠΈΠ»ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΎΡΠΊΠΈ, Π΅ΡΠ»ΠΈ ΠΈΡ Π½Π΅ Π±ΡΠ»ΠΎ ΠΏΡΠ΅ΠΆΠ΄Π΅. Π‘Π΅ΠΉΡΠ°Ρ ΠΌΡ Π²ΡΠ±Π΅ΡΠ΅ΠΌ Π»ΠΈΡΠΎ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΠΉ Π·Π½Π°ΠΌΠ΅Π½ΠΈΡΠΎΡΡΠΈ ΠΈΠ· Π½Π°ΡΠ΅Π³ΠΎ Π½Π°Π±ΠΎΡΠ° Π΄Π°Π½Π½ΡΡ ΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΡΠΊΡΡΡΠΎΠ³ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ, ΡΡΠΎΠ±Ρ ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΡΡ ΠΆΠ΅Π½ΡΠΊΠΎΠ΅ Π»ΠΈΡΠΎ Π² ΠΌΡΠΆΡΠΊΠΎΠ΅. ΠΡ ΡΠ°ΠΊΠΆΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ Π»ΠΈΡΠ°, Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π½Π° Π½ΠΈΡ ΡΠ»ΡΠ±ΠΊΡ, ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ°ΠΌ Π½Π΅ Π±ΡΠ»ΠΎ.
# ΠΈΠ½ΡΠ΅ΡΠΏΠΎΠ»ΡΡΠΈΡ ΡΠΊΡΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π°, ΡΡΠΎΠ±Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
def display_manifold(decoder, height, width, base_vec,
bound_x=15, bound_y=15,
axis_x=0, axis_y=1, n=15,
desc_x = 'x', desc_y = 'y',
file_out=None):
figure = np.zeros((height * (n if bound_y > 0 else 1), width * (n if bound_x > 0 else 1), 3))
grid_x = np.linspace(-bound_x, bound_x, n) if bound_x > 0 else [0]
grid_y = np.linspace(-bound_y, bound_y, n) if bound_y > 0 else [0]
individual_outputs = []
for i, yi in enumerate(grid_y):
for j, xi in enumerate(grid_x):
z_sample = base_vec.copy()
z_sample[axis_x] = xi
z_sample[axis_y] = yi
x_decoded = decoder.predict(np.expand_dims(z_sample, axis=0))
sample = np.clip(x_decoded[0], 0, 1)
figure[i * height: (i + 1) * height, j * width: (j + 1) * width] = sample
individual_outputs.append(sample)
plt.figure(figsize=(10, 10))
plt.imshow(figure)
plt.xlabel(desc_x)
plt.ylabel(desc_y)
if file_out is not None:
plt.savefig(file_out, dpi=200, bbox_inches='tight')
return figure, individual_outputs
# Π΄ΠΎΡΡΡΠΏΠ½ΡΠ΅ Π°ΡΡΠΈΠ±ΡΡΡ
meta_cols = df_celeb.columns[1:].values
# ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠ΅ Π°ΡΡΠΈΠ±ΡΡΡ
dim1 = 'Male'
dim2 = 'Smiling'
# ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ΅ ΡΠΊΡΡΡΠΎΠ΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ
base_vec = np.array(list(z[0]) + sample_img_meta)
# ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ
rendering, _ = display_manifold(
decoder,
HEIGHT,
WIDTH,
base_vec,
bound_x=15,
bound_y=15,
axis_x=LATENT_DIM + np.where(meta_cols==dim1)[0][0],
axis_y=LATENT_DIM + np.where(meta_cols==dim2)[0][0],
n=10,
desc_x = dim1,
desc_y = dim2,
file_out = 'rendering_celeba_' + dim1.lower() + '_' + dim2.lower() + '.png'
)
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠ»ΠΈ ΡΡΠ»ΠΎΠ²Π½ΡΠ΅ Π²Π°ΡΠΈΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ Π°Π²ΡΠΎΡΠ½ΠΊΠΎΠ΄Π΅ΡΡ ΠΈ ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°Π»ΠΈ, ΠΊΠ°ΠΊ ΠΈΡ
ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡΡΠΈΡΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ Π½ΠΎΠ²ΡΡ
ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½Π½ΡΡ
Π΄Π°Π½Π½ΡΡ
. ΠΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΠ»ΠΈ ΠΊΠΎΠ΄ Π½Π° Python Π΄Π»Ρ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ VAE Π½Π° Π±ΠΎΠ»ΡΡΠΈΡ
Π½Π°Π±ΠΎΡΠ°Ρ
Π΄Π°Π½Π½ΡΡ
ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Π·Π½Π°ΠΌΠ΅Π½ΠΈΡΠΎΡΡΠ΅ΠΉ. ΠΡΠΎΡ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ ΠΈ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈ Π΄Π»Ρ ΠΌΠ½ΠΎΠ³ΠΈΡ
Π΄ΡΡΠ³ΠΈΡ
Π·Π°Π΄Π°Ρ.
ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΠ²Π½ΡΠ΅ ΡΠΎΡΡΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠ΅ΡΠΈ (GAN), ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, Π²ΡΠ΄Π°ΡΡ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠ³Π»ΡΠ΄ΡΡ Π΅ΡΠ΅ Π»ΡΡΡΠ΅, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ΠΈ ΠΎΠ±ΡΡΠ°ΡΡΡΡ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°ΡΡ, ΡΡΠΎ Π»ΡΠ΄ΠΈ ΡΡΠΈΡΠ°ΡΡ ΡΠΎΡΠΎΡΠ΅Π°Π»ΠΈΡΡΠΈΡΠ½ΡΠΌ, Π° ΡΡΠΎ Π½Π΅Ρ.
ΠΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°ΡΠΏΠ΅ΠΊΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ VAE/GAN Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ΅ΠΉΠΊΠΎΠ²ΡΡ
ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ, Π²ΠΈΠ΄Π΅ΠΎ ΠΈ Π½ΠΎΠ²ΠΎΡΡΠ΅ΠΉ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΡΠ΅ΡΡΠ΅Π·Π½ΠΎ, ΠΈ ΠΎΠ½ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ ΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ.
ΠΠ³ΡΠΎΠΌΠ½ΠΎΠ΅ ΡΠΏΠ°ΡΠΈΠ±ΠΎ ΠΠΈΠ½ΡΠ΅Π½ΡΡ ΠΠ°ΡΡΠ΅ΡΡ (Vincent Casser) Π·Π° Π΅Π³ΠΎ Π·Π°ΠΌΠ΅ΡΠ°ΡΠ΅Π»ΡΠ½ΡΠΉ ΠΊΠΎΠ΄, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΠ΄Π²ΠΈΠ½ΡΡΡΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΊ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ²Π΅ΡΡΠΎΡΠ½ΡΡ Π°Π²ΡΠΎΡΠ½ΠΊΠΎΠ΄Π΅ΡΠΎΠ² Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΉ Π² Π΅Π³ΠΎ Π±Π»ΠΎΠ³Π΅. ΠΠΈΠ½ΡΠ΅Π½Ρ ΡΠ°Π·ΡΠ΅ΡΠΈΠ» ΠΌΠ½Π΅ Π°Π΄Π°ΠΏΡΠΈΡΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ ΠΊΠΎΠ΄ VAE Π΄Π»Ρ ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠΈ. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΡΠ΅Π³ΠΎ VAE Ρ Π½ΡΠ»Ρ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎ, ΡΠ°ΠΊ ΡΡΠΎ Π·Π° ΠΊΠΎΠ΄ ΡΠ»Π΅Π΄ΡΠ΅Ρ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠΈΡΡ ΠΠΈΠ½ΡΠ΅Π½ΡΠ°.
Π₯ΠΎΡΡ ΠΎΡΠ²ΠΎΠΈΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ ΠΈ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ , Π½ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ. Π§ΡΠΎ Π΄Π΅Π»Π°ΡΡ?
ΠΠ»Π³ΠΎΡΠΈΡΠΌΡ ΠΈ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½Π΅ΠΏΡΠΎΡΡΠ°Ρ ΡΠ΅ΠΌΠ° Π΄Π»Ρ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΡΡΠ΅Π½ΠΈΡ: Π½Π΅ Ρ ΠΊΠΎΠ³ΠΎ ΡΠΏΡΠΎΡΠΈΡΡ ΠΈ ΡΡΠΎ-ΡΠΎ ΡΡΠΎΡΠ½ΠΈΡΡ. ΠΠΎΡΡΠΎΠΌΡ ΠΌΡ Π·Π°ΠΏΡΡΡΠΈΠ»ΠΈ ΠΊΡΡΡ Β«ΠΠ»Π³ΠΎΡΠΈΡΠΌΡ ΠΈ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ Β», Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ Π² ΡΠΎΡΠΌΠ°ΡΠ΅ Π΅ΠΆΠ΅Π½Π΅Π΄Π΅Π»ΡΠ½ΡΡ Π²Π΅Π±ΠΈΠ½Π°ΡΠΎΠ² Π²Ρ:
- ΠΈΠ·ΡΡΠΈΡΠ΅ ΡΠ»Π΅Π½Π³, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΌ Π³ΠΎΠ²ΠΎΡΡΡ Π²ΡΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠ·ΡΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ: ΡΠ·ΡΠΊ Π°Π»Π³ΠΎΡΠΈΡΠΌΠΎΠ² ΠΈ ΡΡΡΡΠΊΡΡΡ Π΄Π°Π½Π½ΡΡ ;
- Π½Π°ΡΡΠΈΡΠ΅ΡΡ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌΡ ΠΈ ΡΡΡΡΠΊΡΡΡΡ Π΄Π°Π½Π½ΡΡ ΠΏΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ;
- ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΈΡΠ΅ΡΡ ΠΊ ΡΠ΅Ρ Π½ΠΈΡΠ΅ΡΠΊΠΎΠΌΡ ΡΠΎΠ±Π΅ΡΠ΅Π΄ΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΏΡΠΎΠ΄Π²ΠΈΠ½ΡΡΠΎΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅.
ΠΡΡΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ ΠΊΠ°ΠΊ junior, ΡΠ°ΠΊ ΠΈ middle-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌ.
ΠΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ