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