Tensorflow学习笔记(二)

一、学习内容:

1、Session.run()的具体使用
2、Variable变量的使用
3、placeholder的定义与使用
4、建造神经网络


二、代码及注释:

1.Session会话控制及两种打开方式

import tensorflow as tf
matrix1 = tf.constant([[3,3]])#恒量 一行两列的矩阵
matrix2 = tf.constant([[2],
                       [2]])#两行一列的矩阵
product = tf.matmul(matrix1,matrix2) #矩阵乘法  np.dot(m1,m2)

###方法1
sess = tf.Session()#Session是一个object要被大写首字母
result = sess.run(product)#执行product 返回product的结果 每run一次tensorflow才会执行这个结构
print(result)
sess.close()

###方法2
with tf.Session() as sess: #打开了Session以sess命名
    result2 = sess.run(product)
    print(result2)
    

2.Variable变量的使用

import tensorflow as tf
#与Python中定义变量的方法不同,一定要定义成变量它才是变量
state = tf.Variable(0,name='counter') #初始值为0 变量name为counter state是调用变量时使用的名字,而counter是这个变量的一个属性
#print(state.name)

one = tf.constant(1) #常量1
new_value = tf.add(state,one)
update = tf.assign(state,new_value)#相当于将new_value这个变量加载到了state上

init = tf.initialize_all_variables() #1如果定义了variable一定要进行初始化、激活

with tf.Session() as sess:
    sess.run(init) #2如果定义了variable一定要进行初始化、激活
    for _ in range(3):
         sess.run(update)
         print(sess.run(state))

3.placeholder的使用

import tensorflow as tf
input1 = tf.placeholder(tf.float32)#定义placeholder 并给定类型float32
input2 = tf.placeholder(tf.float32)
output = tf.multiply(input1,input2)
with tf.Session() as sess:
    print(sess.run(output,feed_dict={
    
    input1:[7.],input2:[2.]}))#以字典的形式传入值
##使用placeholder,是sess.run()运行这个结果的时候,再给它输入的值

4.建造神经网络

import tensorflow as tf
import numpy as np
### 定义了一个函数 用来添加层
def add_layer(intputs,in_size,out_size,activation_function=None):
    Weights = tf.Variable(tf.random_normal([in_size,out_size])) # 权重 生成随机变量矩阵
    biases = tf.Variable(tf.zeros([1,out_size])+0.1) # 偏移 biases初始值推荐不为0,所以此处加上0.1
    Wx_plus_b = tf.matmul(intputs,Weights)+biases # 输入值与随机变量矩阵相乘再加上偏移
    if activation_function is None: # 如果激励函数是None的话说明是线性关系
        outputs = Wx_plus_b
    else:
        outputs = activation_function(Wx_plus_b)
    return outputs

x_data = np.linspace(-1,1,300)[:,np.newaxis] # -1到1的区间 300个单位 x_data有1个特性但是有300个例子 最后中括号代表的是维度
noise = np.random.normal(0,0.05,x_data.shape) # 起始值0 方差0.05 格式与x_data相同
y_data = np.square(x_data) - 0.5 + noise # x_datade平方减0.5加noise

xs = tf.placeholder(tf.float32,[None,1])
ys = tf.placeholder(tf.float32,[None,1])

l1 = add_layer(xs,1,10,activation_function=tf.nn.relu) # 隐藏层 (input inputsize outputsize 激励方程)
prediction = add_layer(l1,10,1,activation_function=None) # 输出层 (output inputsize outputsize 激励方程)

loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction), # 预测值与真实值的差别 求和 求平均值
                                    reduction_indices=[1]))

train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss) # 使用GradientDescentOptimizer优化器 学习效率0.1 作用是减小loss

init = tf.initialize_all_variables(); # 对所有的变量进行初试化
sess = tf.Session() # 定义Session
sess.run(init) # 运行初始化

for i in range(1000):
    sess.run(train_step,feed_dict={
    
    xs:x_data,ys:y_data}) # 以字典的形式传入值
    if i%50==0:
        print(sess.run(loss,feed_dict={
    
    xs:x_data,ys:y_data}))


三、相关问题整理:

1.激励函数的形式
线性函数y = Wx 在这里W是参数,y是预测值,x是输入值。y=AF(W*x) 这里的AF()即为激励函数 ,激励函数一定是要可微分的,因为误差反向传递时需要这样的操作
2.激励函数的作用
激励函数就是让某一部分的神经元先激活起来,然后把激活的效应的信息传递到后面一层神经系统。对于一张猫的图片来说,有些神经元对猫的眼睛特别感兴趣,他会被激励,数值会被提高
3.激励函数的选择
(1)少量层结构有很多种不同形式的激励函数可供选择
(2)卷积神经网络中推荐relu
(3)循环神经网络中推荐relu或者tanh
4.过拟合现象
一个假设在训练数据上能够获得比其他假设更好的拟合,但是在训练数据之外的数据集上却不能很好的拟合数据,此时认为这个假设出现了过拟合现象。
5.过拟合现象的原因
(1)训练数据中存在噪音
(2)训练数据较少
(3)假设成立的条件实际并不成立
(4)模型复杂度较高
对于神经网络模型,对样本数据可能存在分类决策面不唯一的问题,随着学习的进行,算法可能使权值收敛于过于复杂的决策面。权值学习迭代次数足够多,你喝了训练数据中的噪声和训练样例中没有代表性的特征。
6.解决过拟合现象的方法
(1)在神经网络模型中可以使用权值衰减的方法,即每次迭代过程中以某个小因子降低每个权值。
(2)选取合适的停止训练标准,使对机器的训练在合适的程度。
(3)保留验证数据集,对训练成果进行验证
(4)获得额外数据进行交叉验证
(5)正则化,即在进行目标函数或代价函数优化时,在目标函数或代价函数后面加一个正则项。

猜你喜欢

转载自blog.csdn.net/WuwuwuH_/article/details/115470202