利用TensorFlow实现卷积神经网络(CNN)常见层

谷歌开源的深度学习框架tensorflow对于神经网络的每个层都有相应的内建函数进行操作,其中最流行的层就是卷积层和池化层,这篇文章主要是展示如何在输入数据和全连接的数据上创建和使用这些层,主要分为两部分:

1.在一维数据上如何使用和创建这些层

2.在二维数据上如何使用和创建这些层

0.前期工作

0.1导入相应的模块

import tensorflow as tf
import numpy as np

0.2 生成随机数据

data_id=np.random.normal(size=25)
x_input_id=tf.placeholder(dtype=tf.float32,shape=[25])

1.一维数据部分

1.1 卷积层

def conv_layer_1d(input_1d,filter):
    """
    返回的是一个卷积以后的数据
    :param input_1d:输入数据
    :param filter:卷积核
    """
    #由于输入的使一维数据,而tensorflow处理的数据维度一般是4维的,类似于shape=[batch_size,width,height,channels],因此需要将一维数据扩充为4维数据
    input_2d=tf.expand_dims(input_1d,axis=1)
    input_3d=tf.expand_dims(input_2d,axis=2)
    input_4d=tf.expand_dims(input_3d,axis=3)

    output_4d=tf.nn.conv2d(input=input_4d,filter=filter,strides=[1,1,1,1],padding='VALID')


    #需要进行将4维的数据压缩为1维数据进行输出
    output_1d=tf.squeeze(output)  #这里不指定对第几个维度进行压缩,则会压缩到只剩一个维度

    final_output_1d=tf.nn.relu(output_1d) #利用激活函数激活输出

    return output_4d,output_1d,final_output_1d

1.2 池化层

def Maxpooling_layer_1d(input_1d,width):
    """
    :param input_1d:
    :param width:
    :return:
    """
    #由于输入的是1维数据,所以需要将其扩充为4维数据
    input_2d=tf.expand_dims(input_1d,1)
    input_3d=tf.expand_dims(input_2d,2)
    input_4d=tf.expand_dims(input_3d,3)

    pool_output_4d=tf.nn.max_pool(input_4d,ksize=[1,1,width,1],strides=[1,1,1,1],padding="VALID")
    #进行压缩到1维
    pool_output_1d=tf.squeeze(pool_output_4d)

    return pool_output_4d,pool_output_1d

1.3 全连接层

def Fully_Connected_layer_1d(input_1d,num_outputs):
    '''全连接层可以理解为带有隐含层的MLP,所以我们需要定义weight和bias'''
    weight_shape=tf.squeeze(tf.stack([tf.shape(input_1d),[num_outputs]]))  #tf.stack()函数是对于某一个张量沿着某一个轴组合成多维张量
    weight=tf.Variable(tf.random_normal(shape=weight_shape,stddev=0.1))
    bias=tf.Variable(tf.random_normal(shape=[num_outputs],stddev=0.1))

    input_2d=tf.expand_dims(input_1d,0)
    final_output_2d=tf.add(tf.matmul(input_2d,weight),bias)
    final_output_1d=tf.squeeze(final_output_2d)
    return final_output_1d

1.4 调用函数

_,_,connv_layer_1d_output=conv_layer_1d(x_input_id,filter=my_filter_1d)
_,maxpool_layer_1d_output=Maxpooling_layer_1d(connv_layer_1d_output,width=5)
fully_conn_layer_1d=Fully_Connected_layer_1d(maxpool_layer_1d_output,5)

1.5 打印输出结果

sess=tf.Session()  #定义一个会话,所有的操作都是在会话里进行
init=tf.global_variables_initializer() #初始化所有变量
sess.run(init)
connv_layer_1d_output_1=sess.run(connv_layer_1d_output,feed_dict={x_input_id:data_id})
maxpool_layer_1d_output_1=sess.run(maxpool_layer_1d_output,feed_dict={x_input_id:data_id})
fully_conn_layer_1d_1=sess.run(fully_conn_layer_1d,feed_dict={x_input_id:data_id})
print("connv_layer_1d:".format(connv_layer_1d_output_1))
print("maxpool_layer_output:".format(maxpool_layer_1d_output_1))
print("fully_connected:".format(fully_conn_layer_1d_1))

一维数据在卷积层、池化层、全连接层的创建与操作介绍完了,后面一篇文章会写在二维数据上如何操作.如什么地方不对,望大佬指正,谢谢!

    原文作者:Peter清风
    原文地址: https://zhuanlan.zhihu.com/p/50570132
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