Здравствуйте и вновь добро пожаловать на наши занятия – «Обработка данных: практическое глубокое обучение в 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)
Всё, можем запускать программу:
Благодарю вас за изучение этого курса по практическому глубокому обучению в Theano и TensorFlow. Надеюсь, вы многое узнали!
Мы продолжим данную тему в “Глубоком обучении, часть 3”.