学习笔记 TF009:对数几率回归 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cralison
V2EX    TensorFlow

学习笔记 TF009:对数几率回归

  •  
  •   cralison 2017-05-16 01:35:17 +08:00 2931 次点击
    这是一个创建于 3132 天前的主题,其中的信息可能已经有所发展或是发生改变。

    logistic 函数,也称 sigmoid 函数,概率分布函数。给定特定输入,计算输出"success"的概率,对回题回答"Yes"的概率。接受单个输入。多维数据或训练集样本特征,可以用线性回归模型表达式合并成单值。

    损失函数可以使用平方误差。训练集"Yes"代表 100%概率或输出值 1 的概率。损失刻画特定样本模型分配小于 1 值概率。"No"概率值 0。损失是模型分配样本概率值并取平方。平方误差惩罚与损失同数量级情形。输出与期望相差太远,交叉熵(cross entropy)输出更大值(惩罚)。模型期望输出"Yes"样本预测概率接近 0 时,罚项值增长到接近无穷大。训练完,模型不可能做出这样的错误预测。TensorFlow 提供单个优化步骤 sigmoid 输出计算交叉熵。

    信息论,符号字符串每个字符出现概率已知,用香农熵估计字符串每个符号编码所需平均最小位数。符号编码,如果假设其他概率非真实概率,符号编码长度更大。交叉熵以次优编码方案计算同字符串编码平均最小位数。损失函数期望输出概率分布,实际值 100%和 0,将自定概率作为模型计算输出。sigmoid 函数输出概率值。当真实概率等于自定概率,交叉熵值最小。交叉熵越接近熵,自定概率是真实概率更好逼近。模型输出与期望输出越接近,交叉熵越小。

    从 csv 文件读取数据,加载解析,创建批次读取张量多行数据,提升推断计算效率。tf.decode_csv() Op 将字符串(文本行)转换到指定默认值张量列元组,为每列设置数据类型。读取文件,加载张量 batch_size 行。属性数据(categorical data),推断模型需要把字符串特征转换为数值型特征。每个属性特征扩展为 N 维布尔型特征,每个可能取值对应一维。具备属性相应维度取值 1。模型对每个可能取值独立加权。单个变量表示只可能两种值属性。所有特征排列矩阵,矩阵转置,每行一样本,每列一特征。输入,调用 read_csv,转换读取数据,tf.equal 方法检查属性值与常量值是否相等,tf.to_float 方法将布尔值转换成数值。tf.stack 方法打包所有布尔值进单个张量。

    训练,度量准确率,正确预测样本总数占全部样本比例。样本输出大于 0.5 转换为正回答。tf.equal 比较预测结果与实际值是否相等。tf.reduce_mean 统计所有正确预测样本数,除以批次样本总数,得到正确预测百分比。

    import tensorflow as tf import os #参数变量初始化 W = tf.Variable(tf.zeros([5, 1]), name="weights")#变量权值 b = tf.Variable(0., name="bias")#线性函数常量,模型偏置 def combine_inputs(X):#输入值合并 print "function: combine_inputs" return tf.matmul(X, W) + b def inference(X):#计算返回推断模型输出(数据 X) print "function: inference" return tf.sigmoid(combine_inputs(X))#调用概率分布函数 def loss(X, Y):#计算损失(训练数据 X 及期望输出 Y) print "function: loss" return tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=combine_inputs(X), labels=Y))#求平均值 def read_csv(batch_size, file_name, record_defaults):#从 csv 文件读取数据,加载解析,创建批次读取张量多行数据 filename_queue = tf.train.string_input_producer([os.path.join(os.getcwd(), file_name)]) reader = tf.TextLineReader(skip_header_lines=1) key, value = reader.read(filename_queue) decoded = tf.decode_csv(value, record_defaults=record_defaults)#字符串(文本行)转换到指定默认值张量列元组,为每列设置数据类型 return tf.train.shuffle_batch(decoded, batch_size=batch_size, capacity=batch_size * 50, min_after_dequeue=batch_size)#读取文件,加载张量 batch_size 行 def inputs():#读取或生成训练数据 X 及期望输出 Y print "function: inputs" #数据来源: https://www.kaggle.com/c/titanic/data #模型依据乘客年龄、性别、船票等级推断是否能够幸存 passenger_id, survived, pclass, name, sex, age, sibsp, parch, ticket, fare, cabin, embarked = \ read_csv(100, "train.csv", [[0.0], [0.0], [0], [""], [""], [0.0], [0.0], [0.0], [""], [0.0], [""], [""]]) #转换属性数据 is_first_class = tf.to_float(tf.equal(pclass, [1]))#一等票 is_second_class = tf.to_float(tf.equal(pclass, [2]))#二等票 is_third_class = tf.to_float(tf.equal(pclass, [3]))#三等票 gender = tf.to_float(tf.equal(sex, ["female"]))#性别,男性为 0,女性为 1 features = tf.transpose(tf.stack([is_first_class, is_second_class, is_third_class, gender, age]))#所有特征排列矩阵,矩阵转置,每行一样本,每列一特征 survived = tf.reshape(survived, [100, 1]) return features, survived def train(total_loss):#训练或调整模型参数(计算总损失) print "function: train" learning_rate = 0.01 return tf.train.GradientDescentOptimizer(learning_rate).minimize(total_loss) def evaluate(sess, X, Y):#评估训练模型 print "function: evaluate" predicted = tf.cast(inference(X) > 0.5, tf.float32)#样本输出大于 0.5 转换为正回答 print sess.run(tf.reduce_mean(tf.cast(tf.equal(predicted, Y), tf.float32)))#统计所有正确预测样本数,除以批次样本总数,得到正确预测百分比 #会话对象启动数据流图,搭建流程 with tf.Session() as sess: print "Session: start" tf.global_variables_initializer().run() X, Y = inputs() total_loss = loss(X, Y) train_op = train(total_loss) coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(sess=sess, coord=coord) training_steps = 1000#实际训练迭代次数 for step in range(training_steps):#实际训练闭环 sess.run([train_op]) if step % 10 == 0:#查看训练过程损失递减 print str(step)+ " loss: ", sess.run([total_loss]) print str(training_steps) + " final loss: ", sess.run([total_loss]) evaluate(sess, X, Y)#模型评估 import time time.sleep(5) coord.request_stop() coord.join(threads) sess.close() 

    参考资料: 《面向机器智能的 TensorFlow 实践》

    欢迎加我微信交流:qingxingfengzi

    我的微信公众号:qingxingfengzigz

    我老婆张幸清的微信公众号:qingqingfeifangz

    目前尚无回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2562 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 12:42 PVG 20:42 LAX 04:42 JFK 07:42
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86