【数据极客】任务总结_Week2
来源:互联网 发布:芒果tv网络电视下载 编辑:程序博客网 时间:2024/05/19 18:42
本文目录
- 本文目录
- 推荐内容学习
- 1 逻辑回归 Logistic Regression
- 1 back propagation 算法原理理解
- 2 sigmoid函数tanh函数和ReLU函数的区别以及各自的优缺点对应的tf函数是
- 3 softmax和cross_entropy原理解释
- 4 tfplaceholder tfconstanttfVariable的区别
- 5 举例说明tfGraph 概念理解
- 6 tfname_scope和tfvariable_scope的理解
- 7 tfvariable_scope 和tfget_variable的理解
- 9 学习中的知识点收获记录
- 实践任务
- a使 tf实现Logistic Regression算法必做 截止日期1118
- b使 a任务实现的算法完成 Kaggle泰坦尼克之灾链接httpswwwkagglecomctitanic选做截止日期1125
- 参考文献
1. 推荐内容学习
## **1.0 线性回归Linear Regression**1.1 逻辑回归 Logistic Regression
- 线性
z=∑iwixi+b 通过 Sigmod 函数σ(z) 转为非线性
logistic回归本质上是线性回归,只是在特征到结果的映射中加入了一层函数映射,即先把特征线性求和,然后使用函数σ(z) 将最为假设函数来预测。σ(z) 可以将连续值映射到0和1上。
上面公式在线性回归的基础上, 将线性回归的结果带入Sigmod函数中, 得到的结果介于 0 到 1 之间。
将
表示在Sigmod函数的映射下 ,
从该式可以看出, 最后
- 损失函数
误差公式:
每个
等式右边的
即:
【伯努利分布】
如果
2.1 back propagation 算法原理理解 ?
http://blog.csdn.net/mao_xiao_feng/article/details/53048213
2.2 sigmoid函数、tanh函数和ReLU函数的区别?以及各自的优缺点?对应的tf函数是?
这三个都是非线性激励函数, 为什么引入非线性激励函数?
如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层输出都是上层输入的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)。
正因为上面的原因,决定引入非线性函数作为激励函数,这样深层神经网络就有意义了(不再是输入的线性组合,可以逼近任意函数)。最早的想法是sigmoid函数或者tanh函数,输出有界,很容易充当下一层输入。
激活函数(Activation Function)的特点:
- 非线性: 当激活函数是线性的时候,一个两层的神经网络就可以逼近基本上所有的函数了。
- 可微: 当优化方法是基于梯度的时候,这个性质是必须的。
- 单调性: 当激活函数是单调的时候,单层网络能够保证是凸函数。
- f(x)≈x: 当激活函数满足这个性质的时候,如果参数的初始化是random的很小的值,那么神经网络的训练将会很高效。
输出值范围: 当激活函数输出值是 有限 的时候,基于梯度的优化方法会更加 稳定,因为特征的表示受有限权值的影响更显著;当激活函数的输出是 无限 的时候,模型的训练会更加高效,不过在这种情况小,一般需要更小的学习率。
Sigmod
- 公式:
f(x)=11+e−z 图像:
优点: 可将任意值变换到01区间, 可做概率; 它还是便于求导的平滑函数,其导数为
σ(x)(1−σ(x)) - 缺点:
- 容易出现梯度消失gradient vanishing, 在反向传播算法中, Sigmod函数求导越来越小, 最后会发生梯度消失。ReLU导数是常数, 因此可以解决梯度消失问题。
- 函数输出并不是零均值的zero-centered, Sigmoid函数的输出值恒大于0,这会导致模型训练的收敛速度变慢。
- 幂运算相对来讲比较耗时
- tf函数
tf.sigmoid(x, name=None)
- 公式:
Tanh
- 公式:
tanh(x)=ex−e−xex+e−x=2sigmod(2x)−1 图片:
优点:
tanh读作Hyperbolic Tangent,如上图所示,tanh 是0均值的, 它解决了不是零均值的输出问题,。因此,实际应用中,tanh 会比 sigmoid 更好。缺点:
梯度消失的问题和幂运算的问题仍然存在。tf函数
tf.tanh(x, name=None)
- 公式:
ReLU
数学公式:
ReLU=f(x)=max(0,x) - tf函数
tf.nn.relu(features, name=None)
- tf函数
二维数据的时候:
从图左可以看出,输入信号<0时,输出都是0,>0 的情况下,输出等于输入。w 是二维的情况下,使用ReLU之后的效果如下:优点
- 解决了gradient vanishing问题 (在正区间)
- ReLU 得到的SGD的收敛速度会比 sigmoid/tanh 快很多(看右图)。计算速度非常快,只需要判断输入是否大于0
- 收敛速度远快于sigmoid和tanh
缺点
- ReLU的输出不是zero-centered
- Dead ReLU Problem 神经元死亡问题,指的是某些神经元可能永远不会被激活。
tf函数 tf.nn.relu(features, name=None)
2.3 softmax和cross_entropy原理解释?
softmax
softmax用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,输出结果(概率)和为1, 可以看成概率来理解,从而来进行多分类!cross_entropy
交叉熵,信息学理论中的概念,用来衡量两个分布之间的相似程度,值越小,越相似。当两者一样时,熵为0。softmax 和 sigmod的区别
sigmoid将一个real value映射到(0,1)的区间(当然也可以是(-1,1)),这样可以用来做二分类。
softmax把一个k维的real value向量(a1,a2,a3,a4….)映射成一个(b1,b2,b3,b4….)其中bi是一个0-1的常数,然后可以根据bi的大小来进行多分类的任务,如取权重最大的一维。
2.4 tf.placeholder() 、tf.constant()、tf.Variable()的区别?
tf.placeholder()
- 用于得到传递进来的真实的训练样本, 是个占位符。
- 不必指定初始值,可在运行时,通过
Session.run
的函数的feed_dict
参数指定
tf.constant()
- tf.constant(value, dtype=None, shape=None, name=’Const’, verify_shape=False)
作用:创建一个常量tensor
参数:
value: 一个dtype类型(如果指定了)的常量值(列表)。要注意的是,要是value是一个列表的话,那么列表的长度不能够超过形状参数指定的大小(如果指定了)。要是列表长度小于指定的,那么多余的由列表的最后一个元素来填充。
dtype: 返回tensor的类型
shape: 返回的tensor形状。
name: tensor的名字
verify_shape: Boolean that enables verification of a shape of values.
- tf.constant(value, dtype=None, shape=None, name=’Const’, verify_shape=False)
tf.Variable()
- 通过构造一个Variable类的实例在图中添加一个变量,主要在于一些可训练变量(trainable variables),比如模型的权重(weights,W)或者偏执值(bias)
- 构造函数需要初始值,这个初始值可以是一个任何类型任何形状的Tensor,初始值的形状和类型决定了这个变量的形状和类型。
2.5 举例说明:tf.Graph() 概念理解?
一个TensorFlow的运算,被表示为一个数据流的图。一幅图中包含一些操作(Operation)对象,这些对象是计算节点。Tensor对象,则是表示在不同的操作(operation)间的数据节点。
2.6 tf.name_scope()和tf.variable_scope()的理解?
tf.name_scope(name, default_name=None, values=None)
主要结合 tf.Variable() 来使用,方便参数命名管理。tf.variable_scope() 主要结合 tf.get_variable() 来使用,实现 变量共享。
先通过tf.variable_scope生成一个上下文管理器,并指明需求的变量在这个上下文管理器中,就可以直接通过tf.get_variable获取已经生成的变量。
我觉得这个相当于指定一个命名空间。
#通过tf.variable_scope函数控制tf.get_variable函数来获取以及创建过的变量 with tf.variable_scope("ttf"):#ttf的命名空间 v=tf.get_variable("v",[1],initializer=tf.constant_initializer(1.0)) #在ttf的命名空间内创建名字为v的变量
在上下文管理器中已经生成一个v的变量,若想通过tf.get_variable函数获取其变量,则可以通过reuse参数的设定为True来获取, 重用。with tf.variable_scope("ttf",reuse=True): v1=tf.get_variable("v",[1]) print(v==v1) #输出为True
2.7 tf.variable_scope() 和tf.get_variable()的理解?
tf.variable_scope()
tf.get_variable()
tf.get_variable(name, shape=None, dtype=None, initializer=None, regularizer=None, trainable=True, collections=None, caching_device=None, partitioner=None, validate_shape=True, use_resource=None, custom_getter=None)
Gets an existing variable with these parameters or create a new one.
获取或者创建变量。
当tf.get_variable用于创建变量时,则与tf.Variable的功能基本相同。
#定义的基本等价 v = tf.get_variable("v",shape=[1],initializer.constant_initializer(1.0)) v = tf.Variable(tf.constant(1.0,shape=[1]),name="v")
- 相同点:通过两函数创建变量的过程基本一样,且tf.variable函数调用时提供的维度(shape)信息以及初始化方法(initializer)的参数和tf.Variable函数调用时提供的初始化过程中的参数基本类似。 - 不同点:两函数指定变量名称的参数不同,对于tf.Variable函数,变量名称是一个可选的参数,通过name=”v”的形式给出,而tf.get_variable函数,变量名称是一个必填的参数,它会根据变量名称去创建或者获取变量。## 2.8 tf.global_variables_initializer() 什么时候使用?使用tf.global_variables_initializer()函数初始化所有可变张量的状态。2.9 学习中的知识点收获记录?
3. 实践任务
a、使 tf实现Logistic Regression算法(必做) 截止日期:11.18
b、使 a任务实现的算法,完成 “Kaggle泰坦尼克之灾”(链接https://www.kaggle.com/c/titanic)(选做)截止日期:11.25
第四周的作业都出来, 吓得一条, 赶紧把第二周的实践作业完成了。
# -*- coding: utf-8 -*-import tensorflow as tfimport pandas as pdimport numpy as npimport matplotlib.pyplot as pltfrom pandas import Series,DataFramefrom sklearn.model_selection import train_test_split
data_train = pd.read_csv("./input/train.csv", header=0)data_train.columns
Index([‘PassengerId’, ‘Survived’, ‘Pclass’, ‘Name’, ‘Sex’, ‘Age’, ‘SibSp’, ‘Parch’, ‘Ticket’, ‘Fare’, ‘Cabin’, ‘Embarked’], dtype=’object’)PassengerId => 乘客IDPclass => 乘客等级(1/2/3等舱位)
Name => 乘客姓名
Sex => 性别
Age => 年龄
SibSp => 堂兄弟/妹个数
Parch => 父母与小孩个数
Ticket => 船票信息
Fare => 票价
Cabin => 客舱
Embarked => 登船港口
data_train.Sex.value_counts()
male 577 female 314 Name: Sex, dtype: int64# 计算平均年龄mean_age = int(data_train["Age"].mean())mean_age
29data_train2 = data_train
#将年龄为空的记录 用平均年龄填充data_train2.loc[(data_train2.Age.isnull()), 'Age' ] = mean_age
# 有舱位的数据用Yes填充, 没有的用Nodef setCabinType(df): df.loc[ (df.Cabin.notnull()), 'Cabin' ] = "Yes" df.loc[ (df.Cabin.isnull()), 'Cabin' ] = "No" return df
data_train2 = setCabinType(data_train2)data_train2.head(5)
#特征离散化dummies_Sex = pd.get_dummies(data_train2['Sex'], prefix= 'Sex')dummies_Pclass = pd.get_dummies(data_train2['Pclass'], prefix= 'Pclass')dummies_Cabin = pd.get_dummies(data_train2['Cabin'], prefix= 'Cabin')dummies_Embarked = pd.get_dummies(data_train2['Embarked'], prefix= 'Embarked')
df = pd.concat([data_train, dummies_Cabin, dummies_Embarked, dummies_Sex, dummies_Pclass], axis=1)df.drop(['Pclass', 'Name', 'Sex', 'Ticket', 'Cabin', 'Embarked'], axis=1, inplace=True)df.head(5)
train_df = df.filter(regex='Survived|Age_.*|Sex_.*|Pclass_.*')train_np = train_df.as_matrix()label = train_np[:, 0]label=label.reshape((891,1))print(label.shape)input= train_np[:, 1:]print(input.shape)
(891, 1)(891, 5)
learning_rate = 0.5seed = 0;X_train, X_val, y_train, y_val = train_test_split( input, label, test_size = 0.2, random_state = seed)print(X_train.shape)print(X_val.shape)print(y_train.shape)print(y_val.shape)# 训练数据X = tf.placeholder(tf.float32, shape=[None, 5], name='input')y = tf.placeholder(tf.float32, shape=[None, 1], name='label') # 声明参数权重变量W = tf.Variable(tf.random_normal([5, 1]), name='weights')b = tf.Variable(tf.zeros([1]), name='bias') # softmax逻辑回归y_pred = tf.nn.softmax(tf.matmul(X, W) + b) # 损失函数:交叉熵cross_entropy = - tf.reduce_sum(y * tf.log(y_pred + 1e-10), reduction_indices=1) # 计算交叉熵的平均值cost = tf.reduce_mean(cross_entropy) # 使用SDG最小化代价cost函数train_op = tf.train.GradientDescentOptimizer(0.5).minimize(cost) # 保存训练模型saver = tf.train.Saver()with tf.Session() as sess: tf.global_variables_initializer().run() for epoch in range(100): total_loss = 0.0 for i in range(len(X_train)): feed = {X: [X_train[i]], y: [y_train[i]]} _, loss = sess.run([train_op, cost], feed_dict=feed) total_loss += loss if (epoch % 10 == 0): print('Epoch: %04d, total loss=%.9f' % (epoch + 1, total_loss)) print('Training complete!') # 用验证集评估模型的准确率 pred_val = sess.run(y_pred, feed_dict={X: X_val}) correct = np.equal(np.argmax(pred_val, 1), np.argmax(y_val, 1)) accuracy = np.mean(correct.astype(np.float32)) print('accuracy on validation set:%.9f' % accuracy) saver.save(sess, "Model/model_ema.ckpt") sess.close()
(712, 5)(179, 5)(712, 1)(179, 1)Epoch: 0001, total loss=0.000000000Epoch: 0011, total loss=0.000000000Epoch: 0021, total loss=0.000000000Epoch: 0031, total loss=0.000000000Epoch: 0041, total loss=0.000000000Epoch: 0051, total loss=0.000000000Epoch: 0061, total loss=0.000000000Epoch: 0071, total loss=0.000000000Epoch: 0081, total loss=0.000000000Epoch: 0091, total loss=0.000000000Training complete!accuracy on validation set:1.000000000
参考文献
http://blog.csdn.net/hsj1213522415/article/details/70674197?locationNum=9&fps=1
https://www.zhihu.com/question/29021768
https://zhuanlan.zhihu.com/p/25110450
https://www.zhihu.com/question/23765351
https://zh.wikipedia.org/wiki/Softmax%E5%87%BD%E6%95%B0
http://blog.csdn.net/sinat_32329183/article/details/77835677
http://blog.csdn.net/lanchunhui/article/details/61712830
- 【数据极客】任务总结_Week2
- 【数据极客】任务总结_Week1
- 【数据极客】任务总结_Week3
- 数据转存小任务总结
- TFS集群间数据迁移任务总结
- 任务总结
- spring 任务调度总结
- ECSHOP 计划任务总结
- Java定时任务总结
- Java定时任务总结
- Java定时任务总结
- spring 任务调度总结
- ucOS任务管理总结
- lancher任务总结
- 异步任务的总结
- spring定时任务总结
- AsyncTask异步任务总结
- 定时任务总结
- 大数据技术和应用
- Java直接内存详解
- mysql_备份与恢复
- 推荐:使用 Istio Service Mesh 管理微服务的具体例子(译)
- 【iOS】苹果IAP(内购)中沙盒账号使用注意事项
- 【数据极客】任务总结_Week2
- 改变Mysql最大连接数
- git流程一览表
- Fragement+RationGroup实现导航的核心
- faster-rcnn学习
- OpenShift安装
- 项目综合:功能实现+界面
- Ciclop开源3D扫描仪软件---Horus源码分析之laser_segmentation.py
- maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令