tensorflow解决xor问题及tensorflow与matlab交互

tenorflow解决xor问题和matlab神经网络工具箱解决xor问题,其反向传播过程有些不同。不知道不同在哪,但是通过测试发现,matlab神经网络工具箱可以用GD(梯度下降法)求解问题,但是tensorflow中,使用

tf.train.GradientDescentOptimizer的预测值与目标值极度不符。如同官网建议,还是使用tf.train.Adam系列进行反向传播权值更新比较好,使用这个其学习率调节也是个要注意的问题。比如xor,如果希望预测值精度高,学习率在0.06到0.12比较合适。调参还是很麻烦的。

以下代码是将tensorflow中的训练好的权值与偏置保存

# -*- coding: utf-8 -*-

import numpy as np
import tensorflow as tf
x_data=tf.placeholder("float",[None,2])
y_data=tf.placeholder("float",[None,1])
x=np.array([[0.,0.],[0.,1.],[1.,0.],[1.,1.]])
y=np.array([[0.],[1.],[1.],[0.]])
batch_size=1


y2=tf.Variable(tf.zeros([4,1]),name="y2")
weights1=tf.Variable(tf.random_normal([2,4],stddev=0.35),name="weights1")
biases1=tf.Variable(tf.zeros([4]),name="biases1")


weights2=tf.Variable(tf.random_normal([4,1],stddev=0.1),name="weights2")
biases2=tf.Variable(tf.zeros([1]),name="biases2")


y1=tf.nn.sigmoid(tf.matmul(x_data,weights1)+biases1)
y2=tf.nn.sigmoid(tf.matmul(y1,weights2)+biases2,name="y2")




loss=0.5*tf.reduce_mean((y_data-y2)**2)#MSE误差
optimizer=tf.train.AdamOptimizer(0.06)#建议使用AdamOptimizer或者Adam系列的,使用梯度下降有问题,无法得到正确结果
train=optimizer.minimize(loss)


init=tf.global_variables_initializer()


sess=tf.Session()
sess.run(init)
for step in range(0,1000):
    xs=x
    ys=y
    sess.run( train,feed_dict={x_data:xs,y_data:ys})
    print(sess.run(y2,feed_dict={x_data:xs}))
with sess.as_default():
    np.savetxt('net_IW.txt',np.transpose(weights1.eval()))
    np.savetxt('net_bI.txt',biases1.eval())
    np.savetxt('net_HLW.txt',np.transpose(weights2.eval()))

    np.savetxt('net_bH.txt',biases2.eval())

然后自己在Matlab中读入权值与偏置,还原神经网络拓扑结构,看看训练好的NN用的咋样:

需要将以下代码命名为readNet,放在同net_*.txt同一个文件夹中

startDir=fileparts(which('readNet'));
addpath(startDir);
str1=strcat(startDir,'\');
getfilename=dir(fullfile(str1,'*net*.txt'));
A=struct2cell(getfilename);
num=size(A);
 
for i=1:num(2)
    file_name=strcat(str1,getfilename(i).name);
    load(file_name);
end


inputs=[0 0 1 1;0 1 0 1];
[m,n]=size(inputs);
targets=[0 1 1 0];
y=zeros(4,1);
y1=zeros(4,1);

for co=1:4
    y1=1./(1+exp(-(net_IW*inputs(:,co)+net_bI)));
    y2=1./(1+exp(-(net_HLW*y1+net_bH)));
    y(co)=y2;
end

w1=net_IW;
b1=net_bI;
w2=net_HLW;
b2=net_bH;
%end

    

结果显示,训练好的NN拟合效果不错

你可能感兴趣的:(toolbox)