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拟合效果不错