利用CNN处理基于人体行为识别TensorFlow实战(二)(搭建神经网络)

搭建神经网络

在上次我们已经学会了如何去制作数据集,并且学习到了一些处理数据的方法和工具,那么现在我们就学习如何去搭建一个神经网络,我们所有的代码都已经上传到了github上面,有需要的同学可以进行查阅,现在开始学习如何搭建神经网络

1,定义数据类型

在我们搭建网络之前,我们首先要确定,我们给网络中送入的数据到底是以什么形式送进去的,这一点很关键,对于我们这个数据集来说,我们想让他按照每组中包含100条信息的格式送入网络,那么我们会将每一组数据处理为一个三维数组,那么三维数组的的每一维分别是1*100*3,如果我们将这个三维数组看做一个图片的话,那么1和100就分别是这个图片的长和宽,而3就代表图片的三原色,其实就是我们数据中的xyz,那么我们总共有600条这样的数据,那我们就在给他加上一个维度,这样就是一个四维的数组了,然后测试集的数据也要这样处理,然后我们说一下如何处理标签文件,我们首先应该将标签文件转化成onehot数据类型,由于我们只有六个类别,所以在txt中数据的格式应该是600*6的样子,那么我们就将标签文件转化为一个600*6的二维矩阵.到了现在我们已经将数据利用numpy全部处理完毕了,下面的代码有助于你们理解.

Train_labels = np.loadtxt("/home/amyassient/PycharmProjects/HCNA-AI/WISDM_ar_v1.1/Train_labels.txt")
Train_data = np.loadtxt("/home/amyassient/PycharmProjects/HCNA-AI/WISDM_ar_v1.1/Train_data.txt")
Train_data = np.reshape(Train_data,(600,1,100,3))
Train_labels = np.reshape(Train_labels,(600,6))

Test_labels = np.loadtxt("/home/amyassient/PycharmProjects/HCNA-AI/WISDM_ar_v1.1/Test_labels.txt")
Test_data = np.loadtxt("/home/amyassient/PycharmProjects/HCNA-AI/WISDM_ar_v1.1/Test_data.txt")
Test_data = np.reshape(Test_data,(60,1,100,3))
Test_labels = np.reshape(Test_labels,(60,6))

2,设置神经网络参数

对于神经网络参数方面,设置也是很有讲究的,但是由于小编的水平有限,看不出他们之间的规律,所以给大家一组参考值,请看代码(另外说一下,神经网络参数的设置一定要和你上面的数据的维度要对应上,否则是送不进网络中的)

input_height = 1
input_width = 100
num_labels = 6
num_channels = 3

batch_size = 10
kernel_size = 60
depth = 60
num_hidden = 1000

learning_rate = 0.0001
training_epochs = 500

3,搭建CNN

CNN(卷积神经网络)我相信大家都不太陌生,在这里小编只想给大家提示几个比较重要的点,1,卷积网络的层数要根据你的数据规模来设定,数据规模小,层数就稍微少一点,否则非常容易出现过拟合的状态.2,为防止过拟合,一定要使用dropout,接下来请看代码

