tensorflow学习框架之添加层 def add_layer()

本文详细介绍如何在TensorFlow中定义并使用add_layer函数轻松添加神经网络层。通过设置输入输出大小及激励函数,实现神经层的快速构建,提高深度学习项目效率。
部署运行你感兴趣的模型镜像
  1. 定义 add_layer()
    在 Tensorflow 里定义一个添加层的函数可以很容易的添加神经层,为之后的添加省下不少时间.

    神经层里常见的参数通常有weights、biases和激励函数。

    首先,我们需要导入tensorflow模块。

    import tensorflow as tf
    

    然后定义添加神经层的函数def add_layer(),它有四个参数:输入值、输入的大小、输出的大小和激励函数,我们设定默认的激励函数是None。

    def add_layer(inputs, in_size, out_size,activation_function=None): 
    

    接下来,我们开始定义weights和biases。

    因为在生成初始参数时,随机变量(normal distribution)会比全部为0要好很多,所以我们这里的weights为一个in_size行, out_size列的随机变量矩阵。

    Weights = tf.Variable(tf.random_normal([in_size, out_size]))
    

    在机器学习中,biases的推荐值不为0,所以我们这里是在0向量的基础上又加了0.1。

    biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)
    

    下面,我们定义Wx_plus_b, 即神经网络未激活的值。其中,tf.matmul()是矩阵的乘法。

    Wx_plus_b = tf.matmul(inputs, Weights) + biases
    

    当activation_function——激励函数为None时,输出就是当前的预测值——Wx_plus_b,不为None时,就把Wx_plus_b传到activation_function()函数中得到输出。

    if activation_function is None:
        outputs = Wx_plus_b
    else:
        outputs = activation_function(Wx_plus_b)
    

    最后,返回输出,添加一个神经层的函数——def add_layer()就定义好了。

    return outputs
    

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.15

TensorFlow-v2.15

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

import numpy as np import tensorflow as tf from tensorflow.keras import layers, models, regularizers from tensorflow.keras.datasets import cifar100 import matplotlib.pyplot as plt # 设置字体和负号显示 plt.rcParams["font.sans-serif"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"] plt.rcParams['axes.unicode_minus'] = False # ResNet 块定义 def resnet_block(input_tensor, filters, stride=1, conv_shortcut=True, attention=None): bn_axis = 3 if tf.keras.backend.image_data_format() == 'channels_last' else 1 if conv_shortcut: shortcut = layers.Conv2D(4 * filters, 1, strides=stride, kernel_regularizer=regularizers.l2(1e-4))(input_tensor) shortcut = layers.BatchNormalization(axis=bn_axis)(shortcut) else: shortcut = input_tensor x = layers.Conv2D(filters, 1, strides=stride, kernel_regularizer=regularizers.l2(1e-4))(input_tensor) x = layers.BatchNormalization(axis=bn_axis)(x) x = layers.Activation('relu')(x) x = layers.Conv2D(filters, 3, padding='same', kernel_regularizer=regularizers.l2(1e-4))(x) x = layers.BatchNormalization(axis=bn_axis)(x) x = layers.Activation('relu')(x) x = layers.Conv2D(4 * filters, 1, kernel_regularizer=regularizers.l2(1e-4))(x) x = layers.BatchNormalization(axis=bn_axis)(x) x = layers.Add()([shortcut, x]) x = layers.Activation('relu')(x) return x # 构建 ResNet34 模型 def build_resnet34(input_shape=(32, 32, 3), classes=100, attention=None): inputs = layers.Input(shape=input_shape) x = layers.ZeroPadding2D(padding=(3, 3))(inputs) x = layers.Conv2D(64, 7, strides=2, use_bias=False, kernel_regularizer=regularizers.l2(1e-4))(x) x = layers.BatchNormalization()(x) x = layers.Activation('relu')(x) x = layers.MaxPooling2D(3, strides=2, padding='same')(x) def make_layer(x, filters, blocks, stride=1): x = resnet_block(x, filters, stride=stride, conv_shortcut=True, attention=attention) for _ in range(1, blocks): x = resnet_block(x, filters, conv_shortcut=False, attention=attention) return x x = make_layer(x, 64, 3, stride=1) x = make_layer(x, 128, 4, stride=2) x = make_layer(x, 256, 6, stride=2) x = make_layer(x, 512, 3, stride=2) x = layers.GlobalAveragePooling2D()(x) outputs = layers.Dense(classes, activation='softmax', kernel_regularizer=regularizers.l2(1e-4))(x) return models.Model(inputs, outputs) # 加载数据集 (x_train, y_train), (x_test, y_test) = cifar100.load_data() x_train, x_test = x_train / 255.0, x_test / 255.0 # 构建基础模型并加载权重 model = build_resnet34() model.load_weights('base_resnet34_cifar100.h5') print("模型权重加载成功") # 剪枝函数 def prune_conv_layer(conv_layer, prune_ratio): weights = conv_layer.get_weights() if len(weights) == 0: return weights num_channels = weights[0].shape[-1] num_channels_to_keep = int(num_channels * (1 - prune_ratio)) channel_norms = np.linalg.norm(weights[0], axis=(0, 1, 2)) sorted_indices = np.argsort(channel_norms)[-num_channels_to_keep:] sorted_indices = np.sort(sorted_indices) pruned_weights = [w[..., sorted_indices] for w in weights] return pruned_weights # 更新模型结构 def prune_model(model, prune_ratio): new_model = models.Sequential() for layer in model.layers: if isinstance(layer, layers.Conv2D): pruned_weights = prune_conv_layer(layer, prune_ratio) new_conv_layer = layers.Conv2D( filters=pruned_weights[0].shape[-1], kernel_size=layer.kernel_size, strides=layer.strides, padding=layer.padding, use_bias=layer.use_bias, kernel_regularizer=layer.kernel_regularizer ) new_conv_layer.build(layer.input_shape) new_conv_layer.set_weights(pruned_weights) new_model.add(new_conv_layer) elif isinstance(layer, layers.BatchNormalization): new_bn_layer = layers.BatchNormalization() new_bn_layer.build(layer.input_shape) new_bn_layer.set_weights(layer.get_weights()) new_model.add(new_bn_layer) else: new_model.add(layer) return new_model # 测试模型精度 def evaluate_model(model, x_test, y_test): loss, accuracy = model.evaluate(x_test, y_test, verbose=0) return accuracy # 计算加速比 def calculate_acceleration_ratio(original_model, pruned_model): original_params = original_model.count_params() pruned_params = pruned_model.count_params() return original_params / pruned_params # 原始模型精度 original_accuracy = evaluate_model(model, x_test, y_test) print(f"原始模型精度: {original_accuracy:.4f}") # 剪枝比例 prune_ratios = [0.1, 0.2] for ratio in prune_ratios: print(f"\n剪枝比例: {ratio}") pruned_model = prune_model(model, ratio) pruned_accuracy = evaluate_model(pruned_model, x_test, y_test) acceleration_ratio = calculate_acceleration_ratio(model, pruned_model) print(f"剪枝后精度: {pruned_accuracy:.4f}") print(f"精度损失: {original_accuracy - pruned_accuracy:.4f}") print(f"加速比: {acceleration_ratio:.2f}")//帮我看看这个代码
最新发布
07-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值