Шта је Аутоенцодер?
Аутоенцодер је алат за учење података кодирања ефикасно на без надзора начин. То је врста вештачке неуронске мреже која вам помаже да научите представљање скупова података за смањење димензионалности тако што тренирате неуронску мрежу да игнорише шум сигнала. То је одличан алат за поновно стварање улазних података.
Једноставним речима, машина прави, рецимо слику, и може створити блиско повезану слику. Улаз у ову врсту неуронске мреже није обележен, што значи да је мрежа способна да учи без надзора. Тачније, мрежа кодира улаз како би се фокусирао само на најкритичнију карактеристику. То је један од разлога зашто је аутокодер популаран због смањења димензионалности. Поред тога, аутокодери се могу користити за стварање генеративних модела учења . На пример, неуронска мрежа се може обучити са низом лица, а затим може створити нова лица.
У овом водичу за ТенсорФлов Аутоенцодер научићете:
- Шта је Аутоенцодер?
- Како Аутоенцодер ради?
- Пример сложених аутоматских кодера
- Направите Аутоенцодер помоћу ТенсорФлов-а
- Предобрада слике
- Подесите процењивач скупа података
- Изградите мрежу
Како Аутоенцодер ради?
Сврха аутоматског кодера је да произведе приближну вредност улазних података фокусирајући се само на битне карактеристике. Можда помислите зашто једноставно не научите како копирати и налепити улаз да бисте добили излаз. У ствари, аутокодер је скуп ограничења која присиљавају мрежу да научи нове начине за представљање података, који се разликују од пуког копирања резултата.
Типични аутокодер је дефинисан улазом, интерним приказом и излазом (апроксимација улаза). Учење се одвија у слојевима повезаним са унутрашњим представљањем. У ствари, постоје два главна блока слојева који изгледају као традиционална неуронска мрежа. Мала разлика је у томе што слој који садржи излаз мора бити једнак улазу. На слици испод, оригинални улаз иде у први блок који се назива енкодер . Ова интерна репрезентација компримује (смањује) величину улаза. У другом блоку се дешава реконструкција улаза. Ово је фаза декодирања.

