tensorflow笔记

#tensorflow笔记

一个小例子

#用numpy构造数据
x_data = np.random.rand(100).astype(np.float32)
y_data = x_data*0.1 + 0.3
#tf.Variable定义了一个变量,random_uniform表示用随机的方式生成变量的初始值
#1表示这个变量是一维的,变量的初始范围是-1到1
Weights = tf.Variable(tf.random_uniform([1], -1.0, 1.0))
#定了变量初始值为0
biases = tf.Variable(tf.zeros([1]))
#预测的y,由真实的数据x_data来表示
y = Weights*x_data + biases
#定义损失函数,实际的y与定义的y_data的差值
loss = tf.reduce_mean(tf.square(y-y_data))
#定义了一个最原始的优化器,0.5为学习率
optimizer = tf.train.GradientDescentOptimizer(0.5)
#用优化器减小误差
train = optimizer.minimize(loss)
#建立了神经网络的结构,在使用这个结构之前,我们必须先初始化所有之前定义的Variable初始化
init = tf.global_variables_initializer()
#用Session来run每一次training的数据
sess = tf.Session()
sess.run(init)
#要训练多少次,就循环多少次
for step in range(201):
sess.run(train)
if step % 20 == 0:
#每20次训练输出定义的权重和偏置值
print(step, sess.run(Weights), sess.run(biases))

Session会话控制

#定义两个矩阵,tf.constant表示恒量
matrix1 = tf.constant([[3,3]])
matrix2 = tf.constant([[2],
   [2]])
#tf.matmul表示矩阵乘法
product = tf.matmul(matrix1,matrix2)
# 两种Session的打开模式,法1
sess = tf.Session()
result = sess.run(product)
print(result)
sess.close()
#法2
with tf.Session() as sess:
result2 = sess.run(product)
print(result2)

Variable 变量

#变量一定要用tf.Variable定义才是变量
#这里定义了变量名为0,变量名为counter,然后打印了变量名字
state = tf.Variable(0, name='counter')
print(state.name)
# 定义常量 one
one = tf.constant(1)
# 定义加法步骤 (注: 此步并没有直接计算)
new_value = tf.add(state, one)
# 用tf.assign将 State 更新成为 new_value
update = tf.assign(state, new_value)
# 如果定义 Variable, 就一定要 initialize
# 就是初始化我们定义的变量
init = tf.global_variables_initializer() 
# 使用 Session
with tf.Session() as sess:
    #必须要run一下init激活我们的结构
    sess.run(init)
    for _ in range(3):
        #每run一次update,state变量就会加1
        sess.run(update)
        #注意这里直接 print(state) 不起作用
        print(sess.run(state))

Placeholder 传入值

#在 Tensorflow 中需要定义 placeholder 的 type ,一般为 float32 类型
input1 = tf.placeholder(tf.float32)
nput2 = tf.placeholder(tf.float32)
# mul = multiply 是将input1和input2 做乘法运算,并输出为 output 
ouput = tf.multiply(input1, input2)
with tf.Session() as sess:
    # 需要传入的值放在了feed_dict={} 并一一对应每一个 
    # input. placeholder 与 feed_dict={} 是绑定在一起出现的
    print(sess.run(ouput, feed_dict={input1: [7.], input2: [2.]}))

添加层 def add_layer()

#定义添加神经层的函数def add_layer(),
#它有四个参数:输入值、输入的大小、输出的大小和激励函数,我们设定默认的激励函数是None。
def add_layer(inputs, in_size, out_size, activation_function=None):  
    #随机变量(normal distribution)会比全部为0要好很多
    #这里的weights为一个in_size行, out_size列的随机变量矩阵。
    Weights = tf.Variable(tf.random_normal([in_size, out_size]))
    #biases的推荐值不为0,所以我们这里是在0向量的基础上又加了0.1
    biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)
    #定义Wx_plus_b, 即神经网络未激活的值
    Wx_plus_b = tf.matmul(inputs, Weights) + biases

    if activation_function is None:
        outputs = Wx_plus_b
    else:
        outputs = activation_function(Wx_plus_b)
    #返回输出,添加一个神经层的函数——def add_layer()就定义好了
    return outputs

建造神经网络

