实现一个通过集合就算一个4层全连神经网络带L2正则化损失函数:
import numpy as np
train_steps = 30000
data = []
label = []
#创建训练数据,data是feature,label是标签
for i in range(200):
#uniform(low=0.0, high=1.0, size=None)
#np.random.uniform函数 从一个均匀分布[low,high)中随机采样,注意定义域是左闭右开,即包含low,不包含high.
#没有size的话默认为1个并且类型是float,不为1的话是一个ndarray
x1 = np.random.uniform(-1,1)
x2 = np.random.uniform(0,2)
#确定类别,在圆内则为0,圆外则为1
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)
#数据转化为ndarray格式
data = np.hstack(data).reshape(-1,2)
label = np.hstack(label).reshape(-1,1)
#定义完成前向传播的隐藏层
def hidden_layer(input_tensor,weight1,bias1,weight2,bias2,weight3,bias3):
#三层前向传播隐藏层,使用Relu激活函数
layer1 = tf.nn.relu(tf.matmul(input_tensor,weight1)+bias1)
layer2 = tf.nn.relu(tf.matmul(layer1,weight2) + bias2)
layer3 = tf.matmul(layer2,weight3)+bias3
return layer3
#定义两个tf输入
x = tf.placeholder(tf.float32,shape=None,name='x-input')
y_ = tf.placeholder(tf.float32,name='y-input')
#定义三个权重和偏置
weight1 = tf.Variable(tf.truncated_normal([2,10],stddev=0.1))
bais1 = tf.Variable(tf.constant(0.1,shape=[10]))
weight2 = tf.Variable(tf.truncated_normal([10,10],stddev=0.1))
bais2 = tf.Variable(tf.constant(0.1,shape=[10]))
weight3 = tf.Variable(tf.truncated_normal([10,1],stddev=0.1))
bais3 = tf.Variable(tf.constant(0.1,shape=[1]))
#查看data的长度
sample_size = len(data)
#hidden_layer()函数计算Relu激活函数的三层前向传播网络
y = hidden_layer(x,weight1,bais1,weight2,bais2,weight3,bais3)
error_loss = tf.reduce_mean(tf.pow(y_-y,2))/sample_size
tf.add_to_collection('losses',error_loss)
#根据均方误差创建adagrad优化器对L2正则化损失函数进行优化
#L2正则化损失函数
regularizer = tf.contrib.layers.l2_regularizer(0.01)
#0.01指的是正则化项的权重
regularization = regularizer(weight1)+regularizer(weight2)+regularizer(weight3)
tf.add_to_collection('losses',regularization)
loss = tf.add_n(tf.get_collection('losses'))
train_op = tf.train.AdagradOptimizer(0.01).minimize(loss)
with tf.Session() as sess:
tf.global_variables_initializer().run()
for i in range(train_steps):
sess.run(train_op,feed_dict={
x:data,y_:label})
if i % 2000==0:
loss_value = sess.run(loss,feed_dict={
x:data,y_:label})
print('After %d steps, ,mse_loss: %f'%(i,loss_value))
该模型可以看作是一个模板,在以后的编程实践中,我们的思路基本上会以这个模板上展开
方法
tf.add_to_collection(key,value)
将一个数据放入add_to_collection()创建的名为key的列表中
tf.get_collection(key)
将上面add_to_collection()创建的名为key的列表中的数据拿出来
tf.add_n()
将两个数据(可以是矩阵)做加法,但必须是同样大小的size