ИНС на основе классов в TensorFlow

Здравствуйте и вновь добро пожаловать на наши занятия – «Обработка данных: практическое глубокое обучение в Theano и TensorFlow»

Мы продолжаем рассматривать задачу распознавания выражения лица, но на этот раз мы перепишем нейронную сеть с использованием библиотеки TensorFlow.

Функция main остаётся совершенно той же, но для интереса мы добавим ещё один скрытый слой с 500 узлов.

def main():

 X, Y = getData()

    model = ANN([2000, 1000, 500])

    model.fit(X, Y, show_fig=True)

if __name__ == ‘__main__’:

main()

Начинаем мы с импорта обычных библиотек, но теперь, разумеется, включая и TensorFlow. Из файла util.py импортируем функции getData и getBinaryData на случай, если вы для ускорения процесса захотите проверить программу лишь на двоичных данных, а также y2indicator, error_rate, init_weight_and_bias. Используем также функцию shuffle для использования в градиентном спуске.

import numpy as np

import tensorflow as tf

import matplotlib.pyplot as plt

from util import getData, getBinaryData, y2indicator, error_rate, init_weight_and_bias

from sklearn.utils import shuffle

Как и в случае с Theano, создадим класс для скрытых слоёв, чтобы впоследствии можно было добавлять сколь угодно много слоёв.

И как в предыдущем примере, сразу же определяем функцию forward.

class HiddenLayer(object):

    def __init__(self, M1, M2, an_id):

        self.id = an_id

        self.M1 = M1

        self.M2 = M2

        W, b = init_weight_and_bias(M1, M2)

        self.W = tf.Variable(W.astype(np.float32))

        self.b = tf.Variable(b.astype(np.float32))

        self.params = [self.W, self.b]

    def forward(self, X):

        return tf.nn.relu(tf.matmul(X, self.W) + self.b)

Это всё, что касается скрытого слоя, можно переходить к классу нейронной сети. Начало остаётся совершенно тем же, что и было.

class ANN(object):

    def __init__(self, hidden_layer_sizes):

        self.hidden_layer_sizes = hidden_layer_sizes

Далее переходим к функции fit.

def fit(self, X, Y, learning_rate=10e-7, mu=0.99, decay=0.999, reg=10e-3, epochs=400, batch_sz=100, show_fig=False):

  K = len(set(Y))

Теперь создаём валидационный набор из 1 000 наблюдений. Тут нам понадобится переменная Yvalid_flat для расчёта коэффициента ошибок.

# make a validation set

X, Y = shuffle(X, Y)

X = X.astype(np.float32)

Y = y2indicator(Y).astype(np.float32)

Xvalid, Yvalid = X[-1000:], Y[-1000:]

Yvalid_flat = np.argmax(Yvalid, axis=1)

X, Y = X[:-1000], Y[:-1000]

Инициируем скрытые слои. Тут всё очень похоже на предыдущий пример с Theano, только переменные теперь, конечно же, относятся к библиотеке TensorFlow. Надо сказать, TensorFlow куда более строг по отношению к переменным, которые должны быть одного типа.

# initialize hidden layers

N, D = X.shape

self.hidden_layers = []

M1 = D

 count = 0

for M2 in self.hidden_layer_sizes:

 h = HiddenLayer(M1, M2, count)

 self.hidden_layers.append(h)

  M1 = M2

  count += 1

W, b = init_weight_and_bias(M1, K)

self.W = tf.Variable(W.astype(np.float32))

self.b = tf.Variable(b.astype(np.float32))

Вновь собираем параметры для дальнейшего использования.

# collect params

self.params = [self.W, self.b]

for h in self.hidden_layers:

self.params += h.params

Следующее – определение функций и переменных Theano, но с использованием заполнителей TensorFlow. В этой части кода будет использована функция predict, которую мы определим чуть позже.

# set up theano functions and variables

tfX = tf.placeholder(tf.float32, shape=(None, D), name=’X’)

tfT = tf.placeholder(tf.float32, shape=(None, K), name=’T’)

act = self.forward(tfX)

rcost = reg*sum([tf.nn.l2_loss(p) for p in self.params])

 cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(act, tfT)) + rcost

prediction = self.predict(tfX)

train_op = tf.train.RMSPropOptimizer(learning_rate, decay=decay, momentum=mu).minimize(cost)

Следующий этап – написание цикла для обучения модели. Инициируем наши переменные, которые в Theano были общими переменными.

n_batches = N / batch_sz

costs = []

init = tf.initialize_all_variables()

with tf.Session() as session:

session.run(init)

 for i in xrange(epochs):

  X, Y = shuffle(X, Y)

 for j in xrange(n_batches):

  Xbatch = X[j*batch_sz:(j*batch_sz+batch_sz)]

  Ybatch = Y[j*batch_sz:(j*batch_sz+batch_sz)]

И собственно запуск обучения. Всё практически такое же, как и в Theano.

 session.run(train_op, feed_dict={tfX: Xbatch, tfT: Ybatch})

if j % 20 == 0:

 c = session.run(cost, feed_dict={tfX: Xvalid, tfT: Yvalid})

 costs.append(c)

  p = session.run(prediction, feed_dict={tfX: Xvalid, tfT: Yvalid})

 e = error_rate(Yvalid_flat, p)

print(“i:”, i, “j:”, j, “nb:”, n_batches, “cost:”, c, “error rate:”, e)

Закончив цикл, можно выводить на экран графики.

if show_fig:

  plt.plot(costs)

 plt.show()

И, наконец, функции forward и predict.

    def forward(self, X):

        Z = X

        for h in self.hidden_layers:

            Z = h.forward(Z)

        return tf.matmul(Z, self.W) + self.b

    def predict(self, X):

        act = self.forward(X)

        return tf.argmax(act, 1)

Всё, можем запускать программу:

ИНС на основе классов в TensorFlow

Благодарю вас за изучение этого курса по практическому глубокому обучению в Theano и TensorFlow. Надеюсь, вы многое узнали!

Мы продолжим данную тему в “Глубоком обучении, часть 3”.

Понравилась статья? Поделить с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: