用TensorFlow写个简单的神经网络

电子说

1.2w人已加入

描述

这次就用TensorFlow写个神经网络,这个神经网络写的很简单,就三种层,输入层--隐藏层----输出层;

首先导入我们要使用的包

# -*- coding: utf-8 -*-import tensorflow as tfimport matplotlib.pyplot as pltimport  numpy as npimport matplotlibfrom sklearn import  datasetsfrom matplotlib.font_manager import FontProperties

然后在设定一下我们画图的时候要显示中文的字体,因为Python自带的不支持中文的解释

#设置中文font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14)zhfont1 = matplotlib.font_manager.FontProperties(fname=r'c:\windows\fonts\simsun.ttc')

定义一个会话,因为图是必须在会话中启动的

#定义一个图会话sess=tf.Session()

这里我选用公开的数据莺尾花的数据集,这个数据集虽然都被大家 玩烂了,不过这个是一个学习代码,就不计较那么多了;

#莺尾花数据集iris=datasets.load_iris()x_vals=np.array([x[0:3] for x in iris.data])y_vals=np.array([x[3] for x in iris.data])

这里设置一个随机种子,为了可以让大家把结果复现出来

#设置一个种子求结果seed=211tf.set_random_seed(seed)8np.random.seed(seed)

开始有模有样的划分数据集了,一个是训练集,一个是测试集,训练集占80%,测试集占20%

#划分测试机和训练集train_indices=np.random.choice(len(x_vals),round(len(x_vals)*0.8),replace=True)test_indices=np.array(list(set(range(len(x_vals)))-set(train_indices)))x_vals_train=x_vals[train_indices]x_vals_test = x_vals[test_indices]y_vals_train = y_vals[train_indices]y_vals_test = y_vals[test_indices]

在这里我们在将特征进行一个归一化,也就是将数值型特征全部都转换为0-1之间的数值,用特征最大距离作为分母;还有一些其他的标准化方法,有兴趣可以了解,这个好处就是能够让迭代更加快速,还有就是消除量纲,就是单位之间影响;

使用nan_to_num这个函数主要是为了消除None值带来的计算影响

#归一化函数def normalize_cols(m):    col_max = m.max(axis=0)    col_min = m.min(axis=0)    return (m - col_min) / (col_max - col_min)#数据归一化并转空集x_vals_train=np.nan_to_num(normalize_cols(x_vals_train))x_vals_test=np.nan_to_num(normalize_cols(x_vals_test))

好了,上面已经生成了我们想要的数据集;在这里我们在设置一次训练的数据集多大,一般是选择2^N倍数,因为是计算机是二进制存储,这样就快,这里我就随意选择了个25,因为数据集比较小,没什么影响

batch_size=25

在这里定义一下训练变量Y和X,顺便设置为浮点类型

x_data=tf.placeholder(shape=[None,3],dtype=tf.float32)y_target=tf.placeholder(shape=[None,1],dtype=tf.float32)

在这里我们设置一下隐藏层连接数

#设置隐藏层hidden_layer_nodes=5

开始定义各层的参数变量,因为输入变量是三个

#定义各层变量,初始变量为3个A1=tf.Variable(tf.random_normal(shape=[3,hidden_layer_nodes]))b1=tf.Variable(tf.random_normal(shape=[hidden_layer_nodes]))A2=tf.Variable(tf.random_normal(shape=[hidden_layer_nodes,1]))b2=tf.Variable(tf.random_normal(shape=[1]))

这里我们使用relu函数作为激活函数,以及输出结果也使用relu函数

#定义隐藏层的输出和输出层的输出hidden_output=tf.nn.relu(tf.add(tf.matmul(x_data,A1),b1))final_output = tf.nn.relu(tf.add(tf.matmul(hidden_output, A2),b2))

这里我们在定义一下损失函数,有用最大似然估计的,这里我们使用均方误差方式

loss=tf.reduce_mean(tf.square(y_target-final_output))

定义一下参数的更新方式和学习速率,这里我们使用梯度下降方法更新,下一次我们讲解用其他方式更新,和学习速率随着迭代次数减少,tfboys就是那么任性

#声明算法初始变量opt=tf.train.GradientDescentOptimizer(0.005)train_step=opt.minimize(loss)#变量进行初始化init=tf.initialize_all_variables()sess.run(init)

定义两个list,用来存放在训练中的测试集和训练集的误差

#训练过程loss_vec=[]test_loss=[]

开始迭代,这里我们设置迭代次数为5000

for i in range(5000):    #选取batch_size大小的数据集    rand_index=np.random.choice(len(x_vals_train),size=batch_size)    #选取出数据集    rand_x=x_vals_train[rand_index]    rand_y=np.transpose([y_vals_train[rand_index]])    #开始训练步骤    sess.run(train_step,feed_dict={x_data:rand_x,y_target:rand_y})    #保存损失结果    temp_loss=sess.run(loss,feed_dict={x_data:rand_x,y_target:rand_y})    #保存损失函数    loss_vec.append(np.sqrt(temp_loss))    test_temp_loss = sess.run(loss, feed_dict={x_data: x_vals_test, y_target: np.transpose([y_vals_test])})    test_loss.append(np.sqrt(test_temp_loss))    #打印损失函数,没五十次打印一次    if (i+1)%50==0:        print('Generation: ' + str(i + 1) + '. Train_Loss = ' + str(temp_loss)+ '. test_Loss = ' + str(test_temp_loss))

迭代最后结果为

tensorflow

接下来我们在看看误差随着迭代变化的趋势,下降的还不够快,这些代码其实还是很粗糙,太多地方需要优化了;下次在写个优化版本的

#画图plt.plot(loss_vec, '', label='训练 Loss')plt.plot(test_loss, 'r--', label='测试 Loss')plt.title('均方误差分布', fontproperties=font)plt.xlabel('迭代步数', fontproperties=font)plt.ylabel('Loss')plt.legend(prop=zhfont1)plt.show()

tensorflow

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分