Добавить Автора
WeChat и QQ: 862251340
Публичный аккаунт WeChat: coderpai
мой блог:пожалуйста, нажмите здесь
Сейчас планируется изучить Python API в tensorflow, что облегчит обучение в будущем.
Оригинальная ссылка
В этой главе представлен API для построения нейронных сетей.
Представление функции активации
В нейронных сетях у нас есть много нелинейных функций в качестве функций активации, таких как непрерывные гладкие нелинейные функции (sigmoid
,tanh
иsoftplus
), непрерывная, но не гладкая нелинейная функция (relu
,relu6
иrelu_x
) и функция случайной регуляризации (dropout
).
Все функции активации применяются к каждому элементу индивидуально, а размерности выходного тензора совпадают с размерностями входного тензора.
tf.nn.relu(features, name = None)
Объяснение: Функция этой функции состоит в том, чтобы вычислить функцию активацииrelu
,Сейчасmax(features, 0)
.
Пример использования:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
a = tf.constant([-1.0, 2.0])
with tf.Session() as sess:
b = tf.nn.relu(a)
print sess.run(b)
Входные параметры:
features
: ОдинTensor
. Тип данных должен быть:float32
,float64
,int32
,int64
,uint8
,int16
,int8
.name
: (необязательно) дать имя этой операции.
Выходные параметры:
Один
Tensor
, тип данных иfeatures
такой же.
tf.nn.relu6(features, name = None)
Объяснение: Функция этой функции состоит в том, чтобы вычислить функцию активацииrelu6
,Сейчасmin(max(features, 0), 6)
.
Пример использования:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
a = tf.constant([-1.0, 12.0])
with tf.Session() as sess:
b = tf.nn.relu6(a)
print sess.run(b)
Входные параметры:
features
: ОдинTensor
. Тип данных должен быть:float
,double
,int32
,int64
,uint8
,int16
илиint8
.name
: (необязательно) дать имя этой операции.
Выходные параметры:
Один
Tensor
, тип данных иfeatures
такой же.
tf.nn.softplus(features, name = None)
Объяснение: Функция этой функции состоит в том, чтобы вычислить функцию активацииsoftplus
,Сейчасlog( exp( features ) + 1)
.
Пример использования:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
a = tf.constant([-1.0, 12.0])
with tf.Session() as sess:
b = tf.nn.softplus(a)
print sess.run(b)
Входные параметры:
features
: ОдинTensor
. Тип данных должен быть:float32
,float64
,int32
,int64
,uint8
,int16
илиint8
.name
: (необязательно) дать имя этой операции.
Выходные параметры:
Один
Tensor
, тип данных иfeatures
такой же.
tf.nn.dropout(x, keep_prob, noise_shape = None, seed = None, name = None)
Объяснение: Функция этой функции состоит в том, чтобы вычислить слой нейронной сети.dropout
.
Нейрон будет вероятностнымkeep_prob
решает, срабатывать ли, если нет, то выход этого нейрона будет0
, если нейрон сработает, то выходное значение нейрона будет усилено до исходного1/keep_prob
раз. Операция усиления здесь заключается в сохранении неизменного общего количества выходов нейронов. Например, значение нейрона[1, 2]
,keep_prob
Значение0.5
, и первый нейрон срабатывает, а второй нейрон не срабатывает, то результат вывода нейрона равен[2, 0]
, что эквивалентно тому, что первый нейрон рассматривается как1/keep_prob
выход, то есть2
Кусок. Это гарантирует, что сумма2
нейроны остаются без изменений.
По умолчанию то, срабатывает каждый нейрон или нет, не зависит друг от друга. но еслиnoise_shape
модифицируется, то он отвечает за переменнуюx
является формой вещания тогда и только тогда, когдаnoise_shape[i] == shape(x)[i]
,x
Элементы в независимы друг от друга. Например, еслиshape(x) = [k, l, m, n], noise_shape = [k, 1, 1, n]
, то каждый пакет и канал независимы друг от друга, но данные каждой строки и столбца связаны, то есть либо все равны 0, либо все равно исходное значение.
Пример использования:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
a = tf.constant([[-1.0, 2.0, 3.0, 4.0]])
with tf.Session() as sess:
b = tf.nn.dropout(a, 0.5, noise_shape = [1,4])
print sess.run(b)
b = tf.nn.dropout(a, 0.5, noise_shape = [1,1])
print sess.run(b)
Входные параметры:
x
: ОдинTensor
.keep_prob
: плавающий тип Python. Указывает вероятность того, что элемент разряжен или нет.noise_shape
: одномерныйTensor
, тип данныхint32
. Флаг, указывающий, является ли элемент независимым.seed
: Целочисленный тип Python. Установите случайное семя.name
: (необязательно) дать имя этой операции.
Выходные параметры:
Один
Tensor
, размерность данных иx
такой же.
аномальный:
输入异常
: еслиkeep_prob
не в(0, 1]
интервал, появится сообщение об ошибке.
tf.nn.bias_add(value, bias, name = None)
Объяснение: Функция этой функции состоит в преобразовании члена смещенияbias
добавить вvalue
выше.
Вы можете рассматривать эту операцию какtf.add
частный случай , гдеbias
Должен быть одномерным. API поддерживает широковещательную форму, поэтомуvalue
Может иметь любую размерность. Однако API не такой, какtf.add
, может позволитьbias
размер иvalue
Последнее измерение . Подробности смотрите в примерах использования.
Пример использования:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
a = tf.constant([[1.0, 2.0],[1.0, 2.0],[1.0, 2.0]])
b = tf.constant([2.0,1.0])
c = tf.constant([1.0])
sess = tf.Session()
print sess.run(tf.nn.bias_add(a, b))
# 因为 a 最后一维的维度是 2 ,但是 c 的维度是 1,所以以下语句将发生错误
print sess.run(tf.nn.bias_add(a, c))
# 但是 tf.add() 可以正确运行
print sess.run(tf.add(a, c))
Входные параметры:
value
: ОдинTensor
. тип данных должен бытьfloat
,double
,int64
,int32
,uint8
,int16
,int8
илиcomplex64
.bias
: одномерныйTensor
, размерность данных иvalue
Последнее измерение такое же. Тип данных должен быть таким же, какvalue
такой же.name
: (необязательно) дать имя этой операции.
Выходные параметры:
Один
Tensor
, тип данных иvalue
такой же.
tf.sigmoid(x, name = None)
Объяснение: Функция этой функции состоит в том, чтобы вычислитьx
сигмовидная функция. Конкретная формула расчетаy = 1 / (1 + exp(-x))
.
Пример использования:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
a = tf.constant([[1.0, 2.0], [1.0, 2.0], [1.0, 2.0]])
sess = tf.Session()
print sess.run(tf.sigmoid(a))
Входные параметры:
x
: ОдинTensor
. тип данных должен бытьfloat
,double
,int32
,complex64
,int64
илиqint32
.name
: (необязательно) дать имя этой операции.
Выходные параметры:
Один
Tensor
,еслиx.dtype != qint32
, затем возвращаемый тип данных иx
то же самое, в противном случае возвращаемый тип данныхquint8
.
tf.tanh(x, name = None)
Объяснение: Функция этой функции состоит в том, чтобы вычислитьx
функция тан. Конкретная формула расчета( exp(x) - exp(-x) ) / ( exp(x) + exp(-x) )
.
Пример использования:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
a = tf.constant([[1.0, 2.0],[1.0, 2.0],[1.0, 2.0]])
sess = tf.Session()
print sess.run(tf.tanh(a))
Входные параметры:
x
: ОдинTensor
. тип данных должен бытьfloat
,double
,int32
,complex64
,int64
илиqint32
.name
: (необязательно) дать имя этой операции.
Выходные параметры:
Один
Tensor
,еслиx.dtype != qint32
, затем возвращаемый тип данных иx
то же самое, в противном случае возвращаемый тип данныхquint8
.
сверточный слой
Операция свертки использует двумерное ядро свертки для непрерывного сканирования пакета изображений. Конкретная операция заключается в сканировании ядра свертки на каждом канале в соответствии с подходящим размером каждого изображения. Для достижения хорошей эффективности свертки требуется компромисс между разными каналами и разными ядрами свертки.
conv2d
: Произвольное ядро свертки, которое может одновременно выполнять операции свертки на разных каналах.depthwise_conv2d
: ядра свертки могут выполнять операции свертки на своих собственных каналах независимо друг от друга.separable_conv2d
: Свертка в глубинуdepthwise filter
Затем выполните поточечную сверткуseparable filter
.
Обратите внимание, что хотя эти операции и называются операциями свертки, строго говоря, они простоКорреляция, потому что ядро свертки не выполняет процесс обратной свертки.
Процесс свертки ядра свертки соответствуетstrides
параметры, такие какstrides = [1, 1, 1, 1]
Указывает, что ядро свертки выполняет свертку над каждым пикселем, то есть на двумерном экране размер шага по обеим осям равен 1.strides = [1, 2, 2, 1]
Указывает, что ядро свертки выполняет свертку для каждого второго пикселя, то есть на двумерном экране размер шага по обеим осям равен 2.
Если мы пока игнорируем фактор канала, пространственный смысл операции свертки определяется следующим образом: если входные данные являются четырехмернымиinput
, размерность данных[batch, in_height, in_width, ...]
, ядро свертки также является четырехмерным ядром свертки, а размерность данных равна[filter_height, filter_width, ...]
,Так:
shape(output) = [batch,
(in_height - filter_height + 1) / strides[1],
(in_width - filter_width + 1) / strides[2],
...]
output[b, i, j, :] =
sum_{di, dj} input[b, strides[1] * i + di, strides[2] * j + dj, ...] *
filter[di, dj, ...]
так как,input
Данные четырехмерные, с вектором над каждым каналомinput[b, i, j, :]
. заconv2d
, эти векторы будут использоваться ядром сверткиfilter[di, dj, :, :]
Умножьте, чтобы создать новый вектор. заdepthwise_conv_2d
, каждая скалярная компонентаinput[b, i, j, k]
будетk
Независимые ядра свертки на каждом каналеfilter[di, dj, k]
Выполните операцию свертки, а затем объедините все полученные векторы в новый вектор.
Для размерности выходных данныхshape(output)
, который зависит от параметра заполненияpadding
параметр:
padding = 'SAME'
: Округление в меньшую сторону, только для полноразмерных операций, т. е. размерность входных данных и размерность выходных данных совпадают.padding = 'VALID
: сводка, применимая к некоторым окнам, т. е. измерение входных данных и измерение выходных данных различаются.
tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)
Объяснение: Эта функция работает с четырехмерными входными данными.input
и четырехмерное ядро сверткиfilter
Выполните операцию, а затем выполните операцию двумерной свертки над входными данными и, наконец, получите результат после свертки.
Размерности данного входного тензора равны[batch, in_height, in_width, in_channels]
, размерность тензора ядра свертки равна[filter_height, filter_width, in_channels, out_channels]
, конкретная операция свертки выглядит следующим образом:
Преобразуйте размерность ядра свертки в двумерную матричную форму
[filter_height * filter_width * in_channels, output_channels]
Для каждой партии изображений мы преобразуем входной тензор во временное измерение данных.
[batch, out_height, out_width, filter_height * filter_width * in_channels]
.Для каждого пакета изображений мы умножаем ядро свертки вправо, чтобы получить окончательный результат.
Более конкретные детали представления:
output[b, i, j, k] =
sum_{di, dj, q} input[b, strides[1] * i + di, strides[2] * j + dj, q] *
filter[di, dj, q, k]
Обратите внимание, что должно бытьstrides[0] = strides[3] = 1
. В большинстве случаев количество шагов горизонтального и вертикального перемещения ядра свертки одинаково, т.е.strides = [1, stride, stride, 1]
.
Пример использования:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import tensorflow as tf
input_data = tf.Variable( np.random.rand(10,6,6,3), dtype = np.float32 )
filter_data = tf.Variable( np.random.rand(2, 2, 3, 1), dtype = np.float32)
y = tf.nn.conv2d(input_data, filter_data, strides = [1, 1, 1, 1], padding = 'SAME')
with tf.Session() as sess:
init = tf.initialize_all_variables()
sess.run(init)
print sess.run(y)
print sess.run(tf.shape(y))
Входные параметры:
input
: ОдинTensor
. тип данных должен бытьfloat32
илиfloat64
.filter
: ОдинTensor
. тип данных должен бытьinput
такой же.strides
: Одномерный массив целочисленного типа длиной 4, каждое измерение соответствуетinput
Соответствующие шаги перемещения для каждого измерения в , например,strides[1]
соответствоватьinput[1]
количество шагов движения.padding
: строка, значение которойSAME
илиVALID
.use_cudnn_on_gpu
: необязательное логическое значение, которое по умолчанию равноTrue
.name
: (необязательно) дать имя этой операции.
Выходные параметры:
Один
Tensor
, тип данныхinput
такой же.
tf.nn.depthwise_conv2d(input, filter, strides, padding, name=None)
Объяснение: Эта функция также является операцией свертки.
Учитывая входной тензор, размерность данных равна[batch, in_height, in_width, in_channels]
, размер ядра свертки равен[filter_height, filter_width, in_channels, channel_multiplier]
, на каналеin_channels
Глубина свертки выше равна 1 (насколько я понимаю, свертка выполняется для каждого канала отдельно),depthwise_conv2d
Функция применяет различные ядра свертки независимо друг от друга.in_channels
на каждом канале (подчиненный канал1
направлятьchannel_multiplier
), а затем объединить все результаты. Общее количество конечных выходных каналов равноin_channels * channel_multiplier
.
Более конкретная формула выглядит следующим образом:
output[b, i, j, k * channel_multiplier + q] =
sum_{di, dj} input[b, strides[1] * i + di, strides[2] * j + dj, k] *
filter[di, dj, k, q]
Обратите внимание, что должно бытьstrides[0] = strides[3] = 1
. В большинстве случаев количество шагов горизонтального и вертикального перемещения ядра свертки одинаково, т.е.strides = [1, stride, stride,1]
.
Пример использования:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import tensorflow as tf
input_data = tf.Variable( np.random.rand(10, 6, 6, 3), dtype = np.float32 )
filter_data = tf.Variable( np.random.rand(2, 2, 3, 5), dtype = np.float32)
y = tf.nn.depthwise_conv2d(input_data, filter_data, strides = [1, 1, 1, 1], padding = 'SAME')
with tf.Session() as sess:
init = tf.initialize_all_variables()
sess.run(init)
print sess.run(y)
print sess.run(tf.shape(y))
Входные параметры:
input
: ОдинTensor
. Измерение данных является четырехмерным[batch, in_height, in_width, in_channels]
.filter
: ОдинTensor
. Измерение данных является четырехмерным[filter_height, filter_width, in_channels, channel_multiplier]
.strides
: Одномерный массив целочисленного типа длиной 4, каждое измерение соответствуетinput
Соответствующие шаги перемещения для каждого измерения в , например,strides[1]
соответствоватьinput[1]
количество шагов движения.padding
: строка, значение которойSAME
илиVALID
.use_cudnn_on_gpu
: необязательное логическое значение, которое по умолчанию равноTrue
.name
: (необязательно) дать имя этой операции.
Выходные параметры:
четырехмерный
Tensor
, размерность данных[batch, out_height, out_width, in_channels * channel_multiplier]
.
tf.nn.separable_conv2d(input, depthwise_filter, pointwise_filter, strides, padding, name=None)
Объяснение: Функция этой функции заключается в использовании нескольких отдельных ядер свертки для выполнения свертки, вы можете обратиться кэто объяснение.
Например, на следующем рисунке разница между обычной сверткой и отдельной сверткой:
Эта свертка предназначена для того, чтобы избежать свертки ядра свертки в случае полных каналов, что является пустой тратой времени. Используя этот API, вы примените двумерное ядро свертки к каждому каналу с глубинойchannel_multiplier
Делайте свертки. На самом деле, как показано вышеSeparable Convolution
, использовать сначалаdepthwise_filter
,будетID
Количество каналов соответствуетID * DM
количество каналов выше, затем отID * DM
Количество каналов соответствуетOD
выше количества каналов, что является глубиной, упомянутой вышеchannel_multiplier
соответствуетDM
.
Конкретная формула выглядит следующим образом:
output[b, i, j, k] = sum_{di, dj, q, r]
input[b, strides[1] * i + di, strides[2] * j + dj, q] *
depthwise_filter[di, dj, q, r] *
pointwise_filter[0, 0, q * channel_multiplier + r, k]
strides
просто контролируйdepthwise convolution
Шаг свертки , потому чтоpointwise convolution
Шаг свертки определяется[1, 1, 1, 1]
. Обратите внимание, что должно бытьstrides[0] = strides[3] = 1
. В большинстве случаев количество шагов горизонтального и вертикального перемещения ядра свертки одинаково, т.е.strides = [1, stride, stride, 1]
.
Пример использования:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import tensorflow as tf
input_data = tf.Variable( np.random.rand(10, 6, 6, 3), dtype = np.float32 )
depthwise_filter = tf.Variable( np.random.rand(2, 2, 3, 5), dtype = np.float32)
pointwise_filter = tf.Variable( np.random.rand(1, 1, 15, 20), dtype = np.float32)
# out_channels >= channel_multiplier * in_channels
y = tf.nn.separable_conv2d(input_data, depthwise_filter, pointwise_filter, strides = [1, 1, 1, 1], padding = 'SAME')
with tf.Session() as sess:
init = tf.initialize_all_variables()
sess.run(init)
print sess.run(y)
print sess.run(tf.shape(y))
Входные параметры:
input
: ОдинTensor
. Измерение данных является четырехмерным[batch, in_height, in_width, in_channels]
.depthwise_filter
: ОдинTensor
. Измерение данных является четырехмерным[filter_height, filter_width, in_channels, channel_multiplier]
. в,in_channels
Глубина свертки равна 1.pointwise_filter
: ОдинTensor
. Измерение данных является четырехмерным[1, 1, channel_multiplier * in_channels, out_channels]
. в,pointwise_filter
вdepthwise_filter
Гибридная свертка после свертки.strides
: Одномерный массив целочисленного типа длиной 4, каждое измерение соответствуетinput
Соответствующие шаги перемещения для каждого измерения в , например,strides[1]
соответствоватьinput[1]
количество шагов движения.padding
: строка, значение которойSAME
илиVALID
.name
: (необязательно) дать имя этой операции.
Выходные параметры:
четырехмерный
Tensor
, размерность данных[batch, out_height, out_width, out_channels]
.
аномальный:
数值异常
: еслиchannel_multiplier * in_channels > out_channels
, то будет выдано сообщение об ошибке.
объединяющий слой
Операция объединения сканирует входной тензор окном матрицы и уменьшает количество элементов, принимая максимальное, среднее или значение XXXX в каждом окне матрицы. Размер матричного окна для каждой операции объединения определяется какksize
задается, а в соответствии с параметром шагаstrides
определить размер шага движения. Например, еслиstrides
Все значения равны 1, тогда будет использоваться каждое окно матрицы. еслиstrides
Значение in равно 2, тогда используется каждое второе окно матрицы в каждом измерении. И так далее.
Более конкретный вывод:
output[i] = reduce( value[ strides * i: strides * i + ksize ] )
Размерности выходных данных:
shape(output) = (shape(value) - ksize + 1) / strides
где направление округления зависит от параметраpadding
:
padding = 'SAME'
: Округление в меньшую сторону, только для полноразмерных операций, т. е. размерность входных данных и размерность выходных данных совпадают.padding = 'VALID
: сводка, применимая к некоторым окнам, т. е. измерение входных данных и измерение выходных данных различаются.
tf.nn.avg_pool(value, ksize, strides, padding, name=None)
Объяснение: Целью этой функции является вычисление среднего значения элементов в объединенной области.
Пример использования:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import tensorflow as tf
input_data = tf.Variable( np.random.rand(10,6,6,3), dtype = np.float32 )
filter_data = tf.Variable( np.random.rand(2, 2, 3, 10), dtype = np.float32)
y = tf.nn.conv2d(input_data, filter_data, strides = [1, 1, 1, 1], padding = 'SAME')
output = tf.nn.avg_pool(value = y, ksize = [1, 2, 2, 1], strides = [1, 1, 1, 1], padding = 'SAME')
with tf.Session() as sess:
init = tf.initialize_all_variables()
sess.run(init)
print sess.run(output)
print sess.run(tf.shape(output))
Входные параметры:
value
: четырехмерныйTensor
. Измерение данных[batch, height, width, channels]
. тип данныхfloat32
,float64
,qint8
,quint8
,qint32
.ksize
: Целочисленный массив длины 4 или более. Значение над каждым битом соответствует окну, соответствующему значению для каждого измерения в тензоре входных данных.strides
: Целочисленный массив длины 4 или более. Этот параметр задает размер шага скользящего окна по каждому измерению тензора входных данных.padding
: строка, значение которойSAME
илиVALID
.name
: (необязательно) дать имя этой операции.
Выходные параметры:
Один
Tensor
, тип данных иvalue
такой же.
tf.nn.max_pool(value, ksize, strides, padding, name=None)
Объяснение: Роль этой функции заключается в вычислении максимального значения элементов в объединенной области.
Пример использования:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import tensorflow as tf
input_data = tf.Variable( np.random.rand(10,6,6,3), dtype = np.float32 )
filter_data = tf.Variable( np.random.rand(2, 2, 3, 10), dtype = np.float32)
y = tf.nn.conv2d(input_data, filter_data, strides = [1, 1, 1, 1], padding = 'SAME')
output = tf.nn.max_pool(value = y, ksize = [1, 2, 2, 1], strides = [1, 1, 1, 1], padding = 'SAME')
with tf.Session() as sess:
init = tf.initialize_all_variables()
sess.run(init)
print sess.run(output)
print sess.run(tf.shape(output))
Входные параметры:
value
: четырехмерныйTensor
. Измерение данных[batch, height, width, channels]
. тип данныхfloat32
,float64
,qint8
,quint8
,qint32
.ksize
: Целочисленный массив длины 4 или более. Значение над каждым битом соответствует окну, соответствующему значению для каждого измерения в тензоре входных данных.strides
: Целочисленный массив длины 4 или более. Этот параметр задает размер шага скользящего окна по каждому измерению тензора входных данных.padding
: строка, значение которойSAME
илиVALID
.name
: (необязательно) дать имя этой операции.
Выходные параметры:
Один
Tensor
, тип данных иvalue
такой же.
tf.nn.max_pool_with_argmax(input, ksize, strides, padding, Targmax = None, name=None)
Объяснение: Функция этой функции заключается в вычислении максимального значения элементов в области объединения и позиции максимального значения.
потому что расчет местоположенияargmax
, мы будемinput
Проложите расчет, так что еслиinput = [b, y, x, c]
, то позиция индекса( ( b * height + y ) * width + x ) * channels + c
.
Глядя на исходный код, этот API можно использовать только в среде графического процессора, поэтому я не тестировал следующие примеры использования, если вы можете протестировать, сообщите мне, работает ли программа.
Отображение исходного кода:
REGISTER_KERNEL_BUILDER(Name("MaxPoolWithArgmax")
.Device(DEVICE_GPU)
.TypeConstraint<int64>("Targmax")
.TypeConstraint<float>("T"),
MaxPoolingWithArgmaxOp<Eigen::GpuDevice, float>);
REGISTER_KERNEL_BUILDER(Name("MaxPoolWithArgmax")
.Device(DEVICE_GPU)
.TypeConstraint<int64>("Targmax")
.TypeConstraint<Eigen::half>("T"),
MaxPoolingWithArgmaxOp<Eigen::GpuDevice, Eigen::half>);
Пример использования:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import tensorflow as tf
input_data = tf.Variable( np.random.rand(10,6,6,3), dtype = tf.float32 )
filter_data = tf.Variable( np.random.rand(2, 2, 3, 10), dtype = np.float32)
y = tf.nn.conv2d(input_data, filter_data, strides = [1, 1, 1, 1], padding = 'SAME')
output, argmax = tf.nn.max_pool_with_argmax(input = y, ksize = [1, 2, 2, 1], strides = [1, 1, 1, 1], padding = 'SAME')
with tf.Session() as sess:
init = tf.initialize_all_variables()
sess.run(init)
print sess.run(output)
print sess.run(tf.shape(output))
Входные параметры:
input
: четырехмерныйTensor
. Измерение данных[batch, height, width, channels]
. тип данныхfloat32
.ksize
: Целочисленный массив длины 4 или более. Значение над каждым битом соответствует окну, соответствующему значению для каждого измерения в тензоре входных данных.strides
: Целочисленный массив длины 4 или более. Этот параметр задает размер шага скользящего окна по каждому измерению тензора входных данных.padding
: строка, значение которойSAME
илиVALID
.Targmax
: необязательный тип данных:tf.int32
илиtf.int64
. По умолчанию этоtf.int64
.name
: (необязательно) дать имя этой операции.
Выходные параметры:
тензор кортежа(output, argmax)
:
output
: ОдинTensor
, тип данныхfloat32
. Представляет максимальное значение области объединения.argmax
: ОдинTensor
, тип данныхTargmax
. Измерение данных является четырехмерным.
стандартизация
Нормализация — отличный способ предотвратить переоснащение вашей модели. Особенно в случае больших данных.
tf.nn.l2_normalize(x, dim, epsilon=1e-12, name=None)
Объяснение: Функция этой функции заключается в использовании нормы L2 для указания размераdim
Стандартизировать.
Например, для одномерного тензора укажите размерностьdim = 0
, то результат расчета:
output = x / sqrt( max( sum( x ** 2 ) , epsilon ) )
Предположениеx
является многомерным, то нормализация не зависит только от размерностиdim
продолжить, не затрагивая другие измерения.
Пример использования:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import tensorflow as tf
input_data = tf.Variable( np.random.rand(2, 3), dtype = tf.float32 )
output = tf.nn.l2_normalize(input_data, dim = 0)
with tf.Session() as sess:
init = tf.initialize_all_variables()
sess.run(init)
print sess.run(output)
print sess.run(tf.shape(output))
Входные параметры:
x
: ОдинTensor
.dim
: Размер, который необходимо нормализовать.epsilon
: небольшое значение, определяющее нижнюю границу нормализации. еслиnorm < sqrt(epsilon)
, то будем использоватьsqrt(epsilon)
Стандартизировать.name
: (необязательно) дать имя этой операции.
Выходные параметры:
ОдинTensor
, размерность данных иx
такой же.
tf.nn.local_response_normalization(input, depth_radius=None, bias=None, alpha=None, beta=None, name=None)
Объяснение: Целью этой функции является вычисление нормализации локальных данных.
входные данныеinput
является четырехмерным тензором, но тензор рассматривается как одномерный вектор (input
В качестве вектора используется последнее измерение вектора), и каждый элемент вектора представляет собой трехмерный массив (соответствующийinput
передние три измерения). Каждый элемент вектора нормализуется независимо. Конкретная математическая форма выглядит следующим образом:
sqr_sum[a, b, c, d] =
sum(input[a, b, c, d - depth_radius : d + depth_radius + 1] ** 2)
output = input / (bias + alpha * sqr_sum ** beta)
Если вы хотите узнать больше об этой стандартизации, вы можете обратиться кЭто эссе.
Пример использования:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import tensorflow as tf
input_data = tf.Variable( np.random.rand(1, 2, 3, 4), dtype = tf.float32 )
output = tf.nn.local_response_normalization(input_data)
with tf.Session() as sess:
init = tf.initialize_all_variables()
sess.run(init)
print sess.run(input_data)
print sess.run(output)
print sess.run(tf.shape(output))
Входные параметры:
input
: ОдинTensor
. Измерение данных четырехмерное, а тип данныхfloat32
.depth_radius
: (необязательно) целое число, по умолчанию 5 .bias
: (необязательно) число с плавающей запятой, по умолчанию 1. Термин смещения, чтобы избежать деления на 0, мы обычно берем положительное значение.alpha
: (необязательно) число с плавающей запятой, по умолчанию 1. Масштабный коэффициент, в общем случае, мы принимаем положительное значение.beta
: (необязательно) число с плавающей запятой, по умолчанию 0,5. индекс.name
: (необязательно) дать имя этой операции.
Выходные параметры:
ОдинTensor
, тип данныхfloat32
.
tf.nn.moments(x, axes, name=None)
Объяснение: Функция этой функции состоит в том, чтобы вычислитьx
среднее значение и дисперсия.
вместеaxes
размер, расчетx
среднее значение и дисперсия. еслиx
является одномерным иaxes = [0]
, затем вычислите среднее значение и дисперсию всего вектора.
Если, возьмемaxes = [0, 1, 2] (batch, height, width)
, затем мы вычисляем глобальную нормализацию свертки. Если мы просто вычислим нормализацию партии, то возьмемaxes = [0] (batch)
.
Пример использования:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import tensorflow as tf
input_data = tf.Variable( np.random.rand(2, 3), dtype = tf.float32 )
mean, variance = tf.nn.moments(input_data, [0])
with tf.Session() as sess:
init = tf.initialize_all_variables()
sess.run(init)
print sess.run(input_data)
print sess.run(mean)
print sess.run(tf.shape(mean))
Входные параметры:
x
: ОдинTensor
.axes
: Массив целых чисел, определяющий измерения, по которым вычисляются среднее значение и дисперсия.name
: Дайте операции имя.
Выходные параметры:
дваTensor
, соответственно среднееmean
и дисперсияvariance
.
разница
Измеряет ошибку потери между двумя тензорами или тензором и нулем, которую можно использовать в задаче регрессии или для целей регуляризации (уменьшение веса).
tf.nn.l2_loss(t, name=None)
Объяснение: функция этой функции состоит в том, чтобы использовать норму L2 для вычисления значения ошибки тензора, но здесь нет квадратного корня, и берется только половина значения нормы L2, как показано ниже:
output = sum(t ** 2) / 2
Пример использования:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import tensorflow as tf
input_data = tf.Variable( np.random.rand(2, 3), dtype = tf.float32 )
output = tf.nn.l2_loss(input_data)
with tf.Session() as sess:
init = tf.initialize_all_variables()
sess.run(init)
print sess.run(input_data)
print sess.run(output)
print sess.run(tf.shape(output))
Входные параметры:
t
: ОдинTensor
. Тип данных должен быть одним из следующих:float32
,float64
,int64
,int32
,uint8
,int16
,int8
,complex64
,qint8
,quint8
,qint32
. Хотя в целом размерность данных двумерная. Однако измерение данных может принимать любое измерение.name
: Дайте операции имя.
Выходные параметры:
ОдинTensor
, тип данных иt
То же, скаляр.
Операция классификации
Tensorflow предоставляет операции, которые могут помочь вам лучше выполнять операции классификации.
tf.nn.sigmoid_cross_entropy_with_logits(logits, targets, name=None)
Объяснение: Функция этой функции состоит в том, чтобы вычислитьlogits
Кросс-энтропия после активации сигмовидной функцией.
Для дискретной задачи классификации, которая не является независимой друг от друга, функция этой функции состоит в измерении вероятности ошибки. Например, если изображение одновременно содержит несколько целей классификации (слон и собака), можно использовать эту функцию.
Для краткости описания оговоримx = logits
,z = targets
, то значение логистических потерь равно:
x - x * z + log( 1 + exp(-x) )
Чтобы обеспечить стабильность расчета и избежать переполнения, реальный расчет реализован следующим образом:
max(x, 0) - x * z + log(1 + exp(-abs(x)) )
logits
иtargets
Должен иметь одинаковый тип данных и измерение данных.
Пример использования:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import tensorflow as tf
input_data = tf.Variable( np.random.rand(1,3), dtype = tf.float32 )
output = tf.nn.sigmoid_cross_entropy_with_logits(input_data, [[1.0,0.0,0.0]])
with tf.Session() as sess:
init = tf.initialize_all_variables()
sess.run(init)
print sess.run(input_data)
print sess.run(output)
print sess.run(tf.shape(output))
Входные параметры:
logits
: ОдинTensor
. Тип данных является одним из следующих:float32
илиfloat64
.targets
: ОдинTensor
. Тип данных и измерение данных такие же, какlogits
такой же.name
: Дайте операции имя.
Выходные параметры:
ОдинTensor
, размерность данных иlogits
такой же.
tf.nn.softmax(logits, name=None)
Объяснение: Целью этой функции является вычисление функции активации softmax.
за каждую партиюi
и классификацияj
, мы можем получить:
softmax[i, j] = exp(logits[i, j]) / sum(exp(logits[i]))
Пример использования:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import tensorflow as tf
input_data = tf.Variable( [[0.2, 0.1, 0.9]] , dtype = tf.float32 )
output = tf.nn.softmax(input_data)
with tf.Session() as sess:
init = tf.initialize_all_variables()
sess.run(init)
print sess.run(input_data)
print sess.run(output)
print sess.run(tf.shape(output))
Входные параметры:
logits
: ОдинTensor
. Тип данных является одним из следующих:float32
илиfloat64
. Измерение данных является двумерным[batch_size, num_classes]
.name
: Дайте операции имя.
Выходные параметры:
ОдинTensor
, размер данных и тип данных такие же, какlogits
такой же.
tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None)
Объяснение: Функция этой функции состоит в том, чтобы вычислитьlogits
Кросс-энтропия после активации функцией softmax.
Для каждой отдельной задачи классификации эта функция измеряет вероятность ошибки. Например, в наборе данных CIFAR-10 каждое изображение имеет уникальную классификационную метку: изображение может быть собакой или грузовиком, но абсолютно невозможно иметь и то, и другое на одном изображении. (Это также то же самое, что и `tf.nn.sigmoid_cross_entropy_with_logits(logits, target, name=None)
`Разница этого API)
Внимание: данные введены в APIlogits
Масштабирование невозможно, так как при выполнении этого API выполняется вычисление softmax, еслиlogits
Если он масштабируется, это повлияет на точность расчета. Не вызывайте эту область API для вычисления значения softmax, поскольку окончательный результат вывода этого API не является значением, которое проходит через функцию softmax.
logits
иlabels
должны иметь одинаковые размеры данных[batch_size, num_classes]
, и тот же тип данныхfloat32
илиfloat64
.
Пример использования:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
import tensorflow as tf
input_data = tf.Variable( [[0.2, 0.1, 0.9]] , dtype = tf.float32 )
output = tf.nn.softmax_cross_entropy_with_logits(input_data, [[1,0,0]])
with tf.Session() as sess:
init = tf.initialize_all_variables()
sess.run(init)
print sess.run(input_data)
print sess.run(output)
print sess.run(tf.shape(output))
Входные параметры:
logits
: логарифмический тензор без масштабирования.labels
: каждая строкаlabels[i]
Должно быть допустимым значением распределения вероятностей.name
: Дайте операции имя.
Выходные параметры:
ОдинTensor
, размерность данных одномерная, а длинаbatch_size
, оба типа данныхlogits
такой же.
Встраиваемый слой
Tensorflow предоставляет библиотеки для встраивания поиска из тензоров.
tf.nn.embedding_lookup(params, ids, name=None)
Объяснение: Функция этой функции — запроситьparams
средний индексids
значение .
Эта операцияtf.gather()
Обобщение , но его можно обрабатывать параллельно, гдеparams
считается большой тензорной библиотекой,ids
Значения в соответствуют отдельным разделам.
еслиlen(params) > 1
,ids
каждый элемент вid
соответствуетparams
каждый раздел вp
,Сейчасp = id % len(params)
. Тогда каждый срез, который мы получаем,params[p][id // len(params), ...]
.
Результирующие результаты среза повторно соединяются в плотный тензор, и окончательная возвращаемая размерность тензора равнаshape(ids) + shape(params)[1: ]
.
Пример использования:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
import numpy as np
params = tf.constant(np.random.rand(3,4))
ids = tf.constant([0,2])
output = tf.nn.embedding_lookup(params, ids)
with tf.Session() as sess:
print 'params: ', sess.run(params)
print '-------------------------------'
print '输出第0行和第2行: ', sess.run(output)
Входные параметры:
params
: тензор с той же размерностью данных и типом данных.ids
: тензор, тип данных которогоint32
.name
: Дайте операции имя.
Выходные параметры:
ОдинTensor
, тип данных иparams
такой же.
аномальный:
数值异常
: еслиparams
пусто, то будет выброшено это исключение.
Оценить операции
Операции оценки полезны для измерения производительности сети. Поскольку они не дифференцируемы, они обычно используются только на этапе оценки.
tf.nn.top_k(input, k, name=None)
Объяснение: Цель этой функции — вернутьinput
Самый большой на строку вk
число и возвращает индекс их местоположения.
value(i, j)
представляет входные данныеinput(i)
Первыйj
большой элемент.
indices(i, j)
дает индекс столбца соответствующего элемента, т.е.input(i, indices(i, j)) = values(i, j)
. Если встречаются два одинаковых элемента, то сначала берется значение с меньшим индексом.
Пример использования:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
import numpy as np
input = tf.constant(np.random.rand(3,4))
k = 2
output = tf.nn.top_k(input, k)
with tf.Session() as sess:
print sess.run(input)
print '--------------------'
print sess.run(output)
Входные параметры:
input
: тензор, тип данных должен быть одним из следующих:float32
,float64
,int32
,int64
,uint8
,int16
,int8
. Измерение данныхbatch_size
ездить наx
категории.k
: целое число, должно>= 1
. В каждой строке найдите наибольшееk
ценность.name
: Дайте операции имя.
Выходные параметры:
кортежTensor
, элемент данных(values, indices)
, подробности следующим образом:
values
: тензор, тип данных иinput
такой же. Измерение данныхbatch_size
ездить наk
максимальное значение.indices
: тензор, тип данных которогоint32
. каждый максимум вinput
положение индекса в .
tf.nn.in_top_k(predictions, targets, k, name=None)
Объяснение: Эта функция предназначена для возврата логического вектора, указывающего, существует ли целевое значение в прогнозируемом значении.
Выходные данные представляют собойbatch_size
логический вектор длин, если целевое значение присутствует в прогнозируемом значении, тоout[i] = true
.
Уведомление:targets
даpredictions
биты индекса в , неpredictions
конкретное значение в .
Пример использования:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf
import numpy as np
input = tf.constant(np.random.rand(3,4), tf.float32)
k = 2
output = tf.nn.in_top_k(input, [3,3,3], k)
with tf.Session() as sess:
print sess.run(input)
print '--------------------'
print sess.run(output)
Входные параметры:
predictions
: тензор, тип данных которогоfloat32
. Измерение данныхbatch_size
ездить наx
категории.targets
: тензор, тип данных которогоint32
. длинаbatch_size
Вектор , где элементы являются цельюclass ID
.k
: целое число. В каждой строке найдите наибольшееk
ценность.name
: Дайте операции имя.
Выходные параметры:
тензор, тип данных которогоbool
. Определите, верен ли прогноз.
Candidate Sampling
Это какие-то функции сэмплирования, так как я не очень хорошо в этом разбираюсь, пока не буду учить...
CoderPai — это платформа, ориентированная на алгоритмический бой, с дизайном от базовых алгоритмов до алгоритмов искусственного интеллекта. Если вы заинтересованы в алгоритмическом бою, пожалуйста, следуйте за нами быстро. Присоединяйтесь к группе WeChat для реальных боевых действий AI, группе QQ для реальных боевых действий AI, группе WeChat по алгоритму ACM, группе QQ по алгоритму ACM. Для получения подробной информации, пожалуйста, обратите внимание на учетную запись WeChat «CoderPai» (coderpai).