-
主要内容
搭建第一个简单的神经网络(已具备相应的神经网络基础知识),放上视频地址莫烦TensorFlow教程学习(5)——建造神经网络 -
遇到的问题
输入输出的大小问题,莫烦建造的是输入层为1,隐藏层10个,输出层一个的简单神经网络,其中代码中有这样一句话
x_data = np.linspace(-1,1,300,dtype=np.float32)[:,np.newaxis]
这是准备的x数据,一直不知道这个300是什么,后来发现300是对应的样本数量,这句话首先生成一个有300个元素的一维数组,再通过[:,np.newaxis]转换成1列300行的矩阵形式(列向量),输入层神经元个数=列数=每行元素个数=1,样本数量=列数=300。每次循环样本数量都是300个。关于[:,np.newaxis]的用法感谢博客:,np.newaxis用法介绍。可能剩下的疑惑就是placeholder了。但是关于placeholder多见几次代码可能就会更有感觉。 -
代码及注释
#莫烦TensorFlow视频教程
#def add_layer 添加层 2018.10.10,2018.10.12
import tensorflow as tf
import numpy as np
#定义一个添加层函数 in_size:输入大小 out_size:输出大小 激励函数默认为none(即线性)
# Wx_plus_b(w*x+b)
def add_layer(inputs, in_size, out_size, activation_function=None):
#对于权重weights:in_size是行数,outsize是列数
Weights = tf.Variable(tf.random_normal([in_size,out_size]))
#对于偏置项biases:1是行数,outsize是列数,初始值为0.1
biases = tf.Variable(tf.zeros([1,out_size])+0.1)
#注意:multiply不是矩阵乘法,只是单纯的元素相乘,mutmul是矩阵乘法
Wx_plus_b = tf.matmul(inputs,Weights)+biases
if activation_function is None:
outputs = Wx_plus_b
else:
outputs = activation_function(Wx_plus_b)
return outputs
# 创建数据
# x在-1到1,300个,newaxis解释很清楚(https://blog.csdn.net/molu_chase/article/details/78619731)
# 将一个有300个元素的一维数组转换成1列300行的矩阵形式(列向量)
# 样本大小300个
x_data = np.linspace(-1,1,300,dtype=np.float32)[:,np.newaxis]
# 噪点方差0.05,和x_data一样的格式
noise = np.random.normal(0,0.05,x_data.shape).astype(np.float32)
# y=x^2-0.5+噪点(更像真实值)
y_data = np.square(x_data)-0.5+noise
#利用占位符定义我们所需的神经网络的输入
#None代表无论输入有多少都可以,因为输出只有一个特征,所以这里是1
xs = tf.placeholder(tf.float32,[None,1])
ys = tf.placeholder(tf.float32,[None,1])
#建网络 输入层:1 隐藏层:10 输出层:1
l1 = add_layer(xs,1,10,activation_function=tf.nn.relu)
prediction = add_layer(l1,10,1,activation_function=None)
#损失函数(求和再求平均)
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction),
reduction_indices=[1]))
#学习速率0.1 来减小loss
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
#初始化
#init = tf.initialize_all_variables()已经被替换
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
#执行1000次,每50次输出loss
for i in range(1000):
#当运算要用到placeholder时,就需要feed_dict这个字典来指定输入
sess.run(train_step,feed_dict={xs:x_data,ys:y_data})
if i % 50 == 0:
print(sess.run(loss,feed_dict={xs:x_data,ys:y_data}))
- 运行结果
这里有人会有疑惑说为什么每一个结果不一样,因为你扔进去的数据都不同啊,加的噪声是随机的哈~数据变了训练出来的结果就会有差异。