tensorflow

看完训练一个神经网络的代码后的一个总结:

start:

(1)此处的variable在代码中使用W = tf.get_variable('W'. shape = [n1, n2, ...], initializer=....)来代替。注意:tf.Variable()和tf.get_variable()都可以用来创建变量,但是前者会自动保证唯一性,而后者不能保证唯一性。

(2)若有需要init的,则init = tf.global_variables_initializer();session.run(init):在运行模型中的其他操作之前,必须先进行变量初始化。最简单的方法是添加一个运行所有变量初始值的操作,并在使用模型之前运行该操作。

# Create two variables.
weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),
                      name="weights")
biases = tf.Variable(tf.zeros([200]), name="biases")
...
# Add an op to initialize the variables.
init_op = tf.global_variables_initializer()
 
# Later, when launching the model
with tf.Session() as sess:
  # Run the init operation.
  sess.run(init_op)
  ...
  # Use the model
  ...

(3)在最后需要将需要运行的定义好的函数进行session.run([fun1, fun2,....], feed_dict={X1: values1, X2: values2.....})feed_dict是需要传入的参数。

(4)feed_dict的作用是给使用placeholder创建出来的tensor赋值

(5)placeholder用于创建占位,当需要时再将数据传入进去,第一个参数是数据类型,第二个参数是数据的维数

end

 

零、tensorflow的计算一般可分成两个阶段:

  • 第一阶段,定义所有的计算过程,即计算流图。在这个阶段,所有的变量均无实际参数值,仅仅表示一个计算过程;
  • 第二阶段,执行运算,创建会话(Session),此时才会对变量进行赋值;

零点一TensorFlow 将图形定义转换成分布式执行的操作, 以充分利用可用的计算资源(如 CPU 或 GPU。一般你不需要显式指定使用 CPU 还是 GPU, TensorFlow 能自动检测。如果检测到 GPU, TensorFlow 会尽可能地利用找到的第一个 GPU 来执行操作. 并行计算能让代价大的算法计算加速执行,TensorFlow也在实现上对复杂操作进行了有效的改进。大部分核相关的操作都是设备相关的实现,比如GPU。下面是一些重要的操作/核:

零点二、

import tensorflow as tf
 #定义‘符号’变量,也称为占位符
 a = tf.placeholder("float")
 b = tf.placeholder("float")

 y = tf.mul(a, b) #构造一个op节点

 sess = tf.Session()#建立会话
 #运行会话,输入数据,并计算节点,同时打印结果
 print sess.run(y, feed_dict={a: 3, b: 3})
 # 任务完成, 关闭会话.
 sess.close()

 

零点三、Session:

Session是为了控制和输出文件的执行的语句,一个实例化Session为sess_test运行sess_test.run()可以获得我们要得知的运算结果,或者是我要运算的部分。

首先我们加载tensorflow,然后建立两个matrix,输出两个matrix矩阵相乘的结果。

import tensorflow as tf

matrix1 = tf.constant([[3, 3]])
matrix2 = tf.constant([[2], [2]])
product = tf.matmul(matrix1, matrix2)

因为product不是直接计算的步骤,所以我们会要使用Session来激活product并得到计算结果,有两种形式来使用会话控制结果:

#method 1
sess = tf.Session()
result = sess.run(product)
print(product)
sess.close()
# output:[[12]]
#method 2
with tf.Session as sess:
    result2 = sess.run(product)
    print(result2)
#output: [[12]]

 

一、constant(常量)

constant是TensorFlow的常量节点,通过constant方法创建,其是计算图(Computational Graph)中的起始节点,是传入数据。

cons = tf.constant(value=[1,2],dtype=tf.float32,shape=(1,2),name='testconst', verify_shape=False)

参数说明

value:初始值,必填,必须是一个张量(1或[1,2,3]或[[1,2,3],[2,2,3]]或......)

dtype:数据类型,选填,默认为value的数据类型,传入参数为tensorflow下的枚举值(float32,float64.......)

shape:数据形状,选填,默认为value的shape,设置时不得比value小,可以比value阶数、维度更高,超过部分按value提供最后一个数字填充。d

name:常量名,选填,默认值不重复,根据创建顺序为(Const,Const_1,Const_2.......)

verify_shape:是否验证value的shape和指定shape相符,若设为True则进行验证,不相符时会抛出异常

import tensorflow as tf

sess = tf.InteractiveSession()
cons1 = tf.constant([1, 2, 3], shape=[2, 3])
print(sess.run(cons1))
# [[1 2 3]
#  [3 3 3]]

 

二、placeholder(占位符)

可以查看:https://blog.youkuaiyun.com/Fly2Leo/article/details/78539950

placeholder是TensorFlow的占位符节点,由placeholder方法创建,其也是一种常量,但是由用户在调用run方法是传递的,也可以将placeholder理解为一种形参。即其不像constant那样直接可以使用,需要用户传递常数值。

X = tf.placeholder(dtype=tf.float32, shape=[144, 10], name='X')

 

参数说明

dtype:数据类型,必填,默认为value的数据类型,传入参数为tensorflow下的枚举值(float32,float64.......)

shape:数据形状,选填,不填则随传入数据的形状自行变动,可以在多次调用中传入不同形状的数据

name:常量名,选填,默认值不重复,根据创建顺序为(Placeholder,Placeholder_1,Placeholder_2.......)

import tensorflow as tf
import numpy.random as random

#占位符shape不设时会按传入参数自行匹配
node1 = tf.placeholder(tf.float32)  # , shape=[4, 5])
node2 = tf.placeholder(tf.float32)  # , shape=[4, 5])
op = tf.multiply(node1, node2)
session = tf.Session()
const1 = tf.constant(random.rand(4, 5))
const2 = tf.constant(random.rand(4, 5))
#可以传入初始化后的常量
print(session.run(op, {node1: session.run(const1), node2: session.run(const2)}))
#也可以直接传入张量,其实同初始化后的常量一致
print(session.run(op, {node1: random.rand(2, 3), node2: random.rand(2, 3)}))

三、variable(变量)

Vatiable是tensorflow的变量节点,通过Variable(注:V大写)方法创建,并且需要传递初始值。在使用前需要通过tensorflow的初始化方法进行初始化。

W = tf.Variable(initial_value=tf.zeros([9, 5]),  # 初始值,必填,张量或可以转换为张量的Python对象。初始值必须有指定一个形状,除非`validate_shape`设置为False。
                trainable=True,  # 如果`True`,则默认值也将变量添加到图形中集合`GraphKeys.TRAINABLE_VARIABLES`。这个集合用作“Optimizer”类使用的默认变量列表
                collections=None,  # 图表集合键的列表。新的变量被添加到这些集合。默认为`[GraphKeys.GLOBAL_VARIABLES]`。
                validate_shape=True,  # 如果`False`,允许变量用初始化未知形状的值。如果“True”,默认的形状`initial_value`必须是已知的。
                caching_device=None,  # 可选设备字符串,描述变量的位置应该被缓存以供阅读。默认为变量的设备。如果不是“None”,则缓存在另一个设备上。典型的用途是缓存在使用变量的Ops所在的设备上进行重复数据删除复制`Switch`和其他条件语句。
                name='W',  # 变量的可选名称。默认为“Variable”并获取自动去重(Variable_1,Variable_2....)。
                variable_def=None, # `VariableDef`协议缓冲区。如果不是“无”,则重新创建变量对象及其内容,引用变量的节点在图中,必须已经存在。图形没有改变。`variable_def`和其他参数是互斥的。
                dtype=tf.float32, # 如果设置,initial_value将被转换为给定的类型。如果`None',数据类型将被保存(如果`initial_value`是一个张量),或者“convert_to_tensor”来决定。
                expected_shape=None,  # 张量的Shape。如果设置,initial_value需要符合这个形状。
                import_scope=None)  # 可选的字符串。名称范围添加到`Variable.`仅在从协议缓冲区初始化时使用。

参数说明Variable函数的全部参数如上方代码展示,不过目前学习中遇到常用的的参数只有如下几个,其他的参数暂时没在代码中遇到

initial_value,dtype,name,创建代码类似下面这样:

 W = tf.Variable(tf.zeros([3, 10]), dtype=tf.float64, name='W')

以上地址:http://www.cnblogs.com/Vulpers/p/7809276.html

4、tf.get_variable(name, shape, initializer):

name就是变量的名称,shape是变量的维度,initializer是变量初始化的方式,初始化的方式有以下几种:

tf.constant_initializer:常量初始化函数

tf.random_normal_initializer:正态分布

tf.truncated_normal_initializer:截取的正态分布

tf.random_uniform_initializer:均匀分布

tf.zeros_initializer:全部是0

tf.ones_initializer:全是1

tf.uniform_unit_scaling_initializer:满足均匀分布,但不影响输出数量级的随机值

5、


def initialize_parameters():
    """
    Initializes weight parameters to build a neural network with tensorflow. The shapes are:
                        W1 : [4, 4, 3, 8]
                        W2 : [2, 2, 8, 16]
    Returns:
    parameters -- a dictionary of tensors containing W1, W2
    """

    tf.set_random_seed(1)                              # so that your "random" numbers match ours

    ### START CODE HERE ### (approx. 2 lines of code)
    W1 = tf.get_variable("W1", [4, 4, 3, 8], initializer=tf.contrib.layers.xavier_initializer(seed=0))
    W2 = tf.get_variable("W2", [2, 2, 8, 16], initializer=tf.contrib.layers.xavier_initializer(seed=0))
    ### END CODE HERE ###

    parameters = {"W1": W1,
                  "W2": W2}

    return parameters

tf.reset_default_graph()
with tf.Session() as sess_test:
    parameters = initialize_parameters()
    init = tf.global_variables_initializer()
    sess_test.run(init)
    print("W1 = " + str(parameters["W1"].eval()[1,1,1]))
    print("W2 = " + str(parameters["W2"].eval()[1,1,1]))

上图中在initialize_parameters()中定义了变量W1,W2,然后用init = tf.global_variables_initializer();sess_test.run(init)来激活这样两个变量才起作用。

5、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其中之一

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

  • strides:卷积时在图像每一维的步长,这是一个一维的向量,长度4

  • padding: 
    string类型的量,只能是”SAME”,”VALID”其中之一,这个值决定了不同的卷积方式(后面会介绍)

  • use_cudnn_on_gpu: 
    bool类型,是否使用cudnn加速,默认为true

return:结果返回一个Tensor,这个输出,就是我们常说的feature map

实例:

那么TensorFlow的卷积具体是怎样实现的呢,用一些例子去解释它:

1.考虑一种最简单的情况,现在有一张3×3单通道的图像(对应的shape:[1,3,3,1]),用一个1×1的卷积核(对应的shape:[1,1,1,1])去做卷积,最后会得到一张3×3的feature map

2.增加图片的通道数,使用一张3×3五通道的图像(对应的shape:[1,3,3,5]),用一个1×1的卷积核(对应的shape:[1,1,1,1])去做卷积,仍然是一张3×3的feature map,这就相当于每一个像素点,卷积核都与该像素点的每一个通道做点积

input = tf.Variable(tf.random_normal([1, 3, 3, 5]))
filter = tf.Variable(tf.random_normal([3, 3, 5, 1]))

op = tf.nn.conv2d(input, filter, strides=[1, 1, 1, 1], padding='VALID')

init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)    
    sess.run(op)

