ИНС на основе классов в 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: :???: :?: :!: