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]]
通俗解释:
一个叫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.]]
通俗解释:
这个情况比较多,最常见的是,一个叫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]]
通俗解释:
函数是实现一个列表的元素的相加。就是输入的对象是一个列表,列表里的元素可以是向量,矩阵等但没有广播功能
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是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(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]
这种形式
示例源码:
假设有这样一张图,双通道
第一个通道:
第二个通道:
用程序去做最大值池化:
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.]]]]
池化后的图就是:
证明了程序的结果是正确的。
我们还可以改变步长
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(x, keep_prob, noise_shape=None, seed=None, name=None)
此函数是为了防止在训练中过拟合的操作,将训练输出按一定规则进行变换
Dropout原理简述:
tf.nn.dropout是TensorFlow里面为了防止或减轻过拟合而使用的函数,它一般用在全连接层。
Dropout就是在不同的训练过程中随机扔掉一部分神经元。也就是让某个神经元的激活值以一定的概率p,让其停止工作,这次训练过程中不更新权值,也不参加神经网络的计算。但是它的权重得保留下来(只是暂时不更新而已),因为下次样本输入时它可能又得工作了。示意图如下:
但在测试及验证中:每个神经元都要参加运算,但其输出要乘以概率p。
参数:
返回: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(_sentinel=None,labels=None, logits=None, name=None)
argument:
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结果相同
tf.nn.softmax_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, dim=-1, name=None)
argument:
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结果相同
tf.nn.sparse_softmax_cross_entropy_with_logits(_sentinel=None,labels=None,logits=None, name=None)
argument:
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))
tf.nn.weighted_cross_entropy_with_logits(labels,logits, pos_weight, name=None)
计算具有权重的sigmoid交叉熵sigmoid_cross_entropy_with_logits()
argument:
output: loss,shape:[batch_size,num_classes]
tf.nn.softmax_cross_entropy_with_logits_v2(_sentinel, labels, logits, dim, name)
计算 softmax(logits) 和 labels 之间的交叉熵
参数:
- 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