# 一幅3x3x5的图,3x3过滤器,最终得到一个值
# output:[[[[ 10.53139973]]]]

6、tf.nn.max_pool(value, ksize, stride, padding, name)

  • value:

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

  • ksize:

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

  • strides:

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

  • padding:

  和卷积类似,可以取'VALID' 或者'SAME'

  • name:指定该操作的名字

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

7、tf.nn.relu(features, name=None)

8、tf.contrib.layers.flatten(P):

将p伸展为一维的,但是保留batch的size——>返回的值的shape为[batch_size, k]

9、tf.contrib.layers.fully_connected(F, num_outputs):num_outputs为softmax的概率输出

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

Computes softmax cross entropy between  logits and  labels

logits就是神经网络最后一层的输出,如果又batch的话,它的大小就是[batch_size, num_classes],单样本的话,大小就是num_classes

labels:实际的标签,大小同上

  • _sentinel:Used to prevent positional parameters. Internal, do not use
  • labels:
  • logits:
  • dim:
  • name:

return :返回值是一个向量

11、tf.reduce_mean(input_tensor, axis=None, keepdims=None, name=None, reduction_indices=None, keep_dims=None)

example:

x = tf.constant([[1., 1.], [2., 2.]])
tf.reduce_mean(x)  # 1.5
tf.reduce_mean(x, 0)  # [1.5, 1.5]
tf.reduce_mean(x, 1)  # [1.,  2.]

12、Optimizers

tf.train.Optimizer

tf.train.GradientDescentOptimizer

tf.train.AdadeltaOptimizer

tf.train.AdagradeOptimizer

tf.train.AdagradDAOptimizer

tf.train.MomentumOptimizer

tf.train.AdamOptimizer

tf.train.Ftrloptimizer

tf.train.ProximalGradientDescentOptimizer

tf.train.ProximalAdagradOptimizer

tf.train.RMSPropOptimizer

详情参考手册

13、tf.argmax(input, dimension, name=None)

dimension=0按照列找,dimension=1按照行找,tf.argmax()返回最大数值的下标。通常和tf.equal()一起使用,计算模型准确度。

import tensorflow as tf
import numpy as np
 
A = [[1,3,4,5,6]]
B = [[1,3,4], [2,4,1]]
 
with tf.Session() as sess:
    print(sess.run(tf.argmax(A, 1)))
    print(sess.run(tf.argmax(B, 1)))

# Output:[4];  [2, 1]

tf.equal(A, B)是对比这两个矩阵或者向量的相等的元素,如果是相等的那就返回True,反正返回False,返回的值的矩阵维度和A是一样的

import tensorflow as tf
import numpy as np
 
A = [[1,3,4,5,6]]
B = [[1,3,4,3,2]]
 
with tf.Session() as sess:
    print(sess.run(tf.equal(A, B)))

