完全连接的网络不使用张量流收敛

时间:2016-11-18 23:10:38

标签: python neural-network tensorflow

我正在从头开始将一个旧的玩具项目迁移到numpy到tensorflow。 但是,我可以看到tensorflow实现没有收敛。

我一整天都在努力,但我找不到解决方案。 它是MLP的两个隐藏层。 这是我的张量流实现:

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from util import LoadData,DisplayPlot

def affine_layer(x,w,b):
    return tf.matmul(x,w)+b
def relu(x):
    return tf.nn.relu(x)

inputs_train, _, _, target_train, _, \
    _ = LoadData('faces.npz')


input_size=2304
hiddenunits=[16,32]
outputsize=7

#Weights
W1=0.1*tf.Variable(tf.random_normal([input_size,hiddenunits[0]]))
b1=tf.Variable(tf.zeros([hiddenunits[0]]))

W2=0.1*tf.Variable(tf.random_normal([hiddenunits[0],hiddenunits[1]]))
b2=tf.Variable(tf.zeros([hiddenunits[1]]))

W3=0.01*tf.Variable(tf.random_normal([hiddenunits[1],outputsize]))
b3=tf.Variable(tf.zeros([outputsize]))


x=tf.placeholder(tf.float32,[None,input_size])
t=tf.placeholder(tf.float32,[None,outputsize])

#Two fully connected layer with relu non-linearities
l1r=relu(affine_layer(x,W1,b1))
l2r=relu(affine_layer(l1r,W2,b2))
y=affine_layer(l2r,W3,b3)

ce=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y,t))
optimize=tf.train.MomentumOptimizer(learning_rate=0.01,momentum=0.9).minimize(ce)


model=tf.initialize_all_variables()
batch_size=100
num_epochs=30

steps=inputs_train.shape[0]/batch_size

n=inputs_train.shape[0]
rnd_idx=np.arange(n)

print "Num steps :%i"%steps
print "Batch size:%i"%batch_size
print "Training examples :%i"%n
#-----
train_ce_list=[]
with tf.Session() as sess:
    sess.run(model)
    for epoch in range(num_epochs):
        np.random.shuffle(rnd_idx)
        inputs_train=inputs_train[rnd_idx]
        target_train=target_train[rnd_idx]
        for i in range(steps):
            start=i*batch_size
            end=min(n,(i+1)*batch_size)
            xb=inputs_train[start:end]
            tb=target_train[start:end]
            train_ce,_= sess.run([ce,optimize],{x:xb,t:tb})
            train_ce_list.append((epoch, train_ce))
            print "Epoch %i Step %i CE:%.2f"%(epoch,i,train_ce)

在运行此代码几个时代后,我得到的最好的是:

Epoch 20 Step 0 CE:1.85
Epoch 20 Step 1 CE:1.83
Epoch 20 Step 2 CE:1.78
Epoch 20 Step 3 CE:1.90

但是,如果我使用相同的超参数运行我的旧实现(纯numpy)并使用具有动量的SGD:

Epoch  20 Step  0 CE 0.97498
Epoch  20 Step  1 CE 0.85173
Epoch  20 Step  2 CE 0.91749 
Epoch  20 Step  3 CE 1.06517 

我们可以看出差异非常明显。

任何人都可以帮我理解发生了什么事吗? 我错过了吗?

0 个答案:

没有答案
相关问题