Tensorflow学习之逻辑回归的实现

本文介绍了Tensorflow实现逻辑回归时遇到的过拟合问题,通过引入正则化来解决。详细讲解了L1和L2正则化的区别,并展示了如何在Tensorflow中创建和应用正则化方法,包括`l1_regularizer`、`l2_regularizer`和`sum_regularizer`。同时还探讨了ReLU、Leaky ReLU、sigmoid和tanh等激活函数的作用。

代码:

# coding:utf-8
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np

data=[]
label=[]
np.random.seed(0)

##随机产生训练集
for i in range(150):
    x1=np.random.uniform(-1,1)
    x2=np.random.uniform(0,2)
    if x1**2+ x2**2<=1:
        data.append([np.random.normal(x1,0.1),np.random.normal(x2,0.1)])
        label.append(0)
    else:
        data.append([np.random.normal(x1,0.1),np.random.normal(x2,0.1)])
        label.append(1)
# -1就是让系统根据元素数和已知行或列推算出剩下的列或者行,-1就是模糊控制,(-1,2)
# 就是固定两列,行不知道
data=np.hstack(data).reshape(-1,2)
label=np.hstack(label).reshape(-1,1)
plt.scatter(data[ : ,0], data[ :, 1], c=label, cmap="RdBu", vmin=-.2, vmax=1.2, edgecolor="white")
plt.show()

#知识点:
#tf.add_to_collection:把变量放入一个集合,把很多变量变成一个列表

#tf.get_collection:从一个结合中取出全部变量,是一个列表

#tf.add_n:把一个列表的东西都依次加起来

def get_weight(shape,lambda1):
    var=tf.Variable(tf.random_normal(shape),dtype=tf.float32)
    tf.add_to_collection('losses',tf.contrib.layers.l2_regularizer(lambda1)(var))
    return var

x=tf.placeholder(tf.float32,shape=(None,2))
y_=tf.placeholder(tf.float32,shape=(None,1))

sample_size=len(data)

#定义的神经结构每一层的节点个数
layer_dimension=[2,10,5,3,1]
n_layers=len(layer_dimension)

cur_layer=x

#输入层
in_dimension=layer_dimension[0]

#向前遍历
for i in range(1,n_layers):
    out_dimension=layer_dimension[i]
    weight=get_weight([in_dimension,out_dimension],0.03)
    bias=tf.Variable(tf.constant(0.1,shape=[out_dimension]))
    ##tf.nn.elu是激活函数
    cur_layer=tf.nn.elu(tf.matmul(cur_layer,weight)+bias)
    in_dimension=layer_dimension[i]

y=cur_layer

mse_loss=tf.reduce_sum(tf.pow(y_-y,2))/sample_size
tf.add_to_collection('losses',mse_loss)
loss=tf.add_n(tf.get_collection('losses'))

train_op=tf.train.AdamOptimizer(0.001).minimize(mse_loss)
TRAINING_STEPS=40000

with tf.Session() as sess:
    tf.initialize_all_variables().run()
    for i in range(TRAINING_STEPS):
        sess.run(train_op,feed_dict={x:data,y_:label})
        if(i%2000)==0:
            print("After %d steps, mse_loss:%f" % (i,sess.run(mse_loss,feed_dict={x:data,y_:label})))
    #画出训练后的分割函数
    #mgrid函数产生两个240×241的数组:-1.2到1.2每隔0.01取一个数共240个
    xx,yy= np.mgrid[-1.2:1.2:.01,-0.2:2.2:.01]
    ##np.c_应该是合并两个数组
    grid=np.c_[xx.ravel(),yy.ravel()]
    probs=sess.run(y,feed_dict={x:grid})
    probs=probs.reshape(xx.shape)

plt.scatter(data[:,0],data[:,1],c=label,cmap="RdBu",vmin=-.2,vmax=1.2,edgecolors="white")
plt.contour(xx,yy,probs,levels=[.5],cmap="Greys",vmin=0,vmax=.1)
plt.show()

"""
#带正则化参数训练
 train_op=tf.train.AdamOptimizer(0.001).minimize(loss)
TRAINING_STEPS=40000
with tf.Session() as sess:
    tf.initialize_all_variables().run()
    for i in range(TRAINING_STEPS):
        sess.run(train_op,feed_dict={x:data,y_:label})
        if i%2000==0:
            print("After %d steps, mse_loss:%f"(i, sess.run(loss, feed_dict={x: data, y_: label})))
    xx, yy = np.mgrid[-1.2:1.2:.01, -0.2:2.2:.01]
    grid = np.c_[xx.ravel(), yy.ravel()]
    probs = sess.run(y, feed_dict={x: grid})
    probs = probs.reshape(xx.shape)

plt.scatter(data[:,0],data[:,1],c=label,cmap="RdBu",vmin=-.2,vmax=1.2,edgecolors="white")
plt.contour(xx,yy,probs,levels=[.5],cmap="Greys",vmin=0,vmax=.1)
plt.show()
"""

结果:可视化数据:

这时我们可以看到出现里过拟合现象,这时候我们就需要用正则化来防止过拟合。。

正则化后结果:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值