[473]tf.nn.*()函数and tf.add()函数

tf.nn.relu()函数

tf.nn.relu()函数是将大于0的数保持不变,小于0的数置为0

import tensorflow as tf
 
a = tf.constant([-2,-1,0,2,3])
with tf.Session() as sess:
 	print(sess.run(tf.nn.relu(a)))

结果是

[0 0 0 2 3]

又如

import tensorflow as tf
 
a = tf.constant([[-2,-4],[4,-2]])
with tf.Session() as sess:
 	print(sess.run(tf.nn.relu(a)))

输出结果为

[[0 0]
 [4 0]]

tf.nn.bias_add():

通俗解释:

一个叫bias的向量加到一个叫value的矩阵上,是向量与矩阵的每一行进行相加,得到的结果和value矩阵大小相同。

import tensorflow as tf
 
a=tf.constant([[1,1],[2,2],[3,3]],dtype=tf.float32)
b=tf.constant([1,-1],dtype=tf.float32)
c=tf.constant([1],dtype=tf.float32)
 
with tf.Session() as sess:
    print('bias_add:')
    print(sess.run(tf.nn.bias_add(a, b)))
    #执行下面语句错误
    #print(sess.run(tf.nn.bias_add(a, c)))

输出结果:

bias_add:
[[ 2. 0.]
[ 3. 1.]
[ 4. 2.]]

tf.add( x,y, name=None):

通俗解释:

这个情况比较多,最常见的是,一个叫x的矩阵和一个叫y的数相加,就是y分别与x的每个数相加,得到的结果和x大小相同。

import tensorflow as tf    
  
x=tf.constant([[1,2],[1,2]])    
y=tf.constant([[1,1],[1,2]])  
z=tf.add(x,y)  
  
x1=tf.constant(1)  
y1=tf.constant(2)  
z1=tf.add(x1,y1)  
  
x2=tf.constant(2)  
y2=tf.constant([1,2])  
z2=tf.add(x2,y2)  
  
x3=tf.constant([[1,2],[3,4]])    
y3=tf.constant([[1,1]])  
z3=tf.add(x3,y3)  
  
with tf.Session() as sess:  
    z_result,z1_result,z2_result,z3_result=sess.run([z,z1,z2,z3])  
    print('z =\n%s'%(z_result))  
    print('z1 =%s'%(z1_result))  
    print('z2 =%s'%(z2_result))  
    print('z3 =%s'%(z3_result))  

得到的结果是:

z =[[2 3]
    [2 4]]
z1 =3
 
z2 =[3 4]
 
z3 =[[2 3]
     [4 5]]

tf.add_n(inputs,name=None)

通俗解释:

函数是实现一个列表的元素的相加。就是输入的对象是一个列表,列表里的元素可以是向量,矩阵等但没有广播功能

import tensorflow as tf;    
import numpy as np;    
    
input1 = tf.constant([1.0, 2.0, 3.0])    
input2 = tf.Variable(tf.random_uniform([3]))    
output = tf.add_n([input1, input2]) #注意输入是一个列表   
    
with tf.Session() as sess:    
    sess.run(tf.initialize_all_variables())    
    print (sess.run(input1 + input2))    
    print (sess.run(output))  

输出结果:

[1.4135424 2.694611  3.2243743]
[1.4135424 2.694611  3.2243743]

tf.nn.conv2d()

tf.nn.conv2d是TensorFlow里面实现卷积的函数,参考文档对它的介绍并不是很详细,实际上这是搭建卷积神经网络比较核心的一个方法,非常重要

tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)

除去name参数用以指定该操作的name,与方法有关的一共五个参数:

第一个参数input:指需要做卷积的输入图像,它要求是一个Tensor,具有[batch, in_height, in_width, in_channels]这样的shape,具体含义是**[训练时一个batch的图片数量, 图片高度, 图片宽度, 图像通道数]**,注意这是一个4维的Tensor,要求类型为float32和float64其中之一,in_channel 为图片的通道数,灰度图该值为1,彩色图为3。(也可以用其它值,但是具体含义不是很理解)

第二个参数filter:相当于CNN中的卷积核,它要求是一个Tensor,具有[filter_height, filter_width, in_channels, out_channels]这样的shape,具体含义是**[卷积核的高度,卷积核的宽度,图像通道数,卷积核个数]**,要求类型与参数input相同,有一个地方需要注意,第三维in_channels,就是参数input的第四维

第三个参数strides:卷积时在图像每一维的步长,这是一个一维的向量,长度4,[ 1, strides, strides, 1],第一位和最后一位固定必须是1

第四个参数padding:string类型的量,只能是"SAME","VALID"其中之一,这个值决定了不同的卷积方式,是否考虑边界。"SAME"是考虑边界,不足的时候用0去填充周围,"VALID"则不考虑

第五个参数use_cudnn_on_gpu:bool类型,是否使用cudnn加速,默认为true

结果返回一个Tensor,这个输出,就是我们常说的feature map,shape仍然是[batch, height, width, channels]这种形式。

  • 具体实现
import tensorflow as tf
# case 1
# 输入是1张 3*3 大小的图片,图像通道数是5,卷积核是 1*1 大小,数量是1
# 步长是[1,1,1,1]最后得到一个 3*3 的feature map
# 1张图最后输出就是一个 shape为[1,3,3,1] 的张量
input = tf.Variable(tf.random_normal([1,3,3,5]))
filter = tf.Variable(tf.random_normal([1,1,5,1]))
op1 = tf.nn.conv2d(input, filter, strides=[1,1,1,1], padding='SAME')

# case 2
# 输入是1张 3*3 大小的图片,图像通道数是5,卷积核是 2*2 大小,数量是1
# 步长是[1,1,1,1]最后得到一个 3*3 的feature map
# 1张图最后输出就是一个 shape为[1,3,3,1] 的张量 
input = tf.Variable(tf.random_normal([1,3,3,5]))
filter = tf.Variable(tf.random_normal([2,2,5,1]))
op2 = tf.nn.conv2d(input, filter, strides=[1,1,1,1], padding='SAME')

# case 3  
# 输入是1张 3*3 大小的图片,图像通道数是5,卷积核是 3*3 大小,数量是1
# 步长是[1,1,1,1]最后得到一个 1*1 的feature map (不考虑边界)
# 1张图最后输出就是一个 shape为[1,1,1,1] 的张量
input = tf.Variable(tf.random_normal([1,3,3,5]))  
filter = tf.Variable(tf.random_normal([3,3,5,1]))  
op3 = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='VALID') 
 
# case 4
# 输入是1张 5*5 大小的图片,图像通道数是5,卷积核是 3*3 大小,数量是1
# 步长是[1,1,1,1]最后得到一个 3*3 的feature map (不考虑边界)
# 1张图最后输出就是一个 shape为[1,3,3,1] 的张量
input = tf.Variable(tf.random_normal([1,5,5,5]))  
filter = tf.Variable(tf.random_normal([3,3,5,1]))  
op4 = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='VALID')  

# case 5  
# 输入是1张 5*5 大小的图片,图像通道数是5,卷积核是 3*3 大小,数量是1
# 步长是[1,1,1,1]最后得到一个 5*5 的feature map (考虑边界)
# 1张图最后输出就是一个 shape为[1,5,5,1] 的张量
input = tf.Variable(tf.random_normal([1,5,5,5]))  
filter = tf.Variable(tf.random_normal([3,3,5,1]))  
op5 = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='SAME')  

# case 6 
# 输入是1张 5*5 大小的图片,图像通道数是5,卷积核是 3*3 大小,数量是7
# 步长是[1,1,1,1]最后得到一个 5*5 的feature map (考虑边界)
# 1张图最后输出就是一个 shape为[1,5,5,7] 的张量
input = tf.Variable(tf.random_normal([1,5,5,5]))  
filter = tf.Variable(tf.random_normal([3,3,5,7]))  
op6 = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='SAME')  

# case 7  
# 输入是1张 5*5 大小的图片,图像通道数是5,卷积核是 3*3 大小,数量是7
# 步长是[1,2,2,1]最后得到7个 3*3 的feature map (考虑边界)
# 1张图最后输出就是一个 shape为[1,3,3,7] 的张量
input = tf.Variable(tf.random_normal([1,5,5,5]))  
filter = tf.Variable(tf.random_normal([3,3,5,7]))  
op7 = tf.nn.conv2d(input, filter, strides=[1, 2, 2, 1], padding='SAME')  

# case 8  
# 输入是10 张 5*5 大小的图片,图像通道数是5,卷积核是 3*3 大小,数量是7
# 步长是[1,2,2,1]最后每张图得到7个 3*3 的feature map (考虑边界)
# 10张图最后输出就是一个 shape为[10,3,3,7] 的张量
input = tf.Variable(tf.random_normal([10,5,5,5]))  
filter = tf.Variable(tf.random_normal([3,3,5,7]))  
op8 = tf.nn.conv2d(input, filter, strides=[1, 2, 2, 1], padding='SAME')  
  
init = tf.initialize_all_variables() 
with tf.Session() as sess:
    sess.run(init)
    print('*' * 20 + ' op1 ' + '*' * 20)
    print(sess.run(op1))
    print('*' * 20 + ' op2 ' + '*' * 20)
    print(sess.run(op2))
    print('*' * 20 + ' op3 ' + '*' * 20)
    print(sess.run(op3))
    print('*' * 20 + ' op4 ' + '*' * 20)
    print(sess.run(op4))
    print('*' * 20 + ' op5 ' + '*' * 20)
    print(sess.run(op5))
    print('*' * 20 + ' op6 ' + '*' * 20)
    print(sess.run(op6))
    print('*' * 20 + ' op7 ' + '*' * 20)
    print(sess.run(op7))
    print('*' * 20 + ' op8 ' + '*' * 20)
    print(sess.run(op8))
  • 运行结果
******************** op1 ********************
[[[[ 0.78366613]
   [-0.11703026]
   [ 3.533338  ]]

  [[ 3.4455981 ]
   [-2.40102   ]
   [-1.3336506 ]]

  [[ 1.9816184 ]
   [-3.3166158 ]
   [ 2.0968733 ]]]]
******************** op2 ********************
[[[[-4.429776  ]
   [ 4.1218996 ]
   [-4.1383405 ]]

  [[ 0.4804101 ]
   [ 1.3983132 ]
   [ 1.2663789 ]]

  [[-1.8450742 ]
   [-0.02915052]
   [-0.5696235 ]]]]
******************** op3 ********************
[[[[-6.969367]]]]
******************** op4 ********************
[[[[ -2.9217496 ]
   [  4.4683943 ]
   [  7.5761824 ]]

  [[-14.627491  ]
   [ -5.014709  ]
   [ -3.4593797 ]]

  [[  0.45091882]
   [  4.8827124 ]
   [ -9.658895  ]]]]
******************** op5 ********************
[[[[-2.8486536 ]
   [ 1.3990458 ]
   [ 2.953944  ]
   [-6.007198  ]
   [ 5.089696  ]]

  [[-0.20283715]
   [ 2.4726171 ]
   [ 6.2137847 ]
   [-0.38609552]
   [-1.8869443 ]]

  [[ 7.7240233 ]
   [10.6962805 ]
   [-3.1667676 ]
   [-3.6487846 ]
   [-2.2908094 ]]

  [[-9.00223   ]
   [ 4.5111785 ]
   [ 2.5615098 ]
   [-5.8492236 ]
   [ 1.7734764 ]]

  [[ 2.3674765 ]
   [-5.9122458 ]
   [ 5.867611  ]
   [-0.50353   ]
   [-4.890904  ]]]]
******************** op6 ********************
[[[[-4.06957626e+00  5.69651246e-01  2.97890633e-01 -5.08075190e+00
     2.76357365e+00 -7.34121323e+00 -2.09436584e+00]
   [-9.03515625e+00 -8.96854973e+00 -4.40316677e+00 -3.23745847e+00
    -3.56242275e+00  3.67262197e+00  2.59603453e+00]
   [ 1.25131302e+01  1.30267200e+01  2.25630283e+00  3.31285048e+00
    -1.00396938e+01 -9.06786323e-01 -7.20120049e+00]
   [-3.18641067e-01 -7.66135693e+00  5.02029419e+00 -1.65469778e+00
    -5.53000355e+00 -4.76842117e+00  4.98133230e+00]
   [ 3.68885136e+00  2.54145473e-01 -4.17096436e-01  1.20136106e+00
    -2.29291725e+00  6.98313904e+00  4.92819786e-01]]

  [[ 1.22962761e+01  3.85902214e+00 -2.91524696e+00 -6.89016438e+00
     3.35520816e+00 -1.85112596e+00  5.59113741e+00]
   [ 2.99087334e+00  4.42690086e+00 -3.34755349e+00 -7.41521478e-01
     3.65099478e+00 -2.84761238e+00 -2.74149513e+00]
   [-9.65088654e+00 -4.91817188e+00  3.82093906e+00 -5.72443676e+00
     1.43630829e+01  5.11133957e+00 -1.18163595e+01]
   [ 1.69606721e+00 -1.00837049e+01  9.65112305e+00  3.48559356e+00
     4.71356201e+00 -2.74463081e+00 -5.76961470e+00]
   [-5.11555862e+00  1.06215849e+01  1.97274566e+00 -1.66155469e+00
     5.40411043e+00  1.64753020e+00 -2.25898552e+00]]

  [[ 3.20135975e+00  1.16082029e+01  6.35383892e+00 -1.22541785e+00
    -7.81781197e-01 -7.39507914e+00  3.02070093e+00]
   [ 3.37887239e+00 -3.17085648e+00  8.15050030e+00  9.17820644e+00
    -5.42563820e+00 -1.06148596e+01  1.44039564e+01]
   [ 6.06520414e+00 -6.89214110e-01  1.18828654e+00  6.44250536e+00
    -3.90648508e+00 -7.45609093e+00  1.70780718e-02]
   [-5.51369572e+00 -5.99862814e-01 -5.97459745e+00  5.03705800e-01
    -4.89957094e-01  4.65023327e+00  6.97832489e+00]
   [ 5.56566572e+00  3.15251064e+00  4.23309374e+00  4.58887959e+00
     1.11150384e+00  1.56815052e-01 -2.64446616e+00]]

  [[-3.47755957e+00 -2.51347685e+00  5.07092476e+00 -1.79448032e+01
     1.23025656e+00 -7.04272604e+00 -3.11969209e+00]
   [-3.64519453e+00 -2.48672795e+00  1.45192409e+00 -7.42938709e+00
     7.32508659e-01  1.73417020e+00 -8.84127915e-01]
   [ 4.80518007e+00 -1.00521259e+01 -1.47410703e+00 -2.73861027e+00
    -6.11766815e+00  5.89801645e+00  7.41809845e+00]
   [ 1.52897854e+01  3.40052223e+00 -1.17849231e-01  8.11421871e+00
    -7.15329647e-02 -8.57025623e+00 -6.36894524e-01]
   [-1.29184561e+01 -2.07097292e+00  6.51137114e+00  4.45195580e+00
     6.51636696e+00  1.94592953e-01  7.76367307e-01]]

  [[-7.64904690e+00 -4.64357853e+00 -5.09730625e+00  1.46977997e+00
    -2.66898251e+00  6.18280554e+00  7.30443239e+00]
   [ 3.74768376e-02  8.19200230e+00 -2.99126768e+00 -1.25706446e+00
     2.82602859e+00  4.79209185e-01 -7.99170971e+00]
   [-9.31276321e+00  2.71563363e+00  2.68426132e+00 -2.98767281e+00
     2.85978794e-01  5.26730251e+00 -6.51313114e+00]
   [-5.16205406e+00 -3.73660684e+00 -1.25655127e+00 -4.03212357e+00
    -2.34876966e+00  3.49581933e+00  3.21578264e-01]
   [ 4.80592680e+00 -2.01916337e+00 -2.70319057e+00  9.14705086e+00
     3.14293051e+00 -5.12257957e+00  1.87513745e+00]]]]
******************** op7 ********************
[[[[ -5.3398733    4.176247    -1.0400615    1.7490227   -2.3762708
     -4.43866     -2.9152555 ]
   [ -6.2849035    2.9156108    2.2420614    3.0133455    2.697643
     -1.2664369    2.2018924 ]
   [ -1.7367094   -2.6707978   -4.823809    -2.9799473   -2.588249
     -0.8573512    0.7243177 ]]

  [[  9.770168    -6.0919194   -7.755929     0.7116828    4.696847
     -1.5403405  -10.603018  ]
   [ -2.2849545    7.23973      0.06859291  -0.3011052   -7.885673
     -4.7223825   -1.2202084 ]
   [ -1.7584102   -0.9349402    1.8078477    6.8720684   11.548839
     -1.3058915    1.785974  ]]

  [[  3.8749192   -5.9033284    1.3921509   -2.68101      5.386052
      5.2535496    7.804141  ]
   [  1.9598813   -6.1589165    0.9447456    0.06089067  -3.7891803
     -2.0653834   -2.60965   ]
   [ -2.1243367   -0.9703847    1.5366316    5.8760977   -3.697129
      6.050654    -0.01914603]]]]
******************** op8 ********************
[[[[  7.6126375   -2.261326     0.32292777   8.602917    -2.9009488
      3.3160565    2.1506643 ]
   [ -3.5364501   -2.1440878    1.354662     5.531647    -1.4339367
      5.1957445   -0.9030779 ]
   [  7.844642    -6.1276717    7.7938704   -2.23364     -3.4782376
     -5.097751     5.285432  ]]

  [[ -1.6915132    2.2787857   -5.9708385    8.21313     -4.5076394
     -0.3270775   -8.479343  ]
   [  2.0611243    3.1743298   -0.53598183  -3.0830724  -13.820877
      5.3642063   -4.0782714 ]
   [ -2.2280676   -6.232974     6.031793     6.4705186    1.1858556
     -5.012024    -0.12968755]]

  [[ -2.7237153   -2.0637414    1.4018252   -2.937191     2.572178
      3.9408593    2.605546  ]
   [ -1.607345     5.66703     -4.989913    -6.0507936   -1.9384562
      0.61666656  -6.9282484 ]
   [ -0.03978544  -2.008681    -7.406146    -1.2036608   -3.8769712
     -3.0997906    6.066886  ]]]


 [[[ -0.6766513   -0.16299164   3.2324884   -3.3543284    2.711526
     -0.7604065   -2.9422672 ]
   [-11.477009     6.985447    -7.168281     1.6444209    2.1505005
     -2.5210168    1.248457  ]
   [ -2.5344536    0.78997815   4.921354     0.32946062  -3.4039345
      2.3872323    1.0319829 ]]

  [[  5.672534    -4.6865053    5.780566    11.394991     1.0943577
      1.6653306   -0.93034   ]
   [ 11.131994     6.8491035  -15.839502     7.006518     3.261397
     -0.99962735  10.55006   ]
   [  2.6103654    2.7730281    2.3594556    3.5570846    6.1872926
      4.217743    -6.4607897 ]]

  [[ -2.7581267   -0.12229636   1.351732    -4.4823456    2.1730578
     -2.828763    -3.0473292 ]
   [ -2.742803    -5.817521    -4.570032    -7.3254657    3.2537496
     -0.6938226    0.6609373 ]
   [ -3.1279428   -4.922457     2.745709    -4.864913    -3.6143937
      2.6719465   -1.1376699 ]]]


 [[[ -0.7445632    0.45240074   5.131389    -2.8525875    1.3901956
     -0.4648465    5.4685025 ]
   [  3.1593595    1.2171756    0.1267331   -3.2178001   -2.6123729
     -5.186987     4.1898375 ]
   [  9.478796    -1.8722348    4.896418     1.301182    -3.6362329
     -1.9956454   -1.770525  ]]

  [[  4.8301635   -3.8837552    7.0490103    1.2435023    3.4047306
     -3.2604568    1.051601  ]
   [ -2.2003438    0.88552344  -6.8119774    7.017317    -2.9890797
      5.8106375   -0.863615  ]
   [ -0.17809808 -10.802618     3.225249    -2.0419974    5.072168
      1.2349106   -4.600774  ]]

  [[ -3.1843624   -2.5729177    1.191327    -3.0042355    0.97465754
     -4.564925     3.9409044 ]
   [  1.2322719   14.114404    -0.35690814   2.2237332    0.35432827
     -1.9053037  -12.545719  ]
   [  0.80399454  -5.358243    -6.344287     3.5417094   -3.9716966
     -0.02347088   3.0606985 ]]]


 [[[  0.37148464  -3.8297706   -2.0831337    6.29245      2.5057077
      0.8506646    1.9863653 ]
   [  3.765554     1.4267049    1.0800252    7.7149706    0.44219214
      8.109619     3.6685073 ]
   [  4.635173    -2.9154918   -6.4538617   -5.448964     6.57819
      0.61271524   2.9938192 ]]

  [[ -3.616211     0.0879938   -6.3440037    1.6937144    0.04956067
      2.4064069   -8.493458  ]
   [ -5.0647597    0.93558145  -1.9845109   -8.771115     4.6100225
      1.1144816  -12.28625   ]
   [  1.0221918   -7.5176277   -1.8426392   -4.289383     2.2868915
     -8.87014     -0.3772235 ]]

  [[ -1.1132717    2.4524128   -0.365159     4.004697    -1.5730555
      0.5331385   -6.8898973 ]
   [  3.5391765    2.8012395    0.7159001    7.421248    -3.0292435
      3.0187619   -3.9419355 ]
   [ -5.387392    -6.63677      2.4566684    1.821631    -0.16935372
     -0.88219285   2.2688925 ]]]


 [[[ -3.9313369   -1.8516166   -3.2839324   -6.9028835    8.055535
     -1.080044    -1.732337  ]
   [ -3.1068752    2.6514802    3.7293913   -1.7883471   -5.44104
     -4.5572286   -4.829409  ]
   [  2.6451612   -3.1832254    3.171578    -4.6448216   -4.001822
     -6.899353    -0.6295476 ]]

  [[ -0.65707624  -1.9670736    6.3386445    2.3041923   -4.439172
     -2.9729037   -0.94020796]
   [  0.43153757   5.194006     0.45434368   3.0731819    4.0513067
     -5.8058457    6.947601  ]
   [ -4.2653627    0.9031774   -1.6685407   -5.4121113    0.5529208
      0.7007126    9.279081  ]]

  [[ -0.37299162   2.7452188    1.9330034    3.6408103   -5.0701776
      1.1965587    0.59263295]
   [  4.81972     -1.1006856    7.8824034    5.260598     3.434634
      0.04601002   8.869657  ]
   [  4.231048     1.5457909   -4.7653384   -3.4977267    3.7780495
     -5.872396    12.113913  ]]]


 [[[ -3.8766992   -0.398234    -1.9723368    1.2132525    0.56892383
      1.2515173    3.7913866 ]
   [ -0.4337333    1.8678297    5.1747704   -0.6080067   -1.3174248
     -1.7126535    0.4686459 ]
   [ -5.754308    -2.4168007   -3.6410232   -4.5670137    1.6215359
     -4.580209    -5.5926514 ]]

  [[ 11.04498      4.4554973    3.8934658   -1.4875691  -11.931008
      4.515834    -6.144173  ]
   [  3.8855233   -7.6059284    5.552779    -0.4441495    4.6369743
      2.3952575    4.981801  ]
   [ -4.5357304    8.016967    -3.8956852    8.697634     0.7237491
     -1.2161034    9.980692  ]]

  [[ -3.8816683   -6.1477547    6.313223     3.8985054   -2.1990623
      2.0681944   -0.53726804]
   [  0.9768859    0.2593964    5.1300526   -4.3372006    4.838679
      1.2677834    1.0290532 ]
   [ -2.7676988    6.0724287    4.556395    -2.004102    -0.79856735
      2.4891334   -1.8703268 ]]]


 [[[ -2.4113853   -4.7984595   -0.28992027   1.1324785    5.6149826
      3.4891384   -0.2521189 ]
   [ 11.86079     -2.660718     1.3913785   -9.618228     0.04568058
     -2.8031406    1.12844   ]
   [ -0.08115374   2.8916602   -5.7155695   -5.4544435    2.526495
      6.5253263    1.3852744 ]]

  [[ -1.5733382   -0.08704215   2.6952646    7.385515    -0.7799995
      3.1702318  -14.530704  ]
   [  0.05908662 -13.9438095   -1.154305     3.4328744    7.0506897
     -5.0249805    2.5534477 ]
   [  0.61222774   0.14303133   4.685219    -7.0924406    1.7709903
      1.0107443   -4.5374393 ]]

  [[ -5.6678987    0.6903403    2.23693      1.2741803   -6.179094
      3.0454116   -5.2941957 ]
   [  0.23656422  -2.2511265    3.3220747    2.021302    -3.070989
     -3.815312     3.7513428 ]
   [  5.048253     5.163742    -3.064779     5.2195883    6.6997313
     -2.0612605    2.076776  ]]]


 [[[ -1.1741709    0.50855964   3.7991686    6.946745    -0.99349356
      1.4751754   -1.08081   ]
   [  2.1064334    0.3293423    1.8446237   -0.3842956    3.8418627
     -2.5760477   -4.709687  ]
   [ -3.8787804    5.9237094   -3.8139226    3.2697144   -2.5398688
      4.3881574   11.573359  ]]

  [[ -3.1857545    7.100687    -3.9305675    0.6854049   -1.2562029
      1.2753329    8.361776  ]
   [  2.7635245   -1.649135    -1.3044827    5.9628034    7.0507197
      8.040147    -0.5544966 ]
   [  6.0894575    1.864697     2.0811782   -8.773295     3.7755995
      5.5564737   -3.4745088 ]]

  [[  1.3517151    2.8740213   -6.181453     0.21349654  -5.9370227
     -1.6817973    3.0836923 ]
   [ -0.7866033    2.7180645    3.2119308    4.905232    -3.8589058
     -3.349786    -1.2415386 ]
   [  7.3208423    7.184522     1.8396591    0.25130635   4.5287986
     -1.9662986   -5.4157324 ]]]


 [[[ -1.796482    -0.19289398   0.08456608   9.18009      4.3642817
      3.9750414   10.058201  ]
   [ -3.404979    10.002911     2.6454616    0.09656489  -5.6097493
      2.0856397    8.30741   ]
   [ -6.1940312    0.20053774   7.5518293    1.6553136   -6.075909
      1.9946573   -8.276907  ]]

  [[  1.5515908   -4.065265     6.201588   -10.958014     2.8450232
      1.7398013    6.308612  ]
   [  1.3526641   -0.20383507  -0.97939104 -12.001176     6.5776787
      7.0159016   -2.6269057 ]
   [ -3.5487242   -2.0833373    2.128775     8.243093    -1.1012591
      3.3278828    0.64393663]]

  [[  2.3041837   -1.2524377    3.4256964    3.190121     0.32376206
      1.0883296   -3.531728  ]
   [ -2.393531     0.57050663  -3.172806     7.0572777   -0.7350081
     -2.5658474   -6.9233646 ]
   [ -1.0682559   -0.22647202  10.799706    -5.5458803   -3.2260892
     -0.6237745    6.320084  ]]]


 [[[  8.890318     1.926058    -5.8980203    3.4635465    2.0711088
     -1.0413806   -6.304987  ]
   [ -7.1290493   -8.781645   -10.162883     3.1751637    2.1062303
     -0.04042304 -14.788281  ]
   [ -1.382834    -7.988844     2.7986026   -1.9692816    0.30068183
     -1.4710974   -5.3116736 ]]

  [[ -7.576119    -3.2894049    0.7375753   -1.3818941    2.9862103
     -6.683834    -7.8058653 ]
   [  4.9312177   -0.04471028  -0.34124258   8.375692    -8.983649
     -2.1781216  -12.752575  ]
   [  9.337945    -5.1725883   10.788802     0.9727853   -2.5389743
      1.0551623    1.4216776 ]]

  [[  1.5142308    4.546703    -2.5327616    4.6643023   -2.0437615
     -1.7893765    4.8349857 ]
   [  3.843536     8.979685    -5.5770497   12.787272     3.2864804
     -9.081071     5.1559086 ]
   [ -3.7020745    9.714738    -5.7880783   -2.3634226    4.0264153
      5.8175054   -7.454776  ]]]]

tf.nn.max_pool()

tf.nn.max_pool(value, ksize, strides, padding, name=None)

参数是四个,和卷积很类似:

第一个参数value:需要池化的输入,一般池化层接在卷积层后面,所以输入通常是feature map,依然是[batch, height, width, channels]这样的shape

第二个参数ksize:池化窗口的大小,取一个四维向量,一般是[1, height, width, 1],因为我们不想在batch和channels上做池化,所以这两个维度设为了1

第三个参数strides:和卷积类似,窗口在每一个维度上滑动的步长,一般也是[1, stride,stride, 1]

第四个参数padding:和卷积类似,可以取’VALID’ 或者’SAME’,是否考虑边界。"SAME"是考虑边界,不足的时候用0去填充周围,"VALID"则不考虑

返回一个Tensor,类型不变,shape仍然是[batch, height, width, channels]这种形式

示例源码:

假设有这样一张图,双通道

第一个通道:
image.png
第二个通道:
image.png

用程序去做最大值池化:

import tensorflow as tf
 
a=tf.constant([
        [[1.0,2.0,3.0,4.0],
        [5.0,6.0,7.0,8.0],
        [8.0,7.0,6.0,5.0],
        [4.0,3.0,2.0,1.0]],
        [[4.0,3.0,2.0,1.0],
         [8.0,7.0,6.0,5.0],
         [1.0,2.0,3.0,4.0],
         [5.0,6.0,7.0,8.0]]
    ])
 