#output:[[True True True False False]]

14、tf.cast():用于改变某个张量的数据类型

开始的时候定义A没有给出类型,采用默认类型,整形。利用tf.cast函数就改为float类型

import tensorflow as tf;
import numpy as np;
 
A = tf.convert_to_tensor(np.array([[1,1,2,4], [3,4,8,5]]))
 
with tf.Session() as sess:
	print A.dtype
	b = tf.cast(A, tf.float32)
	print b.dtype

# Output:<dtype: 'int64'><dtype: 'float32'>               

15、tf.reduce_mean(input_tensor, axis=None, keep_dims=False, name=None, reduction_indices=None)

作用:沿着tensor的某一维度,计算元素的平均值。由于输出tensor的维度比原tensor的低,这类操作也叫降维。

input_tensor:需要降维的tensor。 

axis:axis=none, 求全部元素的平均值;axis=0, 按列降维,求每列平均值;axis=1,按行降维,求每行平均值。

keep_dims:若值为True,可多行输出平均值。 

name:自定义操作的名称。 

reduction_indices:axis的旧名,已停用。

降维后的tensor

import tensorflow as tf

x = tf.constant([[1, 2, 3], [4, 5, 6]])

with tf.Session() as sess:
    x = sess.run(x)
    mean1 = sess.run(tf.reduce_mean(x))
    mean2 = sess.run(tf.reduce_mean(x, 0))
    mean3 = sess.run(tf.reduce_mean(x, 1))
    
    print(x)
    print(mean1)
    print(mean2)
    print(mean3)

#Output:[[ 1.  2.  3.]
 [ 4.  5.  6.]]

3.5

[ 2.5  3.5  4.5]

[ 2.  5.]

16、eval(feed_dict=None, session=None)函数

feed_dict是需要传入的参数,同run()的feed_dict

使用eval()方法的前提是,当前运行时已经创建了默认的session,例如创建交互式session,sess = tf.InteractiveSession(),否则会出现 如下错误 ,找不到缺省sesson。

对于张量来说,使用  eval() 方法可以查看张量的具体数值,该方法返回 一个numpy数组

使用eval函数:t.eval()等价于tf.get_default_session().run(t)

tn = tf.random_normal([1, 10], mean=-1, stddev=4)
t = tf.ones(10)
tmp=tn + t
print(tmp.eval())


Output:array([[-9.58623028,  0.70157331,  7.56238651,  0.12382185,  1.78133655,
        -2.60228705,  2.09345794,  0.78153497,  4.40496349,  0.13798881]], dtype=float32)

可以使用sess.run()在同一步获取多个tensor中的值,使用Tensor.eval()时只能在同一步当中获取一个tensor值,并且每次使用 eval 和 run时,都会执行整个计算图。

17、tf.contrib.layers.flatten(inputs, outputs_collections=None,scope=None)

inputs:A tensor of size [batch_size, ...].

outputs_collection: Collection to add the outputs.

scope:Optional scope for name_scope

return:A flattened tensor with shape [batch_size, k]

Raises:

              vauleerror: If inputs rank is unknown or less than 2.

18、tf.boolean_mask()

# 2-D example
  tensor = [[1, 2], [3, 4], [5, 6]]
  mask = np.array([True, False, True])
  boolean_mask(tensor, mask)  # [[1, 2], [5, 6]]
  ```

19、tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)

从正太分布里输出随机数。

20、

from keras import backend as K

K.argmax(x, axis=-1, keepdims=None)或者K.max(x,axis=-1, keepdims=None), axis=-1表示倒数第一个维度,而且如果keepdims=False,那么将不会保存去最大值或最大index的那个维度:

如:K.argmax(x, axis=-1, keepdims=Flase)  # x.shape=(19, 19, 5, 80),那么result.shape=(19, 19, 5),但是如果是True的话,则为shape=(19, 19, 5, 1)

21、from keras import backend as K

K.concatenate(x, axis=- 1):在对应维度上的一个加法,比如shape=(2, 3)与shape=(2, 3),axis=0:得到shape=(4, 3),axis=1得到shape=(2, 6)

K.gather(reference, indices):reference is a tensor, and indices is an integer tensor of indices

>>> a=np.array([[1,2,3],[4,5,6]])
  >>> b=np.array([[11,21,31],[7,8,9]])
  # 合并行
  >>> np.concatenate((a,b,c),axis=0)  # 默认情况下,axis=0可以不写
  array([[ 1,  2,  3],
   [ 4,  5,  6],
   [11, 21, 31],
   [ 7,  8,  9]])
  # 合并列
  >>> np.concatenate((a,b),axis=1) 
   array([[ 1,  2,  3, 11, 21, 31],
   [ 4,  5,  6,  7,  8,  9]])

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值