def CNN(input_tensor, train, regularizer):
    with tf.variable_scope('layer1-conv1'):
        conv1_weights = tf.get_variable("weight",[1,10,3,60],initializer=tf.truncated_normal_initializer(stddev=0.1))
        conv1_biases = tf.get_variable("bias",[60],initializer=tf.constant_initializer(0.0))
        conv1 = tf.nn.conv2d(input_tensor, conv1_weights, strides=[1,1,1,1],padding='SAME')
        relu1 = tf.nn.relu(tf.nn.bias_add(conv1, conv1_biases))
    with tf.name_scope('layer2-pool1'):
        pool1 = tf.nn.max_pool(relu1, ksize=[1,1,20,1],strides=[1,1,2,1],padding="SAME")
    with tf.variable_scope('layer3-conv2'):
        conv2_weights = tf.get_variable("weight",[1,6,60,10],initializer=tf.truncated_normal_initializer(stddev=0.1))
        conv2_biases = tf.get_variable("bias",[10],initializer=tf.constant_initializer(0.0))
        conv2 = tf.nn.conv2d(pool1, conv2_weights, strides=[1,1,1,1],padding='VALID')
        relu2 = tf.nn.relu(tf.nn.bias_add(conv2, conv2_biases))
    with tf.variable_scope('layer4-fc1'):
        pool_shape = relu2.get_shape().as_list()
        nodes = pool_shape[1] * pool_shape[2] * pool_shape[3]
        reshaped = tf.reshape(relu2, [-1, nodes])

        fc1_weights = tf.get_variable("weight",[nodes,1000],initializer=tf.truncated_normal_initializer(stddev=0.1))
        if regularizer != None:
            tf.add_to_collection('loss', regularizer(fc1_weights))
        fc1_biases = tf.get_variable("bias", [1000], initializer=tf.constant_initializer(0.1))
        fc1 = tf.nn.tanh(tf.matmul(reshaped, fc1_weights) + fc1_biases)
        if train:
            fc1 = tf.nn.dropout(fc1, 0.5)
    with tf.variable_scope('layer5-fc2'):
        fc2_weights = tf.get_variable("weight", [1000,6],initializer=tf.truncated_normal_initializer(stddev=0.1))
        if regularizer != None:
            tf.add_to_collection('loss', regularizer(fc2_weights))
        fc2_biases = tf.get_variable("bias", [6], initializer=tf.constant_initializer(0.1))
        logits = tf.nn.softmax(tf.matmul(fc1, fc2_weights) + fc2_biases)
    return logits

在这里小编将所有的参数都实例化了,就希望大家可以看的更清楚一些.

4,设置loss,correct_prediction等参数

相信每一个学习深度学习的人都知道这些参数的意义,在这里小编多嘴一下,对于loss函数的设置,希望大家多多注意,对于设置的规律小编会在以后的博客中写到,话不多说,上代码

X = tf.placeholder(tf.float32, shape=[None,input_height,input_width,num_channels])
Y = tf.placeholder(tf.float32, shape=[None,num_labels])
regularizer = tf.contrib.layers.l2_regularizer(0.001)
y_ = CNN(X, False, regularizer)
loss = -tf.reduce_sum(Y*tf.log(y_))
#loss = tf.nn.sigmoid_cross_entropy_with_logits(labels=Y,logits=y_)
#loss =  tf.nn.softmax_cross_entropy_with_logits(labels=Y,logits=y_)

optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(loss)
correct_prediction = tf.equal(tf.argmax(y_, 1), tf.argmax(Y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

这里还要注意一点就是对于X和Y里面的shape,一定要和你的数据集所设置的维度要对应上

5,编写Session,生成会话

对于session,小编在这里给大家说一下,因为小编在学的时候,对于session的理解不太深刻,所以在这里和大家分享一下,首先我们应该了解到在TensorFlow中是如何为将数据喂给网络呢,其实我们依靠的就是feed_dict这个参数,他的意思就是,会将数据生成一个字典,然后喂进去,当然喂数据的时候不一定是一个一个喂,然后在设置迭代轮次的时候不宜太多,接下来看代码

with tf.Session() as session:
    tf.initialize_all_variables().run()

    for epoch in range(training_epochs):
        _, tra_ = session.run([optimizer, accuracy], feed_dict={X: Train_data, Y: Train_labels})
        testa = session.run(accuracy, feed_dict={X: Test_data, Y: Test_labels})
        print("Epoch: ", epoch, " Training Accuracy: ",session.run(accuracy, feed_dict={X: Train_data, Y: Train_labels}))
        print("Testing Accuracy:", session.run(accuracy, feed_dict={X: Test_data, Y: Test_labels}))

6,总结

最后小编总结一下,在整个过程中,小编遇到最头疼的问题就是对于数据的处理,所以说使用好的工具进行数据处理还是十分重要的,另外就是在搭建网络的过程中,对于很多函数很陌生,所以,还得认真练习,最后说一下这个处理的结果,由于数据量很小,所以最后的准确率定格在0.7----0.8之间,这是小编第一次从头到尾自己实现的一次网络搭建,如果有说的不对的地方,希望大家多多批评指正

7,后续

在处理数据的时候我们说过,这些数据是连续的数据,那么大家有没有想到更好的算法解决这个问题呢,没错RNN(循环神经网络)可以解决,那么下次小编将会告诉大家,如何使用RNN进行人体行为识别,大家一起加油!!!

你可能感兴趣的:(linux,deeplearning)