前提:使用编程环境为PythonIDE,系统为Windows10。
问题:输入变量为X为含有3特征的数据,例如X=[1,2,3],输出量同为3特征的数据,例如y=[4,5,6],关系为Y=AX,满足矩阵乘法,A为3*3矩阵。目标是应用TensorFlow求出A的参数。为方便起见,假设现有10个X的数据,则X=[]为3行10列矩阵,根据Y=AX,Y也为3行10列矩阵。
第一步:制造数据
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
#制造数据
x_data=10*np.random.random((3,10)).astype(np.float32) #x为3行10列矩阵,数据类型为float32
A=np.matrix([[1,2,1],
[2,1,1],
[1,1,3]])
y_data=A*x_data
#np.save('3dim_y_data',y_data)
#np.save('3dim_x_data',x_data)
x_data=np.load('3dim_x_data.npy')
y_data=np.load('3dim_y_data.npy').astype(np.float32)
print('x_data = :',x_data)
print('A = :',A)
print('y_data = :',y_data)
程序运行结果:
可以看到y_data与x_data满足y_data=A*x_data的关系。
第二步:搞。
Weights = tf.Variable(tf.random_uniform([3,3])) #要训练的矩阵参数,初始为3*3随机矩阵
y=tf.matmul(Weights,x_data)
#y=Weights*x_data
loss = tf.reduce_mean(tf.square(y-y_data)) #与期望的差值
optimizer = tf.train.GradientDescentOptimizer(0.001) #优化器,
train = optimizer.minimize(loss) #减少误差
init = tf.global_variables_initializer() #初始化变量important
## create tensorflow structure end#
sess = tf.Session()
sess.run(init) #激活 important
for step in range(5001):
sess.run(train)
if step%100==0:
print('step = :',step,'loss = :',sess.run(loss))
w=sess.run(Weights)
print('we get A = :\n',w)
结果如下:
step = : 0 loss is : 242.11034
step = : 100 loss is : 3.4686103
step = : 200 loss is : 1.8073219
step = : 300 loss is : 1.0072047
step = : 400 loss is : 0.588069
step = : 500 loss is : 0.35357958
step = : 600 loss is : 0.21632071
step = : 700 loss is : 0.1336665
step = : 800 loss is : 0.08305356
step = : 900 loss is : 0.05176353
step = : 1000 loss is : 0.03231613
step = : 1100 loss is : 0.020193871
step = : 1200 loss is : 0.012625264
step = : 1300 loss is : 0.0078954445
step = : 1400 loss is : 0.0049382765
step = : 1500 loss is : 0.0030888512
step = : 1600 loss is : 0.0019322013
step = : 1700 loss is : 0.0012087018
step = : 1800 loss is : 0.00075607677
step = : 1900 loss is : 0.00047296527
step = : 2000 loss is : 0.00029587856
step = : 2100 loss is : 0.0001850925
step = : 2200 loss is : 0.00011579284
step = : 2300 loss is : 7.244545e-05
step = : 2400 loss is : 4.5319197e-05
step = : 2500 loss is : 2.8358334e-05
step = : 2600 loss is : 1.775048e-05
step = : 2700 loss is : 1.11127865e-05
step = : 2800 loss is : 6.9564417e-06
step = : 2900 loss is : 4.3645496e-06
step = : 3000 loss is : 2.7341548e-06
step = : 3100 loss is : 1.7189167e-06
step = : 3200 loss is : 1.0795205e-06
step = : 3300 loss is : 6.8306935e-07
step = : 3400 loss is : 4.3196005e-07
step = : 3500 loss is : 2.7391667e-07
step = : 3600 loss is : 1.7285602e-07
step = : 3700 loss is : 1.1208443e-07
step = : 3800 loss is : 6.8706385e-08
step = : 3900 loss is : 4.51934e-08
step = : 4000 loss is : 3.056169e-08
step = : 4100 loss is : 1.9121822e-08
step = : 4200 loss is : 1.0809405e-08
step = : 4300 loss is : 7.4446387e-09
step = : 4400 loss is : 7.010385e-09
step = : 4500 loss is : 7.010385e-09
step = : 4600 loss is : 7.010385e-09
step = : 4700 loss is : 7.010385e-09
step = : 4800 loss is : 7.010385e-09
step = : 4900 loss is : 7.010385e-09
step = : 5000 loss is : 7.010385e-09
we get A = :
[[0.99998754 1.9999862 1.0000278 ]
[1.9999815 0.99998957 1.0000292 ]
[1.0000262 1.0000209 2.9999506 ]]
最后得到了训练得到的矩阵近似等于A。
要注意的是模型的建立要用y=tf.matmul(Weights,x_data)而不能使用y=Weights*x_data。否则会报错。y_data要特别控制type为float32,否则他的默认形式是float64,后面会格式报错。