创建神经网络之keras与tensorflow方法比较

在一个学习讨论组里被提问到:使用tensorflow创建网络模型时采用 tf.keras 和 tf.layers 哪种比较好?二话没说直接上代码。

把tensorflow官方的MNIST例子直接拿过来比较:

1、tf.layers

def model_fn(features, labels, mode, config):
    """
    用tf.layers创建网络模型
    :param features: 特征数据
    :param labels: 标签
    :param mode: 模式:tf.estimator.ModeKeys:TRAIN、EVAL、PREDICT
    :param config
    :return:
    """
    # 批次为-1 宽高为28x28 通道为1
    batch_size = -1
    image_width = 28
    image_height = 28
    channels = 1
    class_num = 10
    learning_rate = 1e-4
    input_height = image_height
    input_width = image_width
    # 输入层:
    input_layer = tf.reshape(features['x'], [batch_size, image_height, image_width, channels])
    # 卷积层1: 32个 5x5 过滤器 + ReLU激活函数
    conv1 = tf.layers.conv2d(inputs=input_layer,
                             filters=32,
                             kernel_size=[5, 5],
                             padding='same',
                             activation=tf.nn.relu)
    # 池化层1: 2x2 过滤器 + 步长为2
    pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)
    input_height = input_height // 2
    input_width = input_width // 2
    # 卷积层2: 64个 5x5 过滤器 + ReLU激活函数
    conv2 = tf.layers.conv2d(inputs=pool1,
                             filters=64,
                             kernel_size=[5, 5],
                             padding='same',
                             activation=tf.nn.relu)
    # 池化层2
    pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2)
    input_height = int(input_height // 2)
    input_width = int(input_width // 2)
    pool2_flat = tf.reshape(pool2, [-1, input_height * input_width * 64])
    # 密集层: 1024个神经元 + 丢弃正则化率为0.4
    dense = tf.layers.dense(inputs=pool2_flat, units=1024, activation=tf.nn.relu)
    dropout = tf.layers.dropout(inputs=dense, rate=0.4, training=mode == tf.estimator.ModeKeys.TRAIN)
    # 对数层: 10个神经元即分类类别0-9
    logits = tf.layers.dense(inputs=dropout, units=class_num)

2、tf.keras

def create_model(data_format):
    """
    用Keras创建网络模型
    :param data_format:
    :return:
    """
    image_width = 28
    image_height = 28
    channels = 1
    class_num = 10
    if data_format == 'channels_first':
        # (batch, channels, height, width) default
        input_shape = [channels, image_height, image_width]
    else:
        # (batch, height, width, channels)
        assert data_format == 'channels_last'
        input_shape = [image_height, image_width, channels]
    layer = tf.keras.layers
    # 池化层: pool_size=(2,2)  strides=(2,2)
    max_pool = layer.MaxPool2D((2, 2), (2, 2), padding='same', data_format=data_format)
    return tf.keras.Sequential([
        layer.Reshape(target_shape=input_shape,
                      input_shape=(image_height * image_width,)),
        layer.Conv2D(filters=32,
                     kernel_size=5,
                     padding='same',
                     data_format=data_format,
                     activation=tf.nn.relu),
        max_pool,
        layer.Conv2D(filters=64,
                     kernel_size=5,
                     padding='same',
                     data_format=data_format,
                     activation=tf.nn.relu),
        max_pool,
        layer.Flatten(),
        layer.Dense(1024, activation=tf.nn.relu),
        layer.Dropout(0.4),
        layer.Dense(class_num)
    ])

从上面两段代码中可见,tf.layers代码稍多,需要手动计算flat层的shape;而tf.keras就比较简洁,类似流式的网络构建方式将模型的网络展示的简单明了。

tensorflow1.11.0发布时就已经对keras增强了支持,可以发现tensorflow已经有意向将keras升级为一级网络操作API,毕竟keras和tensorflow都是google的,进行合理的资源整合提升tensorflow的生态布局很有必要。其实采用哪种都可以,根据自己喜欢即可,个人比较喜欢keras的API风格。

KerasTensorFlow 都是深度学习领域的开源工具,它们各自具备独特的优势,并广泛应用于神经网络模型的构建、训练以及部署。 ### Keras **特点**: - **高灵活性与易用性**:Keras 提供了一个简洁而强大的 API,允许用户快速搭建、调整和测试各种类型的神经网络模型。其设计注重于实验性和研究用途,使得开发者能够迅速尝试新的架构和算法。 - **跨平台支持**:由于 Keras 的设计依赖于较低级别的库如 Theano 或 TensorFlow,因此它能够在多种平台上运行,包括 Windows、Linux 和 macOS 系统。 - **模块化**:Keras 可以轻松地与其他数据处理和机器学习库集成,如 Pandas、NumPy 和 Scikit-learn,这使得深度学习模型可以融入更广泛的机器学习工作流程之中。 ### TensorFlow **特点**: - **高性能计算框架**:TensorFlow 是由 Google 开发的强大计算框架,专门用于大规模的数据流计算。它通过自动微分的能力,在许多领域实现了高效的神经网络训练和推理。 - **高度可定制性**:TensorFlow 允许用户在多个层次上自定义模型结构和优化策略,从低级张量操作到高级神经网络层都可以进行精确控制。 - **广泛应用**:除了深度学习之外,TensorFlow 还可用于构建复杂的数学模型、时间序列分析等,应用范围非常广泛。 - **生态丰富**:TensorFlow 拥有庞大的社区支持和丰富的资源,包括官方文档、教程、预训练模型等,极大地降低了使用门槛并促进了创新。 ### 对比 - **目标群体**:Keras 更适合初学者和寻求快速原型开发的用户,因为它提供了一种更简单、直观的方式来创建模型;而 TensorFlow 则更适合追求高性能和高度定制化的场景。 - **性能与复杂性**:相比之下,TensorFlow 在处理大型数据集和复杂模型时通常表现出更好的性能,但由于其底层结构更为复杂,对于新手来说学习曲线可能会更高。 - **生态系统**:虽然两者都有活跃的社区和技术支持,但 TensorFlow 因其背后的 Google 背书,拥有更丰富和成熟的支持资源,特别是在云服务方面。 ### 应用案例 - 使用 Keras 构建一个简单的卷积神经网络(CNN) 来识别图像中的物体。 - 利用 TensorFlow 实现一个语言模型进行文本生成任务。 - 在医疗影像诊断中使用 TensorFlow 来训练模型对 X 光片进行癌症检测。 ### 相关问题: 1. KerasTensorFlow 之间有哪些关键区别? 2. 在什么场景下优先选择 Keras 而不是 TensorFlow? 3. 如何将一个使用 TensorFlow 编写的模型部署到实际的产品环境中?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值