Tensorflow学习-day4

实现一个通过集合就算一个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

你可能感兴趣的:(tensorflow)