a=tf.reshape(a,[1,4,4,2])
 
pooling=tf.nn.max_pool(a,[1,2,2,1],[1,1,1,1],padding='VALID')
with tf.Session() as sess:
    print("image:")
    image=sess.run(a)
    print (image)
    print("reslut:")
    result=sess.run(pooling)
    print (result)

这里步长为1,窗口大小2×2,输出结果:

image:
[[[[ 1.  2.]
   [ 3.  4.]
   [ 5.  6.]
   [ 7.  8.]]
 
  [[ 8.  7.]
   [ 6.  5.]
   [ 4.  3.]
   [ 2.  1.]]
 
  [[ 4.  3.]
   [ 2.  1.]
   [ 8.  7.]
   [ 6.  5.]]
 
  [[ 1.  2.]
   [ 3.  4.]
   [ 5.  6.]
   [ 7.  8.]]]]
reslut:
[[[[ 8.  7.]
   [ 6.  6.]
   [ 7.  8.]]
 
  [[ 8.  7.]
   [ 8.  7.]
   [ 8.  7.]]
 
  [[ 4.  4.]
   [ 8.  7.]
   [ 8.  8.]]]]

池化后的图就是:
image.png
image.png
证明了程序的结果是正确的。

我们还可以改变步长

pooling=tf.nn.max_pool(a,[1,2,2,1],[1,2,2,1],padding='VALID')

