Tensorflow学习笔记:正则化线性回归

本文通过一个具体的多项式回归实例介绍了如何使用正则化技术来防止模型过拟合。文中详细展示了利用Python及其相关库如NumPy、TensorFlow等进行数据集划分、模型构建与训练的过程,并对不同正则化参数下的模型性能进行了对比。
#coding:utf-8
'''
正则化
'''

import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt

# 按照比例分割测试和训练数据值
def split_dataset(x_dataset,y_dataset,ratio):
    x_arr = np.arange(x_dataset.size)
    y_arr = np.arange(y_dataset.size)
    np.random.shuffle(x_arr)
    np.random.shuffle(y_arr)

    x_num_train = int(ratio * x_dataset.size)
    y_num_train = int(ratio * y_dataset.size)

    x_train = x_dataset[x_arr[0:x_num_train]]
    y_train = y_dataset[y_arr[0:y_num_train]]
    x_test = x_dataset[x_arr[x_num_train:x_dataset.size]]
    y_test = y_dataset[y_arr[y_num_train:y_dataset.size]]

    return x_train,x_test,y_train,y_test

learning_rate = 0.001
training_epochs = 1000
reg_lambda = 0.0

x_dataset = np.linspace(-1,1,101)

# 多项式系数个数
num_coeffs = 9
y_dataset_params = [0.0] * num_coeffs
y_dataset_params[2] = 1
y_dataset = 0
for i in range(num_coeffs):
    y_dataset += y_dataset_params[i] * np.power(x_dataset,i)

y_dataset += np.random.randn(*x_dataset.shape) * 0.33

(x_train,x_test,y_train,y_test) = split_dataset(x_dataset,y_dataset,0.7)

X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)

def model(X,w):
    terms = []

    for i in range(num_coeffs):
        term = tf.multiply(w[i],tf.pow(X,i))
        terms.append(term)
    
    return tf.add_n(terms)

w = tf.Variable([0.] * num_coeffs,name='parameters',dtype=tf.float32)
y_model = model(X,w)

# 定义正则化损失函数
cost = tf.div(tf.add(tf.reduce_sum(tf.square(Y-y_model)),
        tf.multiply(reg_lambda, tf.reduce_sum(tf.square(w)))),
        2*x_train.size)

train_op = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

init_op = tf.global_variables_initializer()

sess = tf.Session()

sess.run(init_op)

for reg_lambda in np.linspace(0,1,100):
    for epoch in range(training_epochs):
        sess.run(train_op,feed_dict={X:x_train,Y:y_train})
    final_cost = sess.run(cost,feed_dict={X:x_test,Y:y_test})
    print('reg lambda:',reg_lambda)
    print('final cost:',final_cost)

sess.close()

 

转载于:https://my.oschina.net/wujux/blog/1801242

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值