Перевод Tensorflow Python API (nn)

TensorFlow Python алгоритм API

Добавить Автора
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)

Объяснение: Функция этой функции заключается в использовании нескольких отдельных ядер свертки для выполнения свертки, вы можете обратиться кэто объяснение.

Например, на следующем рисунке разница между обычной сверткой и отдельной сверткой:

Typical Convolution

Separable Convolution

Эта свертка предназначена для того, чтобы избежать свертки ядра свертки в случае полных каналов, что является пустой тратой времени. Используя этот 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).