最后的result就变成:

reslut:
[[[[ 8.  7.]
   [ 7.  8.]]
 
  [[ 4.  4.]
   [ 8.  8.]]]]

tf.nn.dropout()

tf.nn.dropout(x, keep_prob, noise_shape=None, seed=None, name=None)

此函数是为了防止在训练中过拟合的操作,将训练输出按一定规则进行变换

Dropout原理简述

tf.nn.dropout是TensorFlow里面为了防止或减轻过拟合而使用的函数,它一般用在全连接层。

Dropout就是在不同的训练过程中随机扔掉一部分神经元。也就是让某个神经元的激活值以一定的概率p,让其停止工作,这次训练过程中不更新权值,也不参加神经网络的计算。但是它的权重得保留下来(只是暂时不更新而已),因为下次样本输入时它可能又得工作了。示意图如下:

image.png

但在测试及验证中:每个神经元都要参加运算,但其输出要乘以概率p。

参数:

  • x:输入
  • keep_prob:设置神经元被选中的概率,在初始化时keep_prob是一个占位符, keep_prob = tf.placeholder(tf.float32) 。tensorflow在run时设置keep_prob具体的值,例如keep_prob: 0.5
  • noise_shape:干扰形状。 此字段默认是None,表示第一个元素的操作都是独立,但是也不一定。比例:数据的形状是shape(x)=[k, l, m, n],而noise_shape=[k, 1, 1, n],则第1和4列是独立保留或删除,第2和3列是要么全部保留,要么全部删除。
  • seed:整形变量,随机数种子。
  • name:指定该操作的名字

返回:Tnesor

dropout必须设置概率keep_prob,并且keep_prob也是一个占位符,跟输入是一样的

keep_prob = tf.placeholder(tf.float32)

train的时候才是dropout起作用的时候,test的时候不应该让dropout起作用

tensorflow中四种不同交叉熵函数

tensorflow中自带四种交叉熵函数,可以轻松的实现交叉熵的计算。

tf.nn.softmax_cross_entropy_with_logits()
tf.nn.sparse_softmax_cross_entropy_with_logits()
tf.nn.sigmoid_cross_entropy_with_logits()
tf.nn.weighted_cross_entropy_with_logits()

注意:tensorflow交叉熵计算函数输入中的logits都不是softmax或sigmoid的输出,而是softmax或sigmoid函数的输入,因为它在函数内部进行sigmoid或softmax操作。而且不能在交叉熵函数前进行softmax或sigmoid,会导致计算会出错。

tf.nn.sigmoid_cross_entropy_with_logits()

tf.nn.sigmoid_cross_entropy_with_logits(_sentinel=None,labels=None, logits=None, name=None)

argument:

  • _sentinel:本质上是不用的参数,不用填
  • logits:计算的输出,注意是为使用softmax或sigmoid的,维度一般是[batch_size, num_classes] ,单样本是[num_classes]。数据类型(type)是float32或float64;
  • labels:和logits具有相同的type(float)和shape的张量(tensor),即数据类型和张量维度都一致。
  • name:操作的名字,可填可不填

output:
loss,shape:[batch_size,num_classes]

注意:它对于输入的logits先通过sigmoid函数计算,再计算它们的交叉熵,但是它对交叉熵的计算方式进行了优化,使得结果不至于溢出。output不是一个数,而是一个batch中每个样本的loss,所以一般配合tf.reduce_mea(loss)使用。

例子:

import tensorflow as tf
import numpy as np

def sigmoid(x):
    return 1.0 / (1 + np.exp(-x))

# 5个样本三分类问题,且一个样本可以同时拥有多类
y = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1], [1, 1, 0], [0, 1, 0]])

logits = np.array([[12, 3, 2], [3, 10, 1], [1, 2, 5], [4, 6.5, 1.2], [3, 6, 1]])
y_pred = sigmoid(logits)
E1 = -y * np.log(y_pred) - (1 - y) * np.log(1 - y_pred)
print('按计算公式计算的结果:\n',E1)  # 按计算公式计算的结果
sess = tf.Session()
y = np.array(y).astype(np.float64)  # labels是float64的数据类型
E2 = sess.run(tf.nn.sigmoid_cross_entropy_with_logits(labels=y, logits=logits))
print('tf计算的结果:\n',E2)
# 输出的E1,E2结果相同

image.png

tf.nn.softmax_cross_entropy_with_logits()

tf.nn.softmax_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, dim=-1, name=None)

argument:

  • _sentinel:本质上是不用的参数,不用填
  • logits:计算的输出,注意是为使用softmax或sigmoid的,维度一般是[batch_size, num_classes] ,单样本是[num_classes]。数据类型(type)是float32或float64;
  • labels:和logits具有相同的type(float)和shape的张量(tensor),即数据类型和张量维度都一致。
  • name:操作的名字,可填可不填

output:
loss,shape:[batch_size]

其他同上

