tensorflow自定义前馈神经网络

本文介绍了如何在TensorFlow中自定义前馈神经网络,包括使用One-Hot编码处理分类数据,设置权重和偏置值,以及实现自定义激活函数。讨论了过拟合和欠拟合的概念,并通过实例展示了如何避免这些问题。
摘要由CSDN通过智能技术生成

tensorflow自定义前馈神经网络

One-Hot

数据集:5000*13
前12列是数据,最后一列是标签

from sklearn.preprocessing import OneHotEncoder
labels=Train_Input[:,12:13]
enc = OneHotEncoder()#进行独热码处理
enc.fit(labels)
labels = enc.fit_transform(labels).toarray()

使用0和1来对标签进行转换,如果有5类,则用由0和1组合的5位数的组成。
10000,01000,00100,00010,00001
在这里插入图片描述
大部分算法是基于向量空间中的度量来进行计算的,为了使非偏序关系的变量取值不具有偏序性,并且到圆点是等距的。

使用热独编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。两个向量之间的距离都是根号2,在向量空间距离都相等,不会出现偏序性,基本不会影响基于向量空间度量算法的效果。

当类别的数量很多时,特征空间会变得非常大。在这种情况下,一般可以用PCA来减少维度。而且one hot encoding+PCA这种组合在实际中也非常有用

查看权重和偏置值

with tf.variable_scope("generate"):
    with tf.variable_scope("resnet_stack"):
        w_out = tf.Variable(tf.random_normal([12,5]),name="w_out")#第二层6000
        b_out = tf.Variable(tf.random_normal([5]),name="b_out")
getB1 = tf.get_default_graph().get_tensor_by_name("generate/resnet_stack/w_out:0")
getW1 = tf.get_default_graph().get_tensor_by_name("generate/resnet_stack/b_out:0")
with tf.Session() as sess:
    tf.global_variables_initializer().run()
    print(sess.run(getB1))
    print(sess.run(getW1))

设置权重和偏置值

w_out = tf.Variable(tf.ones([12,5]),trainable = True,name="w_out")
b_out = tf.Variable(tf.ones([12,5]),trainable = False,name="b_out")

自定义激活函数

以定义激活函数x^2为例

def square(x):
    return pow(x, 2)
#该激活函数的一阶导数
def square_grad(x):
    return 2 * x
square_np = np.vectorize(square)
square_grad_np = np.vectorize(square_grad)
square_np_32 = lambda x: square_np(x).astype(np.float32)
square_grad_np_32 = lambda x: square_grad_np(x).astype(np.float32)
#定义梯度函数
def square_grad_tf(x, name=None):
    with ops.name_scope(name, "square_grad_tf", [x]) as name:
        y = tf.py_func(square_grad_np_32, [x], [tf.float32], name=name, stateful=False)
        return y[0]
#定义函数
def my_py_func(func, inp, Tout, stateful=False, name=None, my_grad_func=None):
    # need to generate a unique name to avoid duplicates:
    random_name = "PyFuncGrad" + str(np.random.randint(0, 1E+8))
    tf.RegisterGradient(random_name)(my_grad_func)
    g = tf.get_default_graph()
    with g.gradient_override_map({"PyFunc": random_name, "PyFuncStateless": random_name}):
        return tf.py_func(func, inp, Tout, stateful=stateful, name=name)
#定义梯度,依赖上一个函数
def _square_grad(op, pred_grad):
    x = op.inputs[0]
    cur_grad = square_grad(x)
    next_grad = pred_grad * cur_grad
    return next_grad
def square_tf(x, name=None):
    with ops.name_scope(name, "square_tf", [x]) as name:
        y = my_py_func(square_np_32,
                       [x],
                       [tf.float32],
                       stateful=False,
                       name=name,
                       my_grad_func=_square_grad)
    return y[0]
# --------------------------------------验证自定义的激活函数-----------------------------------
def Test(X):
    return square_tf(X)

with tf.Session() as sess:
    x = tf.constant([2, 3, 4, 5])
    y = Test(x)
    tf.global_variables_initializer().run()
    print(y.eval())

过拟合、欠拟合

1、过拟合
2、欠拟合
Acc一直为0,loss越训练越大

参考博客

One Hot热独编码https://blog.csdn.net/weixin_40807247/article/details/82812206
自定义权重和偏置https://blog.csdn.net/cassiePython/article/details/79179044?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_baidulandingword-0&spm=1001.2101.3001.4242
自定义激活函数https://blog.csdn.net/caorui_nk/article/details/82898200

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值