Tensorflow搭建第一个神经网络

版权声明:站在巨人的肩膀上学习。 https://blog.csdn.net/zgcr654321/article/details/82916700

tensorflow的log日志显示级别设置:

import os
os.environ["TF_CPP_MIN_LOG_LEVEL"]='1' # 这是默认的显示等级,显示所有信息
os.environ["TF_CPP_MIN_LOG_LEVEL"]='2' # 只显示 warning 和 Error 
os.environ["TF_CPP_MIN_LOG_LEVEL"]='3' # 只显示 Error  

如果使用tensorflow-gpu环境,我们最好设置要使用哪块GPU:

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"
# 只使用第0块GPU,编号是从0开始的,或者同时使用多块GPU,如"0"改为"0,1,2"

搭建神经网络的步骤:

神经网络一般分为输入层、隐藏层、输出层,首先要定义一个添加隐藏层的函数;

设置初始值x_data和y_data;

定义隐藏层,并先创建placeholder类型的xs和ys变量,给隐藏层和loss使用;

定义输出层;

定义loss和训练函数,这里我们使用了梯度下降法训练,并以loss值减小为指标训练;

定义初始化变量函数init;

创建一个用于管理神经网络运行的会话sess;

用sess.run先执行init函数,再循环执行1000次train_step函数(相当于训练了1000次),train_step使用了xs和ys为输入值;

每训练50次我们打印一下loss的结果,可以看出loss值在逐渐变小,说明神经网络的训练是成功的。

代码:

import tensorflow as tf
import numpy as np
import os

# os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
# 想要不出现红字提示,则需要上面这一句

# os.environ["TF_CPP_MIN_LOG_LEVEL"]='1'这是默认的显示等级,显示所有信息
# os.environ["TF_CPP_MIN_LOG_LEVEL"]='2'只显示 warning 和 Error
# os.environ["TF_CPP_MIN_LOG_LEVEL"]='3'只显示 Error

# os.environ["CUDA_VISIBLE_DEVICES"] = "0"
# 指定使用的GPU的编号,从0开始,如果使用tensorflow-gpu环境编译则需要上面这句


# 设置使用的GPU编号

# 定义一个添加层的函数
def add_layer(inputs, in_size, out_size, activation_function=None):
	Weights = tf.Variable(tf.random_normal([in_size, out_size]))
	# 生成in_size行out_size列的矩阵,矩阵元素Weight全部为随机数
	biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)
	# biases是一行out_size列矩阵,+0.1是因为在机器学习中biases初始值不推荐为0,biases值全部为0.1
	Wx_plus_b = tf.matmul(inputs, Weights) + biases
	# inputs和Weights做矩阵乘法
	if activation_function is None:
		outputs = Wx_plus_b
	# activation_function is None时没有激励函数,是线性关系
	else:
		outputs = activation_function(Wx_plus_b)
	# activation_function不为None时,得到的Wx_plus_b再传入activation_function再处理一下
	return outputs


x_data = np.linspace(-1, 1, 300)[:, np.newaxis]
# linspace(-1,1,300)表示数据在-1到1区间有300个数的等差数列,然后增加一个维度
noise = np.random.normal(0, 0.05, x_data.shape)
# 添加噪点,使得数据看起来更像真是数据,0表示main,方差0.05,格式是x_data。shape
y_data = np.square(x_data) - 0.5

# 给train_step输入数据,xs和ys使用placeholder使得输入的数据可变化
xs = tf.placeholder(tf.float32, [None, 1])
ys = tf.placeholder(tf.float32, [None, 1])
# None, 1指行不定,列为1

# 下面要创建一个输入层、一个隐藏层、一个输出层
# 隐藏层设置成10个神经元,输入层有规定,有多少个输入属性就有多少个神经元
# 比如x_data只有一个属性,所以输入层只有一个神经元
# y_data也只有一个属性,所以输出层也只有一个神经元

# 定义隐藏层
l1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu)
# 10表示我们给隐藏层设置10个神经元
# 激励函数用relu,这个神经网络实际上是在用10条线段拟合一个抛物线
# 定义输出层
prediction = add_layer(l1, 10, 1, activation_function=None)
# 定义loss
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction), reduction_indices=[1]))
# 对每个例子求方差,再求方差和后求平均值,reduction_indices=[1]表示按行求和
# 定义训练函数,使用梯度下降法训练,0.1是学习效率,通常小于1,minimize(loss)指要将loss减小
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
# 这里用批量梯度下降方法
# 定义初始化变量函数
init = tf.global_variables_initializer()
# 创建会话
sess = tf.Session()
# sess.run执行
sess.run(init)
for i in range(1000):
	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}))
# loss使用了ys变量,由于是placeholder类型,所以后面必须加上feed_dict={xs:x_data,ys:y_data}

运行结果如下(使用tensorflow-gpu环境):

2018-10-01 15:08:38.630253: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2
2018-10-01 15:08:38.882268: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1405] Found device 0 with properties: 
name: GeForce GTX 850M major: 5 minor: 0 memoryClockRate(GHz): 0.8625
pciBusID: 0000:01:00.0
totalMemory: 2.00GiB freeMemory: 1.89GiB
2018-10-01 15:08:38.883268: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1484] Adding visible gpu devices: 0
2018-10-01 15:08:40.088337: I tensorflow/core/common_runtime/gpu/gpu_device.cc:965] Device interconnect StreamExecutor with strength 1 edge matrix:
2018-10-01 15:08:40.088337: I tensorflow/core/common_runtime/gpu/gpu_device.cc:971]      0 
2018-10-01 15:08:40.088337: I tensorflow/core/common_runtime/gpu/gpu_device.cc:984] 0:   N 
2018-10-01 15:08:40.088337: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1097] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 1649 MB memory) -> physical GPU (device: 0, name: GeForce GTX 850M, pci bus id: 0000:01:00.0, compute capability: 5.0)
0.11096618
0.0064434353
0.0047680107
0.0038185227
0.0032078298
0.002782875
0.0024637873
0.0022129558
0.002004453
0.0018239499
0.0016663921
0.0015249904
0.0013992107
0.0012862246
0.0011845357
0.0010945582
0.0010145138
0.00094323757
0.0008806479
0.0008256799

Process finished with exit code 0

猜你喜欢

转载自blog.csdn.net/zgcr654321/article/details/82916700