Часть II • Введение в TensorFlow.js
разрешающие возможности модели. Следовательно, ничего удивительного, что точ
ность этой модели оказалась такой же, как и у линейной. Отсюда и распространен
ный подводный камень при создании многослойных нейронных сетей:
не забывайте
включать в скрытые слои нелинейные функции активации
. Если этого не сделать, вы
только понапрасну потратите вычислительные ресурсы и свое время, а вдобавок
рискуете потерять численную устойчивость (видите извилистые кривые потерь
в блоке Б на рис. 3.4?). Далее мы увидим, что это относится не только к плотным,
но и к другим типам слоев, например сверточным.
Нелинейность и интерпретируемость модели
В главе 2 мы показали, что после обучения модели на наборе данных Bostonhousing
можно изучать ее весовые коэффициенты и истолковывать отдельные параметры
достаточно осмысленным образом. Например, значение весового коэффициента,
соответствующего признаку «среднее число комнат в жилом доме», — положитель
ное, а веса, соответствующего признаку «уровень преступности», — отрицательное.
Знаки подобных весов отражают ожидаемую прямую или обратную зависимости
цены дома и соответствующих признаков. А порядок их величин указывает на то,
какую значимость придает модель различным признакам. С учетом вышесказанно
го возникает естественный вопрос: можно ли интуитивно понятным и разумным
образом интерпретировать значения весов нелинейной модели, включающей один
скрытый слой или более?
API доступа к значениям весовых коэффициентов ничем не отличается для
нелинейной и линейной моделей: необходимо просто воспользоваться методом
getWeights()
объекта модели или его компонент — объектов слоев. В случае MLP
из листинга 3.1, например, можно просто вставить следующую строку после завер
шения обучения модели (сразу после вызова
model.fit()
):
model.layers[0].getWeights()[0].print();
Эта строка кода выводит в консоль значение ядра первого (скрытого) слоя. Оно
представляет собой один из четырех тензоров весов модели, остальные три — сме
щение скрытого слоя, а также ядро и смещение выходного слоя. Стоит отметить, что
его размер больше, чем размер ядра линейной модели, который мы выводили выше:
Tensor
[[-0.5701274, -0.1643915, -0.0009151, ..., 0.313205 , -0.3253246],
[-0.4400523, -0.0081632, -0.2673715, ..., 0.1735748 , 0.0864024 ],
[0.6294659 , 0.1240944 , -0.2472516, ..., 0.2181769 , 0.1706504 ],
[0.9084488 , 0.0130388 , -0.3142847, ..., 0.4063887 , 0.2205501 ],
[0.431214 , -0.5040522, 0.1784604 , ..., 0.3022115 , -0.1997144],
[-0.9726604, -0.173905 , 0.8167523 , ..., -0.0406454, -0.4347956],
[-0.2426955, 0.3274118 , -0.3496988, ..., 0.5623314 , 0.2339328 ],
[-1.6335299, -1.1270424, 0.618491 , ..., -0.0868887, -0.4149215],
[-0.1577617, 0.4981289 , -0.1368523, ..., 0.3636355 , -0.0784487],
[-0.5824679, -0.1883982, -0.4883655, ..., 0.0026836 , -0.0549298],
[-0.6993552, -0.1317919, -0.4666585, ..., 0.2831602 , -0.2487895],
[0.0448515 , -0.6925298, 0.4945385 , ..., -0.3133179, -0.0241681]]
Do'stlaringiz bilan baham: |