神经网络input是140个样本 1296维度的特征值,label前60是[1.0, 0.0] 后面是[0.0, 1.0],想来实现二分类,可是我用softmax交叉熵+L2正则化,训练出来的output全是一个相同的1*2矩阵。
有没有大神可以看出来错在哪里 T_T
xs = tf.placeholder(tf.float32,shape=(None, 36*36))
ys = tf.placeholder(tf.float32,shape=(None,2))
layer1_node = 150 # 第一层隐含层神经元个数
# first layer inference
L1_Weights = tf.Variable(tf.random_normal([36*36,layer1_node], stddev=0.1, seed=1))
L1_biases = tf.Variable(tf.zeros([1,layer1_node]) + 0.1)
L1_out = tf.matmul(xs, L1_Weights) + L1_biases
L1_out = tf.nn.relu(L1_out)
# second layer inference
L2_Weights = tf.Variable(tf.random_normal([layer1_node,2], stddev=0.1, seed=1))
L2_biases = tf.Variable(tf.zeros([1,2]) + 0.1)
out = tf.matmul(L1_out, L2_Weights) + L2_biases
# cross entropy
out_pro = tf.nn.log_softmax(out)
cross_entropy = -tf.reduce_sum(ys*out_pro)
cross_entropy_mean = tf.reduce_mean(cross_entropy)
# regularization
regularizer = tf.contrib.layers.l2_regularizer(0.1)
regularization = regularizer(L1_Weights) + regularizer(L2_Weights)
# loss
loss = cross_entropy_mean + regularization
# backward
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss) # 基础梯度下降法
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for i in range(20000):
sess.run(train_step,feed_dict={xs:recon_imgs,ys:label})
if i % 50 == 0:
print(sess.run(loss,feed_dict={xs:recon_imgs,ys:label}))
print(sess.run(out,feed_dict={xs:recon_imgs,ys:label}))
output:[[-0.09252657 0.29252994],…… 全是一样的。。
梯度下降试着用过动量法,但是不收敛。。
3个回答
试试调一调learning rate吧,然后你只用一层的结构试试看,debug一下
SofaSofa数据科学社区DS面试题库 DS面经
好的! 我先试试! 谢谢!!
-
mmmm_PNU
2018-12-07 12:47
虽然还没找到错误出在哪,但是先记录下:
1. 把隐含层去掉后,即只有输入层和输出层,output能看的出来有分类,错误可能是出在了hidden_layer上,但是还没有找出来到底在哪。
2. 正则化0.1太小了 可能找不到最优 我调成0.8之后就对了
SofaSofa数据科学社区DS面试题库 DS面经有可能是l2_regularizer的参数太大了,Loss主要由regularization控制。因为你第一层的L1_weights个数36*36*150远大于L2_weights个数150*2,去掉L1后regularization急剧下降,LOSS由cross entropy控制。
你最好把两种配置的cross entropy和regularization都显示出来。
SofaSofa数据科学社区DS面试题库 DS面经
好的! 谢谢~
-
mmmm_PNU
2018-12-12 19:23