例子:

import tensorflow as tf
import numpy as np

def softmax(x):
    sum_raw = np.sum(np.exp(x), axis=-1)
    x1 = np.ones(np.shape(x))
    for i in range(np.shape(x)[0]):
        x1[i] = np.exp(x[i]) / sum_raw[i]
    return x1


y = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1], [1, 0, 0], [0, 1, 0]])  # 每一行只有一个1
logits = np.array([[12, 3, 2], [3, 10, 1], [1, 2, 5], [4, 6.5, 1.2], [3, 6, 1]])
y_pred = softmax(logits)
E1 = -np.sum(y * np.log(y_pred), -1)

sess = tf.Session()
y = np.array(y).astype(np.float64)
E2 = sess.run(tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=logits))

print('按计算公式计算的结果:\n', E1)  # 按计算公式计算的结果
print('tf计算的结果:\n', E2)
# 输出的E1,E2结果相同

image.png

tf.nn.sparse_softmax_cross_entropy_with_logits()

tf.nn.sparse_softmax_cross_entropy_with_logits(_sentinel=None,labels=None,logits=None, name=None)

argument:

  • _sentinel:本质上是不用的参数,不用填

  • logits:一个数据类型(type)是float32或float64;

  • shape:[batch_size,num_classes]

  • labels: shape为[batch_size],labels[i]是{0,1,2,……,num_classes-1}的一个索引, type为int32或int64,说白了就是当使用这个函数时,tf自动将原来的类别索引转换成one_hot形式,然后与label表示的one_hot向量比较,计算交叉熵。

  • name: 操作的名字,可填可不填

output:
loss,shape:[batch_size]

例子:

import tensorflow as tf

# 假设只有三个类,分别编号0,1,2,labels就可以直接输入下面的向量,不用转换与logits一致的维度
labels = [0,1,2]

logits = [[2,0.5,1],
          [0.1,1,3],
          [3.1,4,2]]

logits_scaled = tf.nn.softmax(logits)
result = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels, logits=logits)

with tf.Session() as sess:
    print(sess.run(result))

image.png

tf.nn.weighted_cross_entropy_with_logits()

tf.nn.weighted_cross_entropy_with_logits(labels,logits, pos_weight, name=None)

计算具有权重的sigmoid交叉熵sigmoid_cross_entropy_with_logits()

argument:

  • _sentinel:本质上是不用的参数,不用填
  • logits:一个数据类型(type)是float32或float64;
  • shape:[batch_size,num_classes],单样本是[num_classes]
  • labels:和logits具有相同的type(float)和shape的张量(tensor),
  • pos_weight:正样本的一个系数
  • name:操作的名字,可填可不填

output:
loss,shape:[batch_size,num_classes]

tf.nn.softmax_cross_entropy_with_logits_v2()

tf.nn.softmax_cross_entropy_with_logits_v2(_sentinel, labels, logits, dim, name)

计算 softmax(logits) 和 labels 之间的交叉熵

参数:

  • _sentinel:内部,一般不使用。

  • labels: 真实数据的类别标签

  • logits:神经网络最后一层的类别预测输出值

-  dim :类维度。默认为-1,这是最后一个维度。

一般用于交叉熵损失函数的设定:cross_entropy_loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits = y, labels = y_))

import tensorflow as tf  
 
# calculate cross_entropy 
y = tf.constant([[1.0, 2.0, 3.0, 4.0],[1.0, 2.0, 3.0, 4.0],[1.0, 2.0, 3.0, 4.0]])  
y_=tf.constant([[0.0, 0.0, 0.0, 1.0],[0.0, 0.0, 0.0, 1.0],[0.0, 0.0, 0.0, 1.0]])  
ysoft = tf.nn.softmax(y)  
cross_entropy = -tf.reduce_sum(y_*tf.log(ysoft))  
 
#do cross_entropy just one step  
cross_entropy2=tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits_v2(logits = y, labels = y_))
 
cross_entropy_loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits = y, labels = y_))
 
with tf.Session() as sess:   
    print("step1:softmax result=")  
    print(sess.run(ysoft))  
    print("step2:cross_entropy result=")  
    print(sess.run(cross_entropy))  
    print("Function(softmax_cross_entropy_with_logits) result=")  
    print(sess.run(cross_entropy2))
    print("cross_entropy_loss result=")  
    print(sess.run(cross_entropy_loss))
step1:softmax result=
[[ 0.0320586   0.08714432  0.23688284  0.64391428]
 [ 0.0320586   0.08714432  0.23688284  0.64391428]
 [ 0.0320586   0.08714432  0.23688284  0.64391428]]
step2:cross_entropy result=
1.32057
Function(softmax_cross_entropy_with_logits) result=
1.32057
cross_entropy_loss result=
0.44019

参考:https://blog.csdn.net/mieleizhi0522/article/details/80416668
https://blog.csdn.net/hengxingheng/article/details/80420961
https://blog.csdn.net/zuolixiangfisher/article/details/80528989
https://blog.csdn.net/mao_xiao_feng/article/details/53453926
https://blog.csdn.net/huahuazhu/article/details/73649389
https://blog.csdn.net/qq_35203425/article/details/79773459
https://blog.csdn.net/muzi_water/article/details/81363027

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周小董

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值