1, 准备数据
把数据放进 txt 文件中(数据量大的话, 就写一段程序自己把数据自动的写入 txt 文件中, 任何语言都能实现), 数据之间用逗号隔开, 最后一列标注数据的标签(用于分类), 比如 0,1. 每一行表示一个训练样本. 如下图所示.
其中前三列表示数据 (特征), 最后一列表示数据(特征) 的标签. 注意: 标签需要从 0 开始编码!
2, 实现全连接网络
这个过程我就不多说了, 如何非常简单, 就是普通的代码实现, 本篇博客的重点在于使用自己的数据, 有些需要注意的地方我在后面会做注释. 直接上代码
- # 隐含层参数设置
- in_units=3 #输入神经元个数
- h1_units=5 #隐含层输出神经元个数
- #第二个隐含层神经元个数
- h2_units=6
- W1=tf.Variable(tf.truncated_normal([in_units,h1_units],stddev=0.1)) #隐含层权重, W 初始化为截断正态分布
- b1=tf.Variable(tf.zeros([h1_units])) #隐含层偏执设置为 0
- W2=tf.Variable(tf.truncated_normal([h1_units,h2_units],stddev=0.1)) #第二个隐含层权重, W 初始化为截断正态分布
- b2=tf.Variable(tf.zeros([h2_units])) #第二个隐含层偏执设置为 0
- W3=tf.Variable(tf.zeros([h2_units,2])) #输出层权重和偏执都设置为 0
- b3=tf.Variable(tf.zeros([2]))
- #定义输入变量 x 和 dropout 比率
- x=tf.placeholder(tf.float32,[None,3]) #列是
- keep_prob=tf.placeholder(tf.float32)
- #定义一个隐含层
- hidden1=tf.nn.relu(tf.matmul(x,W1)+b1)
- hidden1_drop=tf.nn.dropout(hidden1,keep_prob)
- #定义第二个隐藏层
- hidden2=tf.nn.relu(tf.matmul(hidden1_drop,W2)+b2)
- hidden2_drop=tf.nn.dropout(hidden2,keep_prob)
需要注意的地方
- in_units=3 #输入神经元个数, 和特征的维度对应起来
- x=tf.placeholder(tf.float32,[None,3]) #和特征的维度对应起来
3, 实现损失函数
标准的 softmax 和交叉熵, 不多说了.
- y=tf.nn.softmax(tf.matmul(hidden2_drop,W3)+b3)
- #定义损失函数和选择优化器
- y_=tf.placeholder(tf.float32,[None,2]) #列是 2, 表示两类, 行表示输入的训练样本个数, None 表示不定
- corss_entropy=tf.reduce_mean(-tf.reduce_sum(y_*tf.log(y),reduction_indices=[1]))
- train_step=tf.train.AdagradOptimizer(0.3).minimize(corss_entropy)
需要注意的地方:
y_=tf.placeholder(tf.float32,[None,2]) #有几类就写几, 我写的是两类, 所以就是 2
4, 从 txt 中读取数据, 并做处理
重点来了, 首先从 txt 中把数据读取出来, 然后对标签进行独热编码, 什么是独热编码? 索引表示类别, 是哪个类别这一维就是非零(用 1). 代码实现:
- data=np.loadtxt('txt.txt',dtype='float',delimiter=',')
- #将样本标签转换成独热编码
- def label_change(before_label):
- label_num=len(before_label)
- change_arr=np.zeros((label_num,2)) #2 表示有两类
- for i in range(label_num):
- #该样本标签数据要求从 0 开始
- change_arr[i,int(before_label[i])]=1
- return change_arr
- #用于提取数据
- def train(data):
- data_train_x=data[:7,:3] #取前几行作为训练数据, 7 表示前 7 行, 3 表示取前三列, 排除数据标签
- data_train_y=label_change(data[:7,-1])
- return data_train_x,data_train_y
- data_train_x,data_train_y=train(data)
需要注意的地方在代码中我都做了注释, 不再赘述.
5, 开始训练和测试
训练部分
- for i in range(5): #迭代, 取 batch 进行训练
- img_batch, label_batch = tf.train.shuffle_batch([data_train_x, data_train_y], #随机取样本
- batch_size=2,
- num_threads=2,
- capacity=7,
- min_after_dequeue=2,
- enqueue_many=True)
- coord = tf.train.Coordinator()
- threads = tf.train.start_queue_runners(coord=coord, sess=sess)
- img_batch,label_batch=sess.run([img_batch,label_batch])
- train_step.run({x:img_batch,y_:label_batch,keep_prob:0.75}
- # 预测部分
- correct_prediction=tf.equal(tf.argmax(y,1),tf.argmax(y_,1))
- accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
- print(accuracy.eval({x:data_train_x,y_:data_train_y,keep_prob:1.0}))
这样就全部流程完成. 其中网络结构可以做相应的修改, 核心在于如何从 txt 中读取自己的数据输入到全连接神经网络 (多层感知机) 中进行训练和测试.
当然, 也可以在定义变量的时候直接输入, 不用从 txt 中读取. 即:
- image=[[1.0,2.0,3.0],[9,8,5],[9,5,6],[7,5,3],[6,12,7],[8,3,6],[2,8,71]]
- label=[[0,1],[1,0],[1,0],[1,0],[1,0],[0,1],[0,1]]
- image_test=[[9,9,9]]
- label_test=[[0,1]]
直接定于数据的话, 适合小数据量的情况, 大数据量的情况并不适用.
好了, 本篇博客介绍到此结束. 下一篇介绍如何处理图像数据.
来源: https://www.cnblogs.com/pypypy/p/11829700.html