本文为原创文章,转载请注明出处。
写文章是 定大纲是一个系列,内容从浅到深,主旨引发读者思考。更新周期一周一更。
废话少说,直接进入主题。
每个人入门机器学习都是简单的线性逻辑回归
在学完之后,我一直在想,能不能写一个让电脑学会算加法的神经网络系统。
对于一个神经网络而言,并不是神经层越多,能力越强。一个好的神经网络的特点是模型恰到好处。
以下是我简单构造的的神经网络。
数学公式:
x1*w+b1+ x2*w+b2=y
这样设计的好处是,快速出答案。而且符合 数学原理 1+1 =2
在理论上 只要 w =1 b= 0 就能100%正确得出答案。
如果你不服 ,那就用传统的模型设计吧
下面开始为大家排坑。
#生成模拟数据
train_X = np.random.rand(100)
train_X2 = np.random.rand(100)
train_Y = train_X2 + train_X
# 创建模型
# 占位符
inputdict = {
'x': tf.placeholder("float"),
'x2': tf.placeholder("float"),
'y': tf.placeholder("float")
}
我这里生成的是小数,目的是便于训练,如果你用 int 会遇到更多坑的。
例子训练的参数只有2个
这里,如何在sess.run添加一个输入呢。
这就得从原理出发。
例子中传递了一个optimizer,
这个optimizer 其实就是一个 方程式。
前面代码里用到了占位符。
类似
x+y=z
那么我们的公式只要套入
x = 1
y= 2
z = 3
就可以训练误差。所以 模型用到什么数据,feed_dict传递什么数据就行。
sess.run(optimizer, feed_dict={inputdict['x']: train_X[i], inputdict['x2']: train_X2[i],inputdict['y']: train_Y[i]})
还有一个新手很容易卡住的就是 如何编写测试函数。
下面是我的测试函数
ret是计算结果。
同样是 sess.run,参数也类似。
到底什么情况下是 训练什么情况下是 测试呢。
我们注意看第一个参数。
训练的时候 传递的是优化器!!!所以需要传递结果。
而测试传递的是前向结构
也就是我们的公式
w1*x1+b1+w2*x2+b2
所以直接传递 x1 x2 他就会帮我们运算出结果
# -*- coding: utf-8 -*-
"""
@author: 花开无痕
"""
import tensorflow as tf
import numpy as np
#生成模拟数据
train_X = np.random.rand(100)
train_X2 = np.random.rand(100)
train_Y = train_X2 + train_X
# 创建模型
# 占位符
inputdict = {
'x': tf.placeholder("float"),
'x2': tf.placeholder("float"),
'y': tf.placeholder("float")
}
# 模型参数
W = tf.Variable(tf.random_normal([1]), name="weight")
b = tf.Variable(tf.zeros([1]), name="bias")
W2 = tf.Variable(tf.random_normal([1]), name="weight2")
b2 = tf.Variable(tf.zeros([1]), name="bias2")
# 前向结构
z = tf.multiply(inputdict['x'], W)+ b+tf.multiply(inputdict['x2'], W2)+ b2
#反向优化
cost =tf.reduce_mean( tf.square(inputdict['y'] - z))
learning_rate = 0.01
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) #Gradient descent
# 初始化变量
init = tf.global_variables_initializer()
#参数设置
training_epochs = 200
display_step = 20
# 启动session
with tf.Session() as sess:
sess.run(init)
# Fit all training data
for epoch in range(training_epochs):
#for (x, y) in zip(train_X, train_Y):
for i in range(100):
sess.run(optimizer, feed_dict={inputdict['x']: train_X[i], inputdict['x2']: train_X2[i],inputdict['y']: train_Y[i]})
#显示训练中的详细信息
if epoch % display_step == 0:
loss = sess.run(cost, feed_dict={inputdict['x']: train_X[i],inputdict['x2']: train_X2[i], inputdict['y']:train_Y[i]})
print ("Epoch:", epoch+1, "cost=", loss,"W=", sess.run(W), "b=", 'w2',sess.run(b),sess.run(W2), "b=", sess.run(b2))
print (" Finished!")
print ("W=", sess.run(W), "b=", sess.run(b),"W2=", sess.run(W2), "b2=", sess.run(b2))
xxx = np.random.rand(100)
xxx2 = np.random.rand(100)
for i in range(len(xxx)):
ret = sess.run(z, feed_dict={inputdict['x']: xxx[i],inputdict['x2']: xxx2[i]})
print ( 'xxx',xxx[i],'xxx2',xxx2[i],'=',ret,xxx[i]+xxx2[i])
以下是我编写的源码