Feed:
feed_dict={x:[[1,2],[3,4]],y:[[5],[6]]}
上面的feed_dict的作用是什么?在机器学习中,经常听别人说到要把数据给喂进去。怎么喂进去,这就要使用feed_dict={x:input_x,y:input_y}
把数据喂进去,喂进去的数据可以是矩阵,可以是数组,也可以是常数。
Fetch:
x_result,y_result=sess.run([x,y])
Fetch就是把…取出来,比如上面的一条代码,把x,y的数据取出来,分别赋给x_result,y_result,需要注意的一点是,x,y必须与赋值一一对应,fetch里面有几个元素,被赋值的必须有几个元素。如下图:
下面做一个简单的训练:
import tensorflow as tf
import cv2 as cv
import numpy as np
def image_define(a): #定义输入数据
image = np.zeros([28, 28], dtype=np.uint8)
cv.putText(image, str(a), (7, 21), cv.FONT_HERSHEY_PLAIN, 1.3, (255), 2, 8)
cv.imshow("image", image)
data = np.reshape(image, [1, 784])
return data / 255
def feed_fetch():
x = tf.placeholder(shape=[1, 784], dtype=tf.float32)
y = tf.placeholder(dtype=tf.float32) # 精确值
w = tf.Variable(tf.random_normal(shape=[784, 1]))
b = tf.Variable(tf.random_normal(shape=[1, 1]))
y_ = tf.add(tf.matmul(x, w),b) # 拟合的近似值
loss = tf.reduce_sum(tf.square(tf.subtract(y, y_))) # 总损失值,tf.reduce_sum用来求和,tf.square平方函数
learn = tf.train.GradientDescentOptimizer(0.01) # 学习率,梯度下降
step = learn.minimize(loss) # 梯度下降一次加1,一般用于记录迭代优化的次数,主要用于参数输出和保存
x_input=image_define(4)
init = tf.global_variables_initializer() # 初始化
with tf.Session() as sess:
sess.run(init)
for i in range(100): # 训练迭代100次
y_result, curr_loss, curr_step = sess.run(fetches=[y_, loss, step], feed_dict={x: x_input, y: 4}) #fetch取数据,feed喂数据
print("y: %f, y_ : %f, loss : %f" % (4,y_result, curr_loss))
curr_w,curr_b=sess.run([w,b],feed_dict={x:x_input,y:4}) # w值,b值
print("curr_w:\n",curr_w)
print("curr_b:\n",curr_b)
if __name__ =="__main__":
feed_fetch()
运行结果:
可以看到,训练的数据越来越接近4,损失值越来越低,其实到后面就变成0了,如下:
最终的估计值在4.0上下徘徊。