предисловие
Только лысая голова может стать сильнее.
Текст был включен в мой репозиторий GitHub, добро пожаловать, звезда:GitHub.com/Zhongf UC очень…
Оглядываясь назад на фронт:
- Изучите TensorFlow с нуля [01-Создание среды, HelloWorld]
- Что такое ТензорФлоу?
- TensorFlow читает и записывает данные
- Как я понимаю AXIS?
В этой статье в основном рассказывается об основах использования TensorBoard иname_scope和variable_scope
разница
1. Начало работы с TensorBoard
Прежде всего, давайте поговорим о том, что такое TensorBoard, я узнал об этом из официальной документации в то время, а официальный сайт также выпустил видео, знакомящее с TensorBoard. Я искал на станции б и обнаружил, что там тоже можноиди первыйПосмотрите видео, чтобы понять (на самом деле хорошо сказано):
Чтобы облегчить понимание, отладку и оптимизацию программ TensorFlow, существуют TensorBoard, такие какинструмент визуализации
Поскольку программу TensorFlow мы написали и построили нейронную сеть, по сути, мы не знаем, что внутри нейронной сети.Деталичто ты сделал?Вручную отлаживать очень сложно(Как будто вы не можете представить все шаги рекурсии). С помощью TensorBoard можно отображать этапы выполнения программы TensorFlow, что очень интуитивно понятно. Также мы можемпараметры тренировки(например, стоимость потерь) для статистики используйтерисунокспособ просмотра изменяющихся тенденций.
1.1 name_scope и variable_scope
На самом деле, в видео также упоминается, что мы хотим, чтобы график TensorBoard лучше отображался (более организован), поэтому в целом нам нужно его использовать.name_scope
взять имя.
Кроме этогоname_scope
, а другой называетсяvariable_scope
. Так в чем же между ними разница? Как следует из названия,name_scope
это область имени,variable_scope
это переменная область видимости.
В предыдущей статье было два способа создания переменных, один из них — использоватьtf.get_variable()
создать, нужно использоватьtf.Variable()
создавать. Существуют также различия между двумя методами создания.
- существует
tf.name_scope
в следующий раз,tf.get_variable()
имя созданной переменнойне подлежитname_scope
Эффект , и если общая переменная не указана, будет сообщено об ошибке, если имя такое же.tf.Variable()
Он автоматически определит, есть ли переменная с таким же именем, и если да, то она будет обработана сама (она будет создана автоматически)
Например следующий код:
with tf.name_scope('name_sp1') as scp1:
with tf.variable_scope('var_scp2') as scp2:
with tf.name_scope('name_scp3') as scp3:
a = tf.Variable('a')
b = tf.get_variable('b')
Эквивалентно:
with tf.name_scope('name_sp1') as scp1:
with tf.name_scope('name_sp2') as scp2:
with tf.name_scope('name_scp3') as scp3:
a = tf.Variable('a')
with tf.variable_scope('var_scp2') as scp2:
b = tf.get_variable('b')
Здесь показано, что если вы используетеget_variable
способ создания объектов, на который не влияетname_scope
затронутый.
Обратите внимание, что следующий код вызовет ошибку. Поскольку в области scp нет переменной a, и для нее задано значениеreuse=True
. Здесь, потому чтообщая переменная не найдена ошибка!
with tf.variable_scope('scp', reuse=True) as scp:
a = tf.get_varialbe('a') #报错
Точно так же следующий код также сообщит об ошибке, потому что, очевидно,уже естьобщая переменная, но установлен вreuse=false
. Так он сообщит об ошибке.
with tf.variable_scope('scp', reuse=False) as scp:
a = tf.get_varialbe('a')
a = tf.get_varialbe('a') #报错
Наконец, давайте еще раз посмотрим на этот пример, он должен быть в состоянии понять.
with tf.variable_scope('variable_scope_y') as scope:
var1 = tf.get_variable(name='var1', shape=[1], dtype=tf.float32)
scope.reuse_variables() # 设置共享变量
var1_reuse = tf.get_variable(name='var1')
var2 = tf.Variable(initial_value=[2.], name='var2', dtype=tf.float32)
var2_reuse = tf.Variable(initial_value=[2.], name='var2', dtype=tf.float32)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(var1.name, sess.run(var1))
print(var1_reuse.name, sess.run(var1_reuse))
print(var2.name, sess.run(var2))
print(var2_reuse.name, sess.run(var2_reuse))
# 输出结果:
# variable_scope_y/var1:0 [-1.59682846]
# variable_scope_y/var1:0 [-1.59682846] 可以看到变量var1_reuse重复使用了var1
# variable_scope_y/var2:0 [ 2.]
# variable_scope_y/var2_1:0 [ 2.]
Использованная литература:
1.2 Пример TensorBoard
Давайте посмотрим на простой вводный пример TensorBoard и почувствуем его:
def learn_tensor_board_2():
# prepare the original data
with tf.name_scope('data'):
x_data = np.random.rand(100).astype(np.float32)
y_data = 0.3 * x_data + 0.1
##creat parameters
with tf.name_scope('parameters'):
with tf.name_scope('weights'):
weight = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
tf.summary.histogram('weight', weight)
with tf.name_scope('biases'):
bias = tf.Variable(tf.zeros([1]))
tf.summary.histogram('bias', bias)
##get y_prediction
with tf.name_scope('y_prediction'):
y_prediction = weight * x_data + bias
##compute the loss
with tf.name_scope('loss'):
loss = tf.reduce_mean(tf.square(y_data - y_prediction))
tf.summary.scalar('loss', loss)
##creat optimizer
optimizer = tf.train.GradientDescentOptimizer(0.5)
# creat train ,minimize the loss
with tf.name_scope('train'):
train = optimizer.minimize(loss)
# creat init
with tf.name_scope('init'):
init = tf.global_variables_initializer()
##creat a Session
sess = tf.Session()
# merged
merged = tf.summary.merge_all()
##initialize
writer = tf.summary.FileWriter("/Users/zhongfucheng/tensorboard/loss-2", sess.graph)
sess.run(init)
## Loop
for step in range(201):
sess.run(train)
rs = sess.run(merged)
writer.add_summary(rs, step)
if __name__ == '__main__':
learn_tensor_board_2()
# 启动完了之后,要在命令行上运行tensor_board的命令,指定其目录,最后我们就可以通过6006的默认端口访问我们的图。
(Пример взят из сети, я его немного изменил, забыл исходник, вторгся и удалил~)
Далее запустим TensorBoard, чтобы посмотреть, как выглядит график, команда запуска следующая:
tensorboard --logdir=/Users/zhongfucheng/tensorboard/loss-2
График, который успешно стартовал:
Давайте зайдем через порт 6006. Во-первых, мы можем обнаружить изменение значения потерь:
Мы также можем просмотреть примерные шаги выполнения программы TensorFlow:
Гистограмма параметров w и b:
Короче говоря, TensorBoard может легко просматривать изменения наших параметров, чтобы лучше понимать код, который мы пишем.
Использованная литература:
Наконец
рад вывестигалантерейные товарыОбщедоступный номер технологии Java: Java3y. В паблике более 200 статейоригинальныйТехнические статьи, обширные видеоресурсы, красивые карты мозга — идите сюдаобрати внимание нанемного!
Я думаю, что моя статья хорошо написана, пожалуйста, нажмитеотличный!