tensorflow卷积神经网络Model模板

本文介绍了一种包含四个卷积层及池化层,并最终接三个全连接层的卷积神经网络模型。通过逐步解析各层的具体实现过程,包括卷积层、激活函数、池化层及全连接层等关键组成部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 添加了4个卷积,每个卷积后边跟了池化层,最后加了3个全连接层。

def model(input_tensor, train,
          regularizer):  
    with tf.variable_scope('layer1-conv1'):  # 定义一个作用域:layer1-conv1,在该作用域下面可以定义相同名称的变量(用于变量)
        conv1_weights = tf.get_variable("weight", [5, 5, 3, 32],
                                        initializer=tf.truncated_normal_initializer(stddev=0.1))
        # 定义变量权重:weight,名称是weight;5,5代表卷积核的大小,3代表输入的信道数目,32代表输出的信道数目;initializer代表神经网络权重和卷积核的推荐初始值,生成截断正态分布随机数,服从标准差为0.1
        conv1_biases = tf.get_variable("bias", [32], initializer=tf.constant_initializer(0.0))
        # 定义变量偏置:bias,名称bias,[32]代表当前层的深度;initializer代表偏置的初始化,用函数tf.constant_initializer将其初始化为0,也可以初始化为tf.zeros_initializer或者tf.ones_initializer
        conv1 = tf.nn.conv2d(input_tensor, conv1_weights, strides=[1, 1, 1, 1], padding='SAME')
        # 上面为定义卷积层:input_tensor为当前层的节点矩阵;conv1_weights代表卷积层的权重;strides为不同方向上面的步长;padding标识填充,有两种方式,SAME表示用0填充,“VALID”表示不填充。
        relu1 = tf.nn.relu(tf.nn.bias_add(conv1, conv1_biases))  # 定义激活函数:利用bias_add给每个节点都加上偏置项,然后利用relu函数去线性化

    with tf.name_scope("layer2-pool1"):  # 定义一个:layer2-pool1(用于op)
        # 池化层可以优先缩小矩阵的尺寸,从而减小最后全连接层当中的参数;池化层既可以加快计算速度,也可以防止过拟合。
        pool1 = tf.nn.max_pool(relu1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="VALID")
        # ksize代表pool窗口的尺寸,首尾两个数必须是1,ksize最常用[1,2,2,1]和[1,3,3,1];strides代表filter的步长,首尾两个数必须为1;padding代表填充方式;

    with tf.variable_scope("layer3-conv2"):  # 定义作用域(用于变量)
        # 定义权重
        conv2_weights = tf.get_variable("weight", [5, 5, 32, 64],
                                        initializer=tf.truncated_normal_initializer(stddev=0.1))
        conv2_biases = tf.get_variable("bias", [64], initializer=tf.constant_initializer(0.0))  # 定义偏置
        conv2 = tf.nn.conv2d(pool1, conv2_weights, strides=[1, 1, 1, 1], padding='SAME')  # 定义卷积层
        relu2 = tf.nn.relu(tf.nn.bias_add(conv2, conv2_biases))  # 定义激活函数

    with tf.name_scope("layer4-pool2"):  # 定义命名空间(用于op)
        pool2 = tf.nn.max_pool(relu2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='VALID')  # 定义池化层

    with tf.variable_scope("layer5-conv3"):  # 定义作用域 (用于变量)
        # 定义权重
        conv3_weights = tf.get_variable("weight", [3, 3, 64, 128],
                                        initializer=tf.truncated_normal_initializer(stddev=0.1))
        conv3_biases = tf.get_variable("bias", [128], initializer=tf.constant_initializer(0.0))  # 定义偏置
        conv3 = tf.nn.conv2d(pool2, conv3_weights, strides=[1, 1, 1, 1], padding='SAME')  # 定义卷积层
        relu3 = tf.nn.relu(tf.nn.bias_add(conv3, conv3_biases))  # 定义激活函数

    with tf.name_scope("layer6-pool3"):  # 定义命名空间(用于op)
        pool3 = tf.nn.max_pool(relu3, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='VALID')  # 定义池化层

    with tf.variable_scope("layer7-conv4"):  # 定义作用域(用于变量)
        # 定义权重
        conv4_weights = tf.get_variable("weight", [3, 3, 128, 128],
                                        initializer=tf.truncated_normal_initializer(stddev=0.1))
        conv4_biases = tf.get_variable("bias", [128], initializer=tf.constant_initializer(0.0))  # 定义偏置
        conv4 = tf.nn.conv2d(pool3, conv4_weights, strides=[1, 1, 1, 1], padding='SAME')  # 定义卷积层
        relu4 = tf.nn.relu(tf.nn.bias_add(conv4, conv4_biases))  # 定义激活函数

    with tf.name_scope("layer8-pool4"):  # 定义命名空间(用于op)
        pool4 = tf.nn.max_pool(relu4, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='VALID')  # 定义池化层

      
        nodes = 6 * 6 * 128  
        reshaped = tf.reshape(pool4, [-1, nodes])
        print("shape of reshaped:", reshaped.shape)  # reshape函数将pool4的输出转化成向量
    # 定义作用域:
    with tf.variable_scope('layer9-fc1'):
        # 定义全连接层的权重:
        fc1_weights = tf.get_variable("weight", [nodes, 1024], initializer=tf.truncated_normal_initializer(stddev=0.1))
        if regularizer != None: tf.add_to_collection('losses', regularizer(fc1_weights))
        # 给全连接层的权重添加正则项,tf.add_to_collection函数可以把变量放入一个集合,把很多变量变成一个列表
        fc1_biases = tf.get_variable("bias", [1024], initializer=tf.constant_initializer(0.1))  # 定义全连接层的偏置:
        fc1 = tf.nn.relu(tf.matmul(reshaped, fc1_weights) + fc1_biases)  # 定义激活函数:
        if train: fc1 = tf.nn.dropout(fc1, 0.5)  # 针对训练数据,在全连接层添加dropout层,防止过拟合

    with tf.variable_scope('layer10-fc2'):
        fc2_weights = tf.get_variable("weight", [1024, 512], initializer=tf.truncated_normal_initializer(stddev=0.1))
        if regularizer != None: tf.add_to_collection('losses', regularizer(fc2_weights))
        fc2_biases = tf.get_variable("bias", [512], initializer=tf.constant_initializer(0.1))
        fc2 = tf.nn.relu(tf.matmul(fc1, fc2_weights) + fc2_biases)
        if train: fc2 = tf.nn.dropout(fc2, 0.5)

    with tf.variable_scope('layer11-fc3'):
        fc3_weights = tf.get_variable("weight", [512, 5],
                                      initializer=tf.truncated_normal_initializer(stddev=0.1))
        if regularizer != None: tf.add_to_collection('losses', regularizer(fc3_weights))
        fc3_biases = tf.get_variable("bias", [5], initializer=tf.constant_initializer(0.1))
        logit = tf.matmul(fc2, fc3_weights) + fc3_biases

    return logit

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值