变量都是tensor。
先引入库
import tensorflow as tf
import numpy as np
import math
import matplotlib.pyplot as plt
np.random.seed(1)
os.environ["CUDA_VISIBLE_DEVICES"]="2"
使用tensorflow一般都是如下步骤:
- 声明张量(tensors)
- 写对张量的操作
- 初始化张量
- create会话(session)
- 跑会话,会话会执行之前写的对张量的操作
例子:
y_hat = tf.constant(36, name='y_hat') # 声明张量(常量)
y = tf.constant(39, name='y') # 声明张量
W1=tf.get_variable("W1", [25,64*64*3], initializer=tf.contrib.layers.xavier_initializer(seed=1)) #该函数返回一个用于初始化权重的初始化程序 “Xavier” 。这个初始化器是用来保持每一层的梯度大小都差不多相同。
b1=tf.get_variable("b1", [25,1], initializer=tf.zeros_initializer()) #初始化为0
loss = tf.Variable((y - y_hat)**2, name='loss') # 声明张量(变量),也是对y, y_hat进行的操作,求loss
init = tf.global_variables_initializer() # 初始化张量
with tf.Session() as session: #create会话
session.run(init) # 跑会话
print(session.run(loss))
如果没有初始化则不会计算。如下面例子:
a=tf.constant(2)
b=tf.constant(10)
c=tf.multiply(a,b)
print(c) #Tensor("Mul:0", shape=(), dtype=int32)
看到c=0.所以要run才行(这里因为没有变量,所以不需要初始化。在上一个例子中因为有loss这个tf.variable,所以需要init = tf.global_variables_initializer()
并session.run(init)
palceholder:可以稍后再设定值。通过feed_dict这个参数来这顶。如下:
x = tf.placeholder(tf.int64, name = 'x')
print(sess.run(2 * x, feed_dict = {x: 3}))
sess.close()
或者x是矩阵:
X=tf.placeholder(tf.float32, shape=(None, n_H0, n_W0, n_C0))
线性函数操作:
tf.matmul(…, …) 矩阵乘法,不同于numpy的乘法,这个乘法需要两个矩阵 的形状对的上,比如nm X ms=n*s, 即tf.matmul(X, Y), 其中X.shape=(n,m), Y.shape(m,s)
tf.add(…, …) 矩阵加法, 两个矩阵形状要相同
运行会话的两种方式:
方法1:
with tf.Session() as sess:
result = sess.run(..., feed_dict={x:z})
方法2:
sess=tf.Session()
result=sess.run(..., feed_dict={x:z})
sess.close()
计算entropy-cost: cost=tf.nn.sigmoid_cross_entropy_with_logits_v2(logits=…, labels=…)
one-hot编码 :
one_hot 编码是指, 如结果Y有C个种类的结果(0- C-1)。比如手势识别总共有10种手势,则Y的值可能是0-9. one hot 编码将一维向量Y编码成二维向量
#如果样本j 有 标签i, 则(i, j)为1
tf.one_hot(labels, depth, axis) #labels是结果向量
#depth是结果的种类即one-hot后矩阵的row
#axis=0为上图的样子。axis=1为上图的转置, 一般为0
初始化为全0或者全1
zeros=tf.zeros(shape) # shape=[3]
ones=tf.ones(shape) #shape=[3,7]