theano学习之正则化

先上代码:

from __future__ import print_function
import theano
from sklearn.datasets import load_boston#波士顿房价数据
import theano.tensor as T
import numpy as np
import matplotlib.pyplot as plt

#定义类层,套神经网络
class Layer(object):
    def __init__(self, inputs, in_size, out_size, activation_function=None):
        self.W = theano.shared(np.random.normal(0, 1, (in_size, out_size)))
        self.b = theano.shared(np.zeros((out_size, )) + 0.1)
        self.Wx_plus_b = T.dot(inputs, self.W) + self.b
        self.activation_function = activation_function
        if activation_function is None:
            self.outputs = self.Wx_plus_b
        else:
            self.outputs = self.activation_function(self.Wx_plus_b)

#对x各个特征标准化处理
def minmax_normalization(data):
    xs_max = np.max(data, axis=0)
    xs_min = np.min(data, axis=0)
    xs = (1 - 0) * (data - xs_min) / (xs_max - xs_min) + 0
    return xs

#载入数据
np.random.seed(100)
x_data = load_boston().data
# minmax normalization, rescale the inputs
x_data = minmax_normalization(x_data)
y_data = load_boston().target[:, np.newaxis]#[:,np.newaxis]的意思是有列表结构变为矩阵形式
print(x_data)
print(y_data)

#把数据集分为训练集,测试集,交叉验证,检验模型是否学习好了,也可以用来筛选合适参数
x_train, y_train = x_data[:400], y_data[:400]
x_test, y_test = x_data[400:], y_data[400:]

x = T.dmatrix("x")#如果这一步中的x里面没被喂值,涉及到x的代码都是空的,因为没数据去跑
y = T.dmatrix("y")#如果这一步中的x里面没被喂值,涉及到x的代码都是空的,因为没数据去跑

#建立模型
l1 = Layer(x, 13, 50, T.tanh)
l2 = Layer(l1.outputs, 50, 1, None)

#代价的计算
cost = T.mean(T.square(l2.outputs - y))      #不加正则化的代价函数
# cost = T.mean(T.square(l2.outputs - y)) + 0.1 * ((l1.W ** 2).sum() + (l2.W ** 2).sum())  # with l2 regularization
# cost = T.mean(T.square(l2.outputs - y)) + 0.1 * (abs(l1.W).sum() + abs(l2.W).sum())  # with l1 regularization
gW1, gb1, gW2, gb2 = T.grad(cost, [l1.W, l1.b, l2.W, l2.b])

learning_rate = 0.01
train = theano.function(
    inputs=[x, y],
    updates=[(l1.W, l1.W - learning_rate * gW1),
             (l1.b, l1.b - learning_rate * gb1),
             (l2.W, l2.W - learning_rate * gW2),
             (l2.b, l2.b - learning_rate * gb2)])

compute_cost = theano.function(inputs=[x, y], outputs=cost)

#各种数据存储
train_err_list = []
test_err_list = []
learning_time = []
for i in range(100):
    train(x_train, y_train)#把数据喂到网络中去训练
    if i % 10 == 0:
        # record cost
        train_err_list.append(compute_cost(x_train, y_train))#用训练数据计算代价,一旦执行这个代码,x和y中就有值了
        test_err_list.append(compute_cost(x_test, y_test))#用训练数据计算代价,一旦执行这个代码,x和y中就有值了
        learning_time.append(i)

#画出代价
plt.plot(learning_time, train_err_list, 'r-')
plt.plot(learning_time, test_err_list, 'b--')
plt.show()

结果:

以上代码用波士顿房价作为数据,实现正则化。

来源

猜你喜欢

转载自blog.csdn.net/weixin_40849273/article/details/84633994