Рад Аутоенцодера
Модел ће ажурирати тежине тако што ће смањити функцију губитка. Модел се кажњава ако се излаз реконструкције разликује од улаза.
Конкретно, замислите слику величине 50к50 (тј. 250 пиксела) и неуронску мрежу са само једним скривеним слојем који се састоји од стотину неурона. Учење се врши на мапи карактеристика која је два пута мања од улазне. То значи да мрежа треба да пронађе начин за реконструкцију 250 пиксела са само вектором неурона једнаким 100.
Пример сложених аутоматских кодера
У овом упутству за Аутоенцодер научићете како се користи наслагани аутоенцодер. Архитектура је слична традиционалној неуронској мрежи. Улаз иде на скривени слој да би се стиснуо или смањио његову величину, а затим достиже слојеве за реконструкцију. Циљ је створити излазну слику која је блиска оригиналу. Модел мора да научи начин да свој задатак постигне под одређеним ограничењима, односно са нижом димензијом.
Данас се аутокодери у дубоком учењу углавном користе за означавање слике. Замислите слику са огреботинама; човек је још увек у стању да препозна садржај. Идеја отказивања аутоматског кодера је додавање шума слици како би мрежа присилила да научи образац који стоји иза података.
Друга корисна породица Аутоенцодер Дееп Леарнинг је варијациони аутоенцодер. Ова врста мреже може да генерише нове слике. Замислите да тренирате мрежу са ликом човека; таква мрежа може створити нова лица.
Направите Аутоенцодер помоћу ТенсорФлов-а
У овом упутству ћете научити како да направите наслагани аутокодер за реконструкцију слике.
Користићете ЦИФАР-10 скуп података који садржи 60000 слика у боји 32к32. Скуп података Аутоенцодер-а већ је подељен између 50000 слика за обуку и 10000 за тестирање. Постоји до десет часова:
- Авион
- Аутомобиле
- Бирд
- Мачка
- Јелен
- Пас
- Жаба
- Коњ
- Брод
- Камион
Потребно је да преузмете слике са овог УРЛ-а хттпс://ввв.цс.торонто.еду/~криз/цифар.хтмл и распакујете их. Мапа фор-10-батцх-пи садржи пет серија података са по 10000 слика у случајном редоследу.
Пре него што направите и обучите свој модел, потребно је да примените обраду података. Наставићете како следи:
- Увезите податке
- Претворите податке у црно-бели формат
- Додајте све серије
- Конструисати скуп података о обуци
- Направите визуелизатор слике
Предобрада слике
Корак 1) Увезите податке.
Према званичном веб месту, податке можете отпремити са следећим кодом. Код аутоматског кодирања учитава податке у речник са подацима и ознаком . Имајте на уму да је код функција.
import numpy as npimport tensorflow as tfimport pickledef unpickle(file):import picklewith open(file, 'rb') as fo:dict = pickle.load(fo, encoding='latin1')return dict
Корак 2) Претворите податке у црно-бели формат
Ради једноставности податке ћете претворити у сиве тонове. Односно, са само једном димензијом против три за слику у боји. Већина неуронске мреже ради само са једнодимензионалним улазом.
def grayscale(im):return im.reshape(im.shape[0], 3, 32, 32).mean(1).reshape(im.shape[0], -1)
Корак 3) Додајте све серије
Сада када су обе функције креиране и скуп података учитан, можете написати петљу за додавање података у меморију. Ако пажљиво проверите, распакована датотека са подацима назива се дата_батцх_ са бројем од 1 до 5. Можете да пређете петљу по датотекама и додате је подацима.
Када је овај корак завршен, податке о бојама претворите у формат сиве скале. Као што видите, облик података је 50000 и 1024. 32 * 32 пиксела су сада поравнати са 2014. годином.
# Load the data into memorydata, labels = [], []## Loop over the bfor i in range(1, 6):filename = './cifar-10-batches-py/data_batch_' + str(i)open_data = unpickle(filename)if len(data)> 0:data = np.vstack((data, open_data['data']))labels = np.hstack((labels, open_data['labels']))else:data = open_data['data']labels = open_data['labels']data = grayscale(data)x = np.matrix(data)y = np.array(labels)print(x.shape)(50000, 1024)
Напомена: Промените './цифар-10-батцхес-пи/дата_батцх_' на стварну локацију ваше датотеке. На пример, за Виндовс машину, стаза може бити име датотеке = 'Е: \ цифар-10-батцхес-пи \ дата_батцх_' + стр (и)
Корак 4) Конструисати скуп података о обуци
Да би тренинг био бржи и лакши, тренираћете модел само на сликама коња. Коњи су седма класа у подацима о етикети. Као што је поменуто у документацији скупа података ЦИФАР-10, свака класа садржи 5000 слика. Можете да одштампате облик података да бисте потврдили да постоји 5.000 слика са 1024 колоне, као што је приказано у доњем кораку примера ТенсорФлов Аутоенцодер.
horse_i = np.where(y == 7)[0]horse_x = x[horse_i]print(np.shape(horse_x))(5000, 1024)
Корак 5) Направите визуелизатор слике
На крају, конструишете функцију за цртање слика. Ова функција ће вам требати за испис реконструисане слике са аутокодер-а.
Једноставан начин за штампање слика је коришћење објекта имсхов из библиотеке матплотлиб. Имајте на уму да треба да претворите облик података из 1024 у 32 * 32 (тј. Формат слике).
# To plot pretty figures%matplotlib inlineimport matplotlibimport matplotlib.pyplot as pltdef plot_image(image, shape=[32, 32], cmap = "Greys_r"):plt.imshow(image.reshape(shape), cmap=cmap,interpolation="nearest")plt.axis("off")
Функција узима 3 аргумента:
- Слика: улаз
- Облик: листа, димензија слике
- Цмап: одаберите мапу боја. Подразумевано сива
Можете покушати да нацртате прву слику у скупу података. Требао би да видиш човека на коњу.
plot_image(horse_x[1], shape=[32, 32], cmap = "Greys_r")
Подесите процењивач скупа података
У реду, сада када је скуп података спреман за употребу, можете почети да користите Тенсорфлов. Пре него што направимо модел, употребимо процењивач скупова података компаније Тенсорфлов за напајање мреже.
Израдићете скуп података помоћу процењивача ТенсорФлов. Да бисте освежили свој ум, потребно је да користите:
- фром_тенсор_слицес
- понављање
- батцх
Пун код за изградњу скупа података је:
dataset = tf.data.Dataset.from_tensor_slices(x).repeat().batch(batch_size)
Имајте на уму да је к чувар места следећег облика:
- [Ноне, н_инпутс]: Подесите на Ноне, јер је број уноса слика у мрежу једнак величини серије.
за детаље, погледајте туторијал о линеарној регресији.
После тога треба да креирате итератор. Без ове линије кода, ниједан податак неће проћи кроз цевовод.
iter = dataset.make_initializable_iterator() # create the iteratorfeatures = iter.get_next()
Сада када је цевовод спреман, можете да проверите да ли је прва слика иста као и раније (тј. Човек на коњу).
Величину серије сте поставили на 1 јер скуп података желите да храните само једном сликом. Димензије података можете видети са принтом (сесс.рун (карактеристике) .схапе). Једнако је (1, 1024). 1 значи да је убачена само једна слика са 1024. Ако је величина серије постављена на две, две слике ће проћи кроз цевовод. (Не мењајте величину серије. У супротном ће се појавити грешка. Само једна слика истовремено може ићи у функцију плот_имаге ().
## Parametersn_inputs = 32 * 32BATCH_SIZE = 1batch_size = tf.placeholder(tf.int64)# using a placeholderx = tf.placeholder(tf.float32, shape=[None,n_inputs])## Datasetdataset = tf.data.Dataset.from_tensor_slices(x).repeat().batch(batch_size)iter = dataset.make_initializable_iterator() # create the iteratorfeatures = iter.get_next()## Print the imagewith tf.Session() as sess:# feed the placeholder with datasess.run(iter.initializer, feed_dict={x: horse_x,batch_size: BATCH_SIZE})print(sess.run(features).shape)plot_image(sess.run(features), shape=[32, 32], cmap = "Greys_r")(1, 1024)
Изградите мрежу
Време је за изградњу мреже. Обучићете наслагани аутокодер, односно мрежу са више скривених слојева.
Ваша мрежа ће имати један улазни слој са 1024 тачке, тј. 32к32, облик слике.
Блок кодера имаће један горњи скривени слој са 300 неурона, централни слој са 150 неурона. Декодерски блок је симетричан кодеру. Мрежу можете визуализирати на слици испод. Имајте на уму да можете да промените вредности скривених и централних слојева.

Изградња мреже за Аутоенцодер
Изградња аутокодер је врло слична било којем другом моделу дубоког учења.
Модел ћете конструисати следећи ове кораке:
- Дефинишите параметре
- Дефинисати слојеве
- Дефинисати архитектуру
- Дефинишите оптимизацију
- Покрени модел
- Процените модел
У претходном одељку научили сте како да креирате цевовод за напајање модела, тако да нема потребе за поновним креирањем скупа података. Конструисаћете аутокодер са четири слоја. Користите Ксавиер иницијализацију. Ово је техника постављања почетних пондера једнаких варијанси и улаза и излаза. На крају, користите функцију активирања елуа. Функцију губитка регулишете помоћу регулатора Л2.
Корак 1) Дефинишите параметре
Први корак подразумева дефинисање броја неурона у сваком слоју, брзину учења и хиперпараметар регуларизатора.
Пре тога, делимично увезете функцију. Бољи је метод за дефинисање параметара густог слоја. Код у наставку дефинише вредности архитектуре аутоенкодер-а. Као што је претходно наведено, аутокодер има два слоја, са 300 неурона у првим и 150 у другим слојевима. Њихове вредности се чувају у н_хидден_1 и н_хидден_2.
Треба да дефинишете брзину учења и Л2 хиперпараметар. Вредности се чувају у леарнинг_рате и л2_рег
from functools import partial## Encodern_hidden_1 = 300n_hidden_2 = 150 # codings## Decodern_hidden_3 = n_hidden_1n_outputs = n_inputslearning_rate = 0.01l2_reg = 0.0001
Техника иницијализације Ксавиер-а позива се са објектом кавиер_инитиализер из доприноса процењивача. У истом проценитељу можете додати регуларизатор са л2_регуларизер
## Define the Xavier initializationxav_init = tf.contrib.layers.xavier_initializer()## Define the L2 regularizerl2_regularizer = tf.contrib.layers.l2_regularizer(l2_reg)
Корак 2) Дефинишите слојеве
Сви параметри густих слојева су постављени; све можете спаковати у променљиву густи_слој помоћу делимичног објекта. тхицк_лаиер који користи ЕЛУ активацију, Ксавиер иницијализацију и Л2 регуларизацију.
## Create the dense layerdense_layer = partial(tf.layers.dense,activation=tf.nn.elu,kernel_initializer=xav_init,kernel_regularizer=l2_regularizer)
Корак 3) Дефинисати архитектуру
Ако погледате слику архитектуре, приметићете да мрежа слаже три слоја са излазним слојем. У доњем коду повезујете одговарајуће слојеве. На пример, први слој израчунава тачкасти производ између улазних карактеристика матрице и матрица које садрже 300 пондера. Након што се израчуна тачкасти производ, излаз иде у функцију активирања Елу. Излаз постаје улаз следећег слоја, зато га користите за израчунавање хидден_2 и тако даље. Множење матрица је исто за сваки слој јер користите исту функцију активирања. Имајте на уму да последњи слој, излаз, не примењује функцију активирања. То има смисла јер је ово реконструисани инпут
## Make the mat mulhidden_1 = dense_layer(features, n_hidden_1)hidden_2 = dense_layer(hidden_1, n_hidden_2)hidden_3 = dense_layer(hidden_2, n_hidden_3)outputs = dense_layer(hidden_3, n_outputs, activation=None)
Корак 4) Дефинишите оптимизацију
Последњи корак је конструкција оптимизатора. Грешку средњег квадрата користите као функцију губитка. Ако се сетите упутства о линеарној регресији, знаћете да се МСЕ израчунава с разликом између предвиђеног излаза и стварне ознаке. Овде је ознака карактеристика јер модел покушава да реконструише улаз. Због тога желите средњу вредност збира разлике квадрата између предвиђеног излаза и уноса. Помоћу ТенсорФлов-а можете кодирати функцију губитка на следећи начин:
loss = tf.reduce_mean(tf.square(outputs - features))
Затим треба да оптимизујете функцију губитка. За израчунавање градијената користите Адам оптимизатор. Циљ функције је минимизирање губитака.
## Optimizeloss = tf.reduce_mean(tf.square(outputs - features))optimizer = tf.train.AdamOptimizer(learning_rate)train = optimizer.minimize(loss)
Још једна поставка пре тренинга модела. Желите да користите групну величину од 150, односно унесите цевовод са 150 слика у свакој итерацији. Морате ручно израчунати број итерација. Ово је тривијално урадити:
Ако желите сваки пут да проследите 150 слика и знате да се у скупу података налази 5000 слика, број итерација је једнак. У питхону можете покренути следеће кодове и проверити да ли је излаз 33:
BATCH_SIZE = 150### Number of batches : length dataset / batch sizen_batches = horse_x.shape[0] // BATCH_SIZEprint(n_batches)33
Корак 5) Покрените модел
И на крају, али не најмање важно, обучите модел. Тренирате модел са 100 епоха. Односно, модел ће видети слике 100 пута веће до оптимизованих тежина.
Већ сте упознати са кодовима за обуку модела у Тенсорфлов-у. Мала разлика је у томе што ћете податке превести пре извођења тренинга. На овај начин модел брже тренира.
Занима вас штампање губитка након десет епоха да бисте видели да ли модел нешто учи (тј. Губитак се смањује). Обука траје 2 до 5 минута, у зависности од хардвера ваше машине.
## Set paramsn_epochs = 100## Call Saver to save the model and re-use it later during evaluationsaver = tf.train.Saver()with tf.Session() as sess:sess.run(tf.global_variables_initializer())# initialise iterator with train datasess.run(iter.initializer, feed_dict={x: horse_x,batch_size: BATCH_SIZE})print('Training… ')print(sess.run(features).shape)for epoch in range(n_epochs):for iteration in range(n_batches):sess.run(train)if epoch % 10 == 0:loss_train = loss.eval() # not shownprint("\r{}".format(epoch), "Train MSE:", loss_train)#saver.save(sess, "./my_model_all_layers.ckpt")save_path = saver.save(sess, "./model.ckpt")print("Model saved in path: %s" % save_path)Training… (150, 1024)0 Train MSE: 2934.45510 Train MSE: 1672.67620 Train MSE: 1514.70930 Train MSE: 1404.311840 Train MSE: 1425.05850 Train MSE: 1479.063160 Train MSE: 1609.525970 Train MSE: 1482.322380 Train MSE: 1445.703590 Train MSE: 1453.8597Model saved in path: ./model.ckpt
Корак 6) Оцените модел
Сада када сте обучили свој модел, време је да га процените. Морате да увезете тест серт из датотеке / цифар-10-батцхес-пи /.
test_data = unpickle('./cifar-10-batches-py/test_batch')test_x = grayscale(test_data['data'])#test_labels = np.array(test_data['labels'])
НАПОМЕНА: За Виндовс машину код постаје тест_дата = унпицкле (р "Е: \ цифар-10-батцхес-пи \ тест_батцх")
Можете покушати да одштампате слике 13, што је коњ
plot_image(test_x[13], shape=[32, 32], cmap = "Greys_r")
Да бисте проценили модел, користићете вредност пиксела ове слике и видећете да ли кодер може да реконструише исту слику након смањења 1024 пиксела. Имајте на уму да дефинишете функцију за процену модела на различитим сликама. Модел би требао боље радити само на коњима.
Функција узима два аргумента:
- дф: Увезите податке о тесту
- број_броја: назначите коју слику желите увести
Функција је подељена у три дела:
- Преобликујте слику у тачну димензију, тј. 1, 1024
- Нахраните модел невидљивом сликом, кодирајте / декодирајте слику
- Одштампајте стварну и реконструисану слику
def reconstruct_image(df, image_number = 1):## Part 1: Reshape the image to the correct dimension i.e 1, 1024x_test = df[image_number]x_test_1 = x_test.reshape((1, 32*32))## Part 2: Feed the model with the unseen image, encode/decode the imagewith tf.Session() as sess:sess.run(tf.global_variables_initializer())sess.run(iter.initializer, feed_dict={x: x_test_1,batch_size: 1})## Part 3: Print the real and reconstructed image# Restore variables from disk.saver.restore(sess, "./model.ckpt")print("Model restored.")# Reconstruct imageoutputs_val = outputs.eval()print(outputs_val.shape)fig = plt.figure()# Plot realax1 = fig.add_subplot(121)plot_image(x_test_1, shape=[32, 32], cmap = "Greys_r")# Plot estimatedax2 = fig.add_subplot(122)plot_image(outputs_val, shape=[32, 32], cmap = "Greys_r")plt.tight_layout()fig = plt.gcf()
Сада када је функција процене дефинисана, можете да погледате реконструисану слику број тринаест
reconstruct_image(df =test_x, image_number = 13)
INFO:tensorflow:Restoring parameters from ./model.ckptModel restored.(1, 1024)
Резиме
Примарна сврха аутоматског кодера је компримовање улазних података, а затим декомпресовање у излаз који изгледа блиско оригиналним подацима.
Архитектура аутодекодера симетричног са окретним слојем названим централни слој.
Можете да креирате аутокодер користећи:
- Делимично: за стварање густих слојева са типичним подешавањем:
-
tf.layers.dense,activation=tf.nn.elu,kernel_initializer=xav_init,kernel_regularizer=l2_regularizer
- тхицк_лаиер (): за множење матрице
функцију губитка и оптимизацију можете дефинисати помоћу:
loss = tf.reduce_mean(tf.square(outputs - features))optimizer = tf.train.AdamOptimizer(learning_rate)train = optimizer.minimize(loss)
Последње покретање сесије за обуку модела.