Skip to content

Commit

Permalink
Update 004 notebooks to support TF2.0
Browse files Browse the repository at this point in the history
  • Loading branch information
a4tunado committed May 29, 2020
1 parent a994097 commit 083478f
Show file tree
Hide file tree
Showing 5 changed files with 327 additions and 441 deletions.
2 changes: 2 additions & 0 deletions 004/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@

submit.txt
301 changes: 151 additions & 150 deletions 004/004-classification.ipynb

Large diffs are not rendered by default.

221 changes: 71 additions & 150 deletions 004/004-mnist.ipynb

Large diffs are not rendered by default.

236 changes: 98 additions & 138 deletions 004/004-regression.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,29 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"# Реализация линейной операции в TensorFlow"
"# Реализация линейной регрессии в TensorFlow"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2.2.0\n",
"True\n"
]
}
],
"source": [
"import numpy as np\n",
"import tensorflow as tf"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"from matplotlib import pyplot as plt"
"import tensorflow as tf\n",
"\n",
"print(tf.__version__)\n",
"print(tf.executing_eagerly())"
]
},
{
Expand All @@ -51,27 +53,16 @@
"outputs": [],
"source": [
"from sklearn.datasets import make_regression\n",
"from sklearn.model_selection import train_test_split\n",
"\n",
"X, y = make_regression(n_samples = NUM_SAMPLES,\n",
" n_features = NUM_FEATURES,\n",
" n_informative = NUM_FEATURES,\n",
" bias=2.5,\n",
" noise = 10,\n",
" random_state = 12345)\n",
"\n",
"y = y.reshape(-1, 1)\n",
"\n",
"order = np.argsort(X[:, 0]) # данные упорядочены по X\n",
"\n",
"plt.xlabel('x')\n",
"plt.ylabel('y')\n",
"plt.plot(X[order, 0], y[order], 'o');"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Вспомогательная функция для создания операций"
"y = y.reshape(-1, 1)"
]
},
{
Expand All @@ -80,30 +71,22 @@
"metadata": {},
"outputs": [],
"source": [
"import string\n",
"\n",
"def py_func_with_grad(func, inp, Tout, grad, name = None, stateful = False, graph = None):\n",
" \n",
"\n",
" name_prefix = ''.join(np.random.choice(list(string.ascii_letters), size = 10))\n",
" \n",
" name = '%s_%s' % (name_prefix, name or '')\n",
" grad_func_name = '%s_grad' % name\n",
"%matplotlib inline\n",
"from matplotlib import pyplot as plt\n",
"\n",
" tf.RegisterGradient(grad_func_name)(grad)\n",
"plt.figure(figsize=(10, 8))\n",
"plt.plot(X[:, 0], y, 'o')\n",
"plt.xlabel('x')\n",
"plt.ylabel('y')\n",
"\n",
" g = graph or tf.get_default_graph()\n",
" with g.gradient_override_map({'PyFunc': grad_func_name, \n",
" 'PyFuncStateless': grad_func_name}):\n",
" with tf.name_scope(name, 'PyFuncOp', inp):\n",
" return tf.py_func(func, inp, Tout, stateful = stateful, name = name)"
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Реализация линейной опреаций"
"## Функции для обучения модели"
]
},
{
Expand All @@ -112,102 +95,76 @@
"metadata": {},
"outputs": [],
"source": [
"def linear_op_forward(X, W):\n",
" ''' Реализация линейной операции '''\n",
" return np.dot(X, W.T) # аргументы являются numpy-массивами\n",
"@tf.custom_gradient\n",
"def linear(x, w, b):\n",
" x = tf.convert_to_tensor(x)\n",
" result = tf.matmul(x, w) + b\n",
" def grad(dy):\n",
" # возвращаем значения градиента для\n",
" # каждого из аргументов функции\n",
" dx = dy * w\n",
" dw = tf.reduce_sum(dy * x, axis=0, keepdims=True)\n",
" db = tf.reduce_sum(dy)\n",
" return dx, dw, db\n",
" return result, grad\n",
"\n",
"def linear_op_backward(op, grads):\n",
" ''' Реализация вычисления градиента линейной операции '''\n",
" X = op.inputs[0] # тензор входных данных\n",
" W = op.inputs[1] # тензор параметров модели\n",
" dX = tf.multiply(grads, W)\n",
" dW = tf.reduce_sum(tf.multiply(X, grads),\n",
" axis = 0,\n",
" keep_dims = True)\n",
" return dX, dW"
"def mse_loss(y, prediction):\n",
" y = tf.convert_to_tensor(y)\n",
" loss = (y - prediction) ** 2\n",
" return tf.reduce_mean(loss)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Создание графа вычислений и обучение модели"
"## Обучение модели"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": false
},
"metadata": {},
"outputs": [],
"source": [
"BATCH_SIZE = NUM_SAMPLES // 10\n",
"# создаем переменные для хранения весов модели\n",
"np.random.seed(12345)\n",
"\n",
"w = tf.Variable(\n",
" np.random.normal(size=(NUM_FEATURES, 1)),\n",
" dtype=tf.double, name='w')\n",
"\n",
"b = tf.Variable(0.0, dtype=tf.double, name='b')\n",
"\n",
"\n",
"# разделяем выборку на обучающую и на тестовую группы\n",
"(X_train, X_test,\n",
" y_train, y_test) = train_test_split(X, y, \n",
" test_size=0.33,\n",
" random_state=12345)\n",
"\n",
"weights = None # в этой переменной мы сохраним результат обучения модели\n",
"learning_curve = [] # значения ошибки на каждой итерации обучения\n",
"test_loss_results = []\n",
"\n",
"with tf.Session(graph = tf.Graph()) as sess: # инициализируем сессию вычислений\n",
" \n",
" # создаем placeholdr'ы, через них мы будем\n",
" # передавать внешние данные в граф вычислений\n",
" plh_X = tf.placeholder(dtype = tf.float32, shape = [None, NUM_FEATURES])\n",
" plh_y = tf.placeholder(dtype = tf.float32, shape = [None, 1])\n",
"lr = 2.5e-3 # скорость обучения\n",
"\n",
" # создаем переменную для хранения весов модели\n",
" # эти веса будут изменяться в процессе обучения\n",
" var_W = tf.Variable(tf.random_uniform(shape = [1, NUM_FEATURES],\n",
" dtype = tf.float32,\n",
" seed = 12345))\n",
" \n",
" # создаем переменную для результата предсказания модели\n",
" var_Pred = py_func_with_grad(linear_op_forward, # функция предсказания модели \n",
" [plh_X, var_W], # аргументы функции\n",
" [tf.float32], # тип выходных значений\n",
" name = 'linear_op', # имя операции \n",
" grad = linear_op_backward, # функция для вычисления градиента\n",
" graph = sess.graph) # объект графа вчислений\n",
" \n",
" # определяем квадратичную функцию потерь\n",
" # результат предсказания сравнивается с правильным ответом для вычисления ошибки\n",
" cost = tf.reduce_mean(tf.square(plh_y - var_Pred))\n",
" \n",
" # инициализируем оптимизатор и указываем скорость обучения\n",
" optimizer = tf.train.GradientDescentOptimizer(\n",
" learning_rate = 0.3).minimize(cost)\n",
"for i in range(500):\n",
" with tf.GradientTape() as g:\n",
" # вычисляем значение функции потерь для обучающей выборки\n",
" y_pred = linear(X_train, w, b)\n",
" loss = mse_loss(y_train, y_pred)\n",
"\n",
" # инициализируем placeholder'ы и переменные\n",
" sess.run(tf.global_variables_initializer())\n",
" \n",
" indices = np.arange(len(X)) # массив индексов объектов\n",
" \n",
" # выполняем итерации по 10-ти эпохам\n",
" for epoch in range(10):\n",
" \n",
" # вначале каждой эпохи перемешиваем индексы\n",
" np.random.shuffle(indices)\n",
" \n",
" # внутри каждой эпохи данные разбиваются на батчи\n",
" for batch in range(len(X) // BATCH_SIZE):\n",
" \n",
" # выбираем индексы очередного батча\n",
" batch_indices = indices[batch * BATCH_SIZE:(batch + 1) * BATCH_SIZE]\n",
" # вычисляем значение градиента для параметров модели\n",
" dw, db = g.gradient(loss, [w, b])\n",
"\n",
" # выполняем шаг обучения: вычисляем ошибку и обновляем веса\n",
" loss, _ = sess.run([cost, optimizer], # указываем, какие операции необходимо выполнить\n",
" feed_dict = {plh_X: X[batch_indices], # передаем входные данные для вычисления\n",
" plh_y: y[batch_indices]})\n",
" \n",
" # сохраняем занчения ошибки для построения кривой обучения\n",
" learning_curve.append(loss)\n",
" \n",
" # выводим текущее значение ошибки для каждого 10го шага\n",
" steps = len(learning_curve) - 1\n",
" if steps % 10 == 0:\n",
" print('[%03d] loss=%.3f weights=%s' % (steps, loss, var_W.eval()))\n",
" \n",
" # сохраняем обученные веса\n",
" weights = var_W.eval()"
" # обновляем параметры модели с учетом значений градиентов\n",
" w.assign_sub(lr * dw)\n",
" b.assign_sub(lr * db)\n",
"\n",
" if i % 50 == 0:\n",
" # логируем метрики на тестовой выборке\n",
" y_pred = linear(X_test, w, b)\n",
" test_loss_results.append(mse_loss(y_test, y_pred).numpy())\n",
" print('[%03d] mse=%.3f' % (i, test_loss_results[-1]))"
]
},
{
Expand All @@ -223,17 +180,19 @@
"metadata": {},
"outputs": [],
"source": [
"plt.xlabel('step')\n",
"plt.ylabel('loss')\n",
"plt.title('Learning curve')\n",
"plt.plot(learning_curve);"
"plt.figure(figsize=(10, 4))\n",
"plt.plot(test_loss_results)\n",
"plt.title('Metrics')\n",
"plt.xlabel('Epoch')\n",
"plt.ylabel('MSE')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Визуализируем предсказания модели"
"## Визуализируем разделяющую гиперплоскость "
]
},
{
Expand All @@ -242,20 +201,21 @@
"metadata": {},
"outputs": [],
"source": [
"y_pred = np.dot(X, weights.T) # предсказание модели\n",
"y_pred = linear(X_test, w, b).numpy()\n",
"\n",
"order = np.argsort(X_test[:, 0])\n",
"\n",
"plt.figure(figsize=(10, 8))\n",
"plt.title('Line: w=%.3f b=%.3f' % (w.numpy(), b.numpy()))\n",
"\n",
"plt.plot(X_test, y_test, 'ob',\n",
" X_test[order], y_pred[order], '-r')\n",
"\n",
"plt.xlabel('x')\n",
"plt.ylabel('y')\n",
"plt.plot(X[order, 0], y[order], 'o',\n",
" X[order, 0], y_pred[order], '-');"
"\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
Expand All @@ -274,7 +234,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.4"
"version": "3.7.3"
}
},
"nbformat": 4,
Expand Down
8 changes: 5 additions & 3 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
jupyter
h5py>=2.9.0
ipywidgets
jupyter
matplotlib
numpy>=1.18.4
opencv-python>=4.2.0
opencv-contrib-python>=4.2.0
opencv-python>=4.2.0
pandas>=0.24.2
scikit-learn>=0.23.1
tensorboard>=2.0
tensorflow>=2.0
h5py>=2.9.0

0 comments on commit 083478f

Please sign in to comment.