#利用占位符定义我们所需的神经网络的输入,训练时再传值! 
#tf.placeholder()就是代表占位符
#这里的None代表无论输入样本有多少都可以,因为输入只有一个特征,所以这里是1。
xs = tf.placeholder(tf.float32, [None, 1])
ys = tf.placeholder(tf.float32, [None, 1])
#构建输入层1个、隐藏层10个、输出层1个神经元的神经网络
#虽然有三个层,但是只需要定义两个层构造函数即可
#用上面的添加层函数定义隐藏层,激活函数用relu
l1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu)
#定义输出层,输出层输入的数据是隐藏层l1的输出
prediction = add_layer(l1, 10, 1, activation_function=None)
#计算预测值prediction和真实值的误差,对二者差的平方求和再取平均。
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),
     reduction_indices=[1]))
#用优化器以0.1的效率来最小化误差loss。
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
#下面,让机器开始学习。
#机器学习的内容是train_step
#当运算要用到placeholder时,就需要feed_dict这个字典来指定输入。
for i in range(1000):
    # training
    sess.run(train_step, feed_dict={xs: x_data, ys: y_data})
    if i % 50 == 0:
        # to see the step improvement
        print(sess.run(loss, feed_dict={xs: x_data, ys: y_data}))
#预测对应x值的y值
prediction_value = sess.run(prediction, feed_dict={xs: x_data})

Classification 分类学习

#784表示28x28个特征,即一张图片由784个像素构成
#相当于每个样本有784个输入
xs = tf.placeholder(tf.float32, [None, 784])
#每张图片都表示一个数字,所以我们的输出是数字0到9,共10类。
#相对于每个样本有10个输出的可能
ys = tf.placeholder(tf.float32, [None, 10])
#调用add_layer函数搭建一个最简单的训练网络结构,只有输入层和输出层。 
prediction = add_layer(xs, 784, 10, activation_function=tf.nn.softmax)
#loss函数(即最优化目标函数)选用交叉熵函数。
#交叉熵用来衡量预测值和真实值的相似程度,如果完全相同,它们的交叉熵等于零。
cross_entropy = tf.reduce_mean(
    -tf.reduce_sum(ys * tf.log(prediction),reduction_indices=[1]))
#优化器,train方法(最优化算法)采用梯度下降法。
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
#现在开始train,每次只取100张图片,免得数据太多训练太慢。
#mnist是原始样本集
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={xs: batch_xs, ys: batch_ys})

Dropout 解决 overfitting

#先定义一个keep_prob
keep_prob = tf.placeholder(tf.float32)
#keep_prob最后在这里使用,表示有50%的结果不被Dropout掉
#keep_prob即保留概率,即我们要保留的结果所占比例
sess.run(train_step, feed_dict={xs: X_train, ys: y_train, keep_prob: 0.5})
#dropout掉Wx_plus_b的50%的结果
#Wx_plus_b是我们定义的预测值
Wx_plus_b = tf.nn.dropout(Wx_plus_b, keep_prob)

CNN 卷积神经网络

#定义Weight变量,输入shape,返回变量的参数。
#其中我们使用tf.truncted_normal产生随机变量来进行初始化
def weight_variable(shape): 
    inital=tf.truncted_normal(shape,stddev=0.1)
    return tf.Variable(initial)
#定义biase变量,输入shape ,返回变量的一些参数。
#其中我们使用tf.constant常量函数来进行初始化
def bias_variable(shape): 
    initial=tf.constant(0.1,shape=shape) 
    return tf.Variable(initial)
#定义卷积,tf.nn.conv2d函数是tensoflow里面的二维的卷积函数
#x是图片的所有参数,W是此卷积层的权重,
#然后定义卷积的步长strides=[1,1,1,1]值,strides[0]和strides[3]的两个1是默认值,
#中间两个1代表padding时在x方向运动一步,y方向运动一步,padding采用的方式是SAME。
def conv2d(x,W):
    return tf.nn.conv2d(x,W,strides=[1,1,1,1],padding='SAME') 
#接着定义池化pooling,
#为了得到更多的图片信息,padding时我们选的是一次一步,也就是strides[1]=strides[2]=1,
#这样得到的图片尺寸没有变化,而我们希望压缩一下图片也就是参数能少一些从而减小系统的复杂度,
#因此我们采用pooling来稀疏化参数,也就是卷积神经网络中所谓的下采样层。
#pooling 有两种,一种是最大值池化,一种是平均值池化,本例采用的是最大值池化tf.max_pool()。
#池化的核函数大小为2x2,因此ksize=[1,2,2,1],步长为2,因此strides=[1,2,2,1]:
def max_poo_2x2(x): 
    return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1])
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容