Tensorflow 回归与分类

Tensorflow 回归与分类

1.1 Tensorflow是什么?

Tensorflow是谷歌公司推出的开源深度学习框架,利用它我们可以快速搭建深度学习模型。

1.2 Tensorflow是什么样的框架?

Tensorflow跟很多机器学习库类似,采用了“流图”方式,这样做的好处可以减小计算开销。一般情况下,python的数值计算库会将矩阵乘法之类的复杂计算传送到外部外部语言计算(更高效的语言c,汇编等),但是每次计算转换回来的操作依然是很大的开销。所以“流图”方式采用,先用图和流来描述模型,再将整个模型一起送出去计算,计算完再送回来,这样减少了转换次数以减少开销。

1.3 Tensorflow怎么用?

Tensorflow内部集成了很多的神经网络的反向传播算法,以及其优化方式。只需要编程设置相应的参数即可选择适当的反向传播优化器。

它为我们解决了复杂的反向传播过程的实现,在构建模型时,我们只需要搭建正向的神经网络传输模型以及给出损失函数即可。

1.4 再具体一点?

在Tensorflow中操作的数据对象是tensor(包括常量和变量),由对象和操作OP就构成了图Graph, 将各个图的输入输出连接就形成的流图,至此模型的表示便完成了。在这个框架下表示和执行是分开的,因此,session会话便出场了,将表示放在session中就可以运行了。在运行中很可能要使用到变量,只有数据的更新,才能得到“活水流”,那么怎么在session中赋予新的数据或者获取新数据,使用 tf.placeholder() 创建占位符的op中可以使用 feed 赋值如:sess.run([output], feed_dict={input1:[7.], input2:[2.]}),可以使用 fetch来获取操作的返回值(可以是多个)如: result = sess.run([mul, intermed])。result是多个值。

对于损失函数的构建情况较多(常选择的有均方差,信息熵等),反向优化可以调用相应的操作即可(常选择梯度下降法),下面看一个完整的例子:

import tensorflow as tf

import numpy as np

#1, 数据准备

x_dat=np.float32(np.random.rand(2,100))

y_dat=np.dot([2.0,3.0],x_dat)+5.0

x = tf.placeholder(tf.float32)

y = tf.placeholder(tf.float32)

# 2,变量定义及模型构建

W=tf.Variable(tf.random_uniform([1,2],-0.1,0.1))

b=tf.Variable(tf.zeros([1]))

y_pre=tf.matmul(W,x)+b

# 3,构建损失函数及选择优化器

loss=tf.reduce_mean(tf.square(y_pre-y))

optim=tf.train.GradientDescentOptimizer(0.5)

train_op=optim.minimize(loss)

# 4,初始化变量启动会话,训练

init=tf.initialize_all_variables()

sess=tf.Session()

sess.run(init)

for step in range(1,200):

    sess.run([train_op],feed_dict={x:x_dat,y:y_dat })

    if step%20 ==0 :

        print(sess.run([W,b]))

session在运行之前需要构建整个图,除了sesion之外,还有一个可以在图运行中出入其他图的会话InteractiveSession。


1.5多元线性回归

下面是一个多元线性回归的例子,将模型构建函数抽抽离单独实现,在主程序中调用,可以使程序复用性更强。

敲黑板,划重点:

Tip1: out = tf.matmul( w,inputs) + b #注意matmul的参数顺序

Tip2: optmiz = tf.train.GradientDescentOptimizer(0.1) #不收敛需调整变化率,这里0.5不收敛,太小则训练太慢。

Tip3: train_op = optmiz.minimize(loss) #根据loss来确定改变变量的方向及数值

# 多元线性回归

import tensorflow as tf

import numpy as np

# 模型构建函数

def add_layer(inputs, insize, outsize, activation_fun=None):

    w = tf.Variable(tf.random_normal([outsize,insize]))

    b = tf.Variable(tf.zeros([outsize,1]))

    #print(inputs.shape)

    out = tf.matmul( w,inputs) + b #注意matmul的参数顺序

    if activation_fun is None:

        output = out

    else:

        output = activation_fun(out)

    print(output.shape)

    return output,w,b

# 1,数据准备

x_dat = np.float32(np.random.rand(5,200))

y_dat = np.dot([2.0, 3.0, 2.0,4.0,9.0],x_dat)+5.0

x = tf.placeholder(tf.float32)

y = tf.placeholder(tf.float32)

# 2,模型构建,变量定义

y_pre,w,b = add_layer(x, 5, 1, activation_fun=None)

# 3,构建损失函数及选择优化器

loss = tf.reduce_mean(tf.square(y-y_pre))

#loss = tf.reduce_mean(-tf.reduce_sum(y * tf.log(y_pre),reduction_indices=[1]))

optmiz = tf.train.GradientDescentOptimizer(0.1)  #不收敛需调整变化率,这里0.5不收敛,太小则训练太慢。

train_op = optmiz.minimize(loss) #根据loss来确定改变变量的方向及数值

# 4,启动会话,初始化变量,训练

init = tf.global_variables_initializer()

with tf.Session() as sess:

    sess.run(init)

    for step in range(2000):

        sess.run([train_op],feed_dict={x: x_dat, y: y_dat})

        if step % 200 == 0:

            print(sess.run([loss,w,b],feed_dict={x: x_dat, y: y_dat}))

结果如下:

1.6分类的例子:

# 分类

import tensorflow as tf

import numpy as np

import random

# AX=0 相当于matlab中 null(a','r')

def null(a, rtol=1e-5):

    u, s, v = np.linalg.svd(a)

    rank = (s > rtol * s[0]).sum()

    return rank, v[rank:].T.copy()

# 符号函数,之后要进行向量化

def sign(x):

    if x > 0:

        return 1

    elif x == 0:

        return 0

    elif x < 0:

        return -1

# noisy=False,那么就会生成N的dim维的线性可分数据X,标签为y

# noisy=True, 那么生成的数据是线性不可分的,标签为y

def mk_data(N, noisy=False):

    rang = [-1, 1]

    dim = 5

    X = np.random.rand(dim, N) * (rang[1] - rang[0]) + rang[0]

    while True:

        Xsample = np.concatenate((np.ones((1, dim)), np.random.rand(dim, dim) * (rang[1] - rang[0]) + rang[0]))

        k, w = null(Xsample.T)

        y = sign(np.dot(w.T, np.concatenate((np.ones((1, N)), X))))

        print(y[0][5])

        if np.all(y):

            break

    day=[]

    if noisy == True:

        idx = random.sample(range(1, N), N / 10)

        y[idx] = -y[idx]

    for st in range(200):

        if(y[0][st]==1):

            y1 = [1,0]

        else:

            y1 = [0,1]

        day.append(y1)

    da_x = np.float32(X.transpose())

    da_y = np.float32(day)

    return da_x, da_y, w

# 模型构建函数

def add_layer(insize, outsize, input, function = None):

    weight = tf.Variable(tf.random_normal([insize,outsize]))

    basize = tf.Variable(tf.zeros([outsize]))

    out = tf.matmul(input, weight) + basize

    if(function == None):

        output = out

    else:

        output = function(out)

    return output

# 1,数据准备

#产生的数据为随机数据,训练结果可能会不稳定

sign = np.vectorize(sign)

x_dat, y_dat, w = mk_data(200)

#x_dat = np.float32(np.random.rand(200,5)*5+10)

#y_dat = np.float32(np.zeros([200,2]))

# x_dat2 = np.float32(np.random.rand(200,5))

# y_dat2 = np.float32(np.zeros([200,2])+1)

x = tf.placeholder(tf.float32)

y = tf.placeholder(tf.float32)

print(x_dat.shape)

print(y_dat.shape)

# 2,模型构建,变量定义

y_pre = add_layer(5,2,x,tf.nn.softmax)

# 3,构建损失函数及选择优化器

loss = -tf.reduce_sum(y*tf.log(y_pre))

optim = tf.train.GradientDescentOptimizer(0.05)

train_op = optim.minimize(loss)

accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(y_pre),tf.argmax(y)),tf.float32))

# 4,启动会话,初始化变量,训练

init = tf.global_variables_initializer()

with tf.Session() as sess:

    sess.run(init)

    for step in range(2000):

        sess.run([train_op],feed_dict={x:x_dat,y:y_dat})

        if step % 100 == 0 :

            print(sess.run([loss,accuracy],feed_dict={x:x_dat,y:y_dat}))

            print(accuracy.eval(feed_dict={x:x_dat,y:y_dat}))


————————————————

版权声明:本文为CSDN博主「AI小白龙」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_34106574/article/details/94406204

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容