最近被线上笔试题打击到了,决定重头开始学习神经网络,算是小白一个,这个是自己编写的第一个关于神经网络的python程序--关于“与”门的实现,实现 与或非 三种门都只需要输入层和输出层,不需要隐层,也就是说这三中门是线行可分的。
x1 | x2 | y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
编写思路:就是一个不带隐层的基本神经网络,把graph搭建后,feed data即可,虽然很简单,作为小白还是不是一次成功的,这里记一下自己出错的地方,在定义占位符时,一般tensorflow中常用的是tf.float32,tf.float64等数据类型,我定义没写错,但是feed的data却写为了int型,然后是定义的输入维度搞错。代码如下所示:
'''
用tensorflow实现与门(AND)
author_Qingmu
2019.10.01
'''
import tensorflow as tf
#创建数据
x_data=[[0.0,0.0],[0.0,1.0],[1.0,0.0],[1.0,1.0]] # input
y_data=[[0.0],[0.0],[0.0],[1.0]] # predict
we_num=2 #权重个数
step=1000 #训练次数
x=tf.placeholder(tf.float32,shape=[None,we_num])
y=tf.placeholder(tf.float32,shape=[None,1])
#构建神经网络结构
Weights=tf.Variable(tf.truncated_normal([we_num,1],-0.1,0.1))
b=tf.Variable(tf.truncated_normal([1],0.1))
output=tf.sigmoid(tf.matmul(x,Weights)+b) #采用sigmoid函数
loss=tf.reduce_mean(tf.square(output-y)) #采用均方误差作为损失函数
train=tf.train.GradientDescentOptimizer(0.5).minimize(loss)
#初始化
init=tf.global_variables_initializer()
#创建会话
sess=tf.Session()
sess.run(init)
print('开始训练...')
for s in range(step):
sess.run([train],feed_dict={x:x_data,y:y_data})
# if s % 20 ==0:
# print(sess.run(Weights))
print('训练结束,开始测试')
test_x=[[0.0,1.0],[0.0,0.0],[1.0,1.0],[1.0,0.0]]
print(sess.run(output,feed_dict={x:test_x}))
最终结果还是可以的,但是因为第一次写神经网络,总感觉很多问题不太清楚,比如我是不是可以不用激活函数sigmoid等等。
下面是一些参考的链接: