Описание (что?)
У этого блога две основные цели: во-первых, запись обучения и использованиеTensorFlow
процесс работы; во-вторых,TensorFlow
Данные параметров в процессе обучения модели данных визуально записываются.
Конкретная операция (как)
Описание экземпляра
1. ИспользуйтеTensorFlow
Построить трехслойную нейронную сеть (входной слой, скрытый слой, выходной слой) классическая модель обученияMNIST
набор данных для предсказания рукописных цифр.
2. Используйте во время тренировкиTensorBoard
визуализировать данные параметров во время обучения
Кодовый адрес Github экземпляра
Реализация кода TensorFlow
Шаг 1 Импортируйте библиотеку ответов и загрузите набор данных
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
#以独热编码的方式加载数据集
mnist = input_data.read_data_sets('./MNIST_data/',one_hot=True)
Шаг 2 Настройки параметров, связанных с моделью
Задайте параметры, связанные с моделью, которые могут измениться заранее, чтобы упростить унифицированные изменения позже.
in_unit = 784
h1_unit = 300
learningrate = 0.05 # 梯度下降法学习率
dropout_keep_prob = 0.75 # dropout时保留神经元的比例,神经网络不为0的参数变为原理的1/dropout_keep_prob倍
batch_size = 100 # 梯度下降法选取的batch的size
max_iter = 3000 # 迭代次数
sava_dir = '../data/' # 存放数据结果
log_dir = '../log/' # 日志目录
Шаг 3. Настройте граф вычислений в TensorFlow.
1. вTensorFlow
запускатьsession
При запуске операции узла сначала установите ееTensorFlow
Вычислительный граф, который способствует глобальному контролю над всеми операциями узла в вычислительном графе. (TensorFlow
Граф вычислений в графе включает в себя узлы и ребра, где узлы — это операции, а ребра представляют поток данных, то есть тензоры, но некоторые ребра не имеют потока данных для представления зависимостей между операциями узлов;TensorFlow
Операции узла в прогоне должны пройтиSession
сеанс, чтобы начать, используйтеsession.run()
или вызов объекта операции узлаeval()
2. tf.placeholder
заTensorFlow
Заполнители в качестве входных заполнителей для внешних данных (включая наборы данных и некоторые другие параметры модели), которые необходимо установить при выполнении операций узла.feed_dict
параметр для заполнения данных заполнителя.
3. См. нижеNO3
Раздел описания
4. Использовать после вывода первого скрытого слояtf.nn.dropout
добавил еще один слойdropout
Этаж
5. Оптимизатор обучения модели выбираетAdamOptimizer
,loss
Функция является кросс-энтропийной, используяtf
автономныйtf.nn.softmax_cross_entropy_with_logits
для вычисления кросс-энтропии истинного и прогнозируемого значений
tf.reset_default_graph()
train_graph = tf.Graph()
with train_graph.as_default():
# step 3.1 设置算法模型中的输入,使用占位符,占用输入的数据(什么情况下使用占位符,什么情况下设置tf变量)
train_x = tf.placeholder(dtype=tf.float32,shape=[None,in_unit],name = 'train_x')
train_y = tf.placeholder(dtype=tf.float32,shape=[None,10],name = 'train_y')
# step 3.2构造神经网络
# 创建第一层隐藏层
hidden_layer1 = nn_layer(train_x,input_dim=in_unit,output_dim=h1_unit,layer_name='hider_layer1',act=tf.nn.relu)
#在第一层隐藏层上创建一层 dropout层 —— 随机关闭一些hidden_layer1的神经元
with tf.name_scope('dropout'):
dropout_prob = tf.placeholder(dtype=tf.float32, name='dropout_prob')
tf.summary.scalar('dropout_keep_probability',dropout_prob)
hidden_layer1_dropout = tf.nn.dropout(hidden_layer1,dropout_prob)
#创建输出层,包括10个类别,输出层的输入是hidden_layer1_dropout,输出是[1,10]
y = nn_layer(hidden_layer1_dropout,h1_unit,10,layer_name='out_layer',act=tf.identity)
# step 3.3 创建损失函数
with tf.name_scope('loss'):
cross_entropy_diff = tf.nn.softmax_cross_entropy_with_logits(labels=train_y, logits=y)
with tf.name_scope('total'):
cross_entropy = tf.reduce_mean(cross_entropy_diff)
tf.summary.scalar('loss', cross_entropy)
# step 3.4 选择优化器训练并设计计算准确率的节点
optimizer = tf.train.AdamOptimizer(learning_rate=learningrate)
train_op = optimizer.minimize(cross_entropy)
with tf.name_scope('accuracy'):
with tf.name_scope('correct_prediction'):
correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(train_y, 1))
with tf.name_scope('accuracy'):
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
tf.summary.scalar('accuracy', accuracy)
NO3:
Операция построения однослойной нейронной сети инкапсулирована в функциюnn_layer
, который возвращаетTensor
объект.weight_variable
функция иbias_variable
используется в функцииtf.Variable
для инициализации соответствующих весов на сетевом уровнеw
и срок смещенияb
.
вtf.matmul(input_tensor,weight)+bias
это значение всех нейронов в этом слое сетиwx+b
Векторное представление , представляющее вход в нейрон—g(wx+b)
,вg
является функцией активации.
def nn_layer(input_tensor,input_dim,output_dim,layer_name,act=tf.nn.relu):
"""
建立神经网络层(一层),并返回该层网络层的输出的tensor对象
:param input_tensor:特征数据
:param input_dim:输入数据的维度大小
:param output_dim:该层神经元的个数
:param layer_name:命名空间
:param act:神经元对应的激活函数
"""
#设置命名空间
with tf.name_scope(layer_name):
#初始化权重,并记录权重变化
with tf.name_scope('weights'):
weight = weight_variable([input_dim,output_dim])
variable_summeries(weight)# 记录权重变化
with tf.name_scope('bias'):
bias = bias_variable([output_dim])
variable_summeries(bias)
with tf.name_scope('linear_compute'):
preact = tf.matmul(input_tensor,weight)+bias
tf.summary.histogram('linear',preact)
activeation = act(preact,name = 'activation')
tf.summary.histogram('activation',activeation)
return activeation
def weight_variable(shape):
"""
将每一层的神经网络的对应的权重参数w,初始化并封装到function中
"""
inita_w = tf.truncated_normal(shape,stddev=0.1)
return tf.Variable(inita_w,dtype=tf.float32)
def bias_variable(shape):
"""
将每一层的神经网络的对应的偏置项b,初始化并封装到function中
"""
inita_b = tf.constant(0.1,shape=shape)
return tf.Variable(inita_b)
Шаг 4 начатьTensorFlow Session
реализовать операцию обучения в вычислительном графе и преобразовать соответствующийSummary
войти в файл журнала
1. ИнициализацияSession
и установитьSession
Соответствующий расчетный граф, инициализированныйTensorFlow
переменная операцияtf.global_variables_initializer().run()
2. В расчетном графе есть два режима работы узлов, режим 1:session.run()
, Установите соответствующую операцию узла в графике расчета в функции, напримерsession.run([train_op,cross_entropy,accuracy])
вtrain_op
Представляет операцию запуска обучения модели,cross_entropy
Представляет операцию по получению перекрестной энтропии обучающей модели, точность представляет операцию по получению точности работы модели,run
Соответствующий результат работы узла, возвращаемый функцией. Способ второй, вtf.InteractiveSession
инициализацияsession
можно использовать в случаеoper.eval()
для выполнения таких операций, какtrain_op.eval()
. Этот метод может выполнять только одну операцию узла за раз.
session = tf.InteractiveSession(graph=train_graph)
# step 4.1 合并summary并初始化所有变量
merged = tf.summary.merge_all()
train_writer = tf.summary.FileWriter(log_dir+'/train',graph=train_graph)
test_writer = tf.summary.FileWriter(log_dir+'/test',graph=train_graph)
tf.global_variables_initializer().run()
# Step 4.2 训练模型并记录到TensorBoard
for iter in range(max_iter):
trainx_batch_x,train_batch_y = mnist.train.next_batch(batch_size)
#迭代10次记录一下accuracy
if iter % 10 == 0:
summmary,acc,loss = session.run([merged,accuracy,cross_entropy],feed_dict={train_x:trainx_batch_x,train_y:train_batch_y,dropout_prob:1.0})
test_writer.add_summary(summmary,iter)#写入日志
print('loss at step %s: %s'%(iter,loss))
print('Accuracy at step %s: %s'%(iter,acc))
else:
if iter % 100 == 0:
#记录tensor运行节点的信息
run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)
run_metadata = tf.RunMetadata()
#将配置信息和记录运行信息的proto传入运行的过程,从而记录运行时每一个节点的时间、空间开销信息
summmary,_ = session.run([merged,train_op],
feed_dict={train_x:trainx_batch_x,train_y:train_batch_y,dropout_prob:dropout_keep_prob},
options=run_options,
run_metadata=run_metadata)
#将节点运行时的信息写入日志文件
train_writer.add_run_metadata(run_metadata,'step %d' % iter)
train_writer.add_summary(summmary,iter)
pass
else:
summmary,_ = session.run([merged,train_op],feed_dict={train_x:trainx_batch_x,train_y:train_batch_y,dropout_prob:dropout_keep_prob})
train_writer.add_summary(summmary,iter)
train_writer.close()
test_writer.close()
session.close()
Процесс визуализации TensorBoard
TensorBoard
Типы данных, которые могут быть записаны:
Скаляр: СКАЛЯРЫ
Изображение: ИЗОБРАЖЕНИЯ
Аудио: АУДИО
Схема расчета: графики
Карта распределения данных: РАСПРЕДЕЛЕНИЯ
Гистограмма: ГИСТОГРАММЫ
Вектор встраивания: ВРЕЗКИ
Вышеуказанные данные записываются следующими способами:
tf.summary.audio(name, tensor)
tf.summary.scalar(name,tensor)
tf.summary.image(name, tensor)
tf.summary.histogram(name, tensor)
#其中name表示生成的节点的名称。 也将作为TensorBoard中的一个系列名称。tensor为要记录的数据。
#其中嵌入向量EMBEDDINGS的可视化,需要依赖于模型的保存,需要定义tf.train.Saver对象,再配置projector.ProjectorConfig对象。
Основные этапы визуализации (взято из других блогов):
1. СоздайтеGraph
Вычислительный граф, то есть вы хотите записать информацию и визуализировать некоторые данные из этого вычислительного графа.
в реализации кодаStep 3
Код — это процесс построения вычислительного графа.
train_graph = tf.Graph()
2. Убедитесь, что вы хотитеGraph
Какие узлы разместить в вычислительном графеSummary Operations
для записи информации.
вtf.name_scope(name)
Чтобы установить контекст для узла, его можно понимать как управление папками узла, а один слой содержит слой отношений.
какStep 3
Разработайте код для построения нейронной сети в вычислительном графе:
#记录其中交叉熵的值
tf.summary.scalar('loss', cross_entropy)
#记录激活函数层的输出值
tf.summary.histogram('activation',activeation)
3. Оформлен в расчетной схемеSummary Operations
На самом деле он не выполняет запись вычисления, ему нужно использовать прогон в сеансе для его выполнения, или он должен выполняться другими операционными узлами. существуетTensorFlow代码实现
изStep
создан вSummary Operations
Он не зависит от других узлов и требует специального выполнения операции узла Сводка.Step 4
код доступаmerged = tf.summary.merge_all()
положить всеSummary Operations
объединены в один узел, таким образом, непосредственноrun
Этого узла достаточно, или вы можете передать кодtf.summary.merge(input_list)
, объединить некоторые из указанныхSummary Operations
в узелrun
.
4. Используйтеtf.summary.FileWriter
Сохраните выходные данные после запуска на локальный диск.
какStep 4код в
#graph参数为指定要获取数据信息的计算图,对应着第一步。
train_writer = tf.summary.FileWriter(log_dir+'/train',graph=train_graph)
- запустите всю программу и введите run в терминале
TensorBoard
команду, а затем откройте веб-интерфейс, чтобы просмотреть визуальные результаты.
Заказ:tensorboard --logdir='./ML/log/'
Откройте соответствующий URLhttp://0.0.0.0:6006/