TensorFlow2.X——子类以及lambda分别实现自定义DenseLayer层次

子类以及lambda分别实现自定义DenseLayer层次

1.在介绍子类继承layer层自定义层次前,介绍两个查看参数的方法。

layer.variables 可以查看层次中的变量
layer.trainable_variables 可以查看可训练的变量

示例:

import tensorflow as tf
layer = tf.keras.layers.Dense(100, input_shape = [None, 5])
layer(tf.zeros([2,5]))

运算结果矩阵有200个数据,

layer.variables

截取一部分变量:

x * w + b
<tf.Variable ‘dense_2/kernel:0’ shape=(5, 100) dtype=float32, numpy=
array([[ 8.61696750e-02, -1.33024722e-01, -1.06008053e-02
kernel 表示 W 参数
<tf.Variable ‘dense_2/bias:0’ shape=(100,) dtype=float32, numpy=
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
bias 表示b偏差

同样我们可以查看可训练的参数

layer.trainable_variables

2.子类以及lambda分别实现自定义DenseLayer层次。

子类实现自定义是需要输入参数时使用,而如果我们不需要输入层次参数则可以选用lambda来构建自定义层次。

代码示例:

  • 子类自定义实现
#customized  dense layer 
#使用子类继承Layer自定义

class CustomizedDenseLayer(keras.layers.Layer):
    
    def __init__(self, units, activation = None, **kwargs):
        self.units = units   #层次单元
        self.activation = keras.layers.Activation(activation)
        super().__init__(**kwargs)
        
    def build(self, input_shape):
        """构建所需要的函数"""
        # x * w + b.
        self.kernel = self.add_weight(name = 'kernel', 
                                      shape = (input_shape[1], self.units),
                                      initializer = 'uniform',
                                      trainable = True)
        self.bias = self.add_weight(name = 'bias',
                                    shape = (self.units, ),
                                    initializer = 'zeros',
                                    trainable = True
                                   )
        super().build(input_shape)
    
    def call(self, x):
        """完成正向计算"""
        return self.activation(x @ self.kernel + self.bias)
  • lambda自定义实现,以softplus为例。
#如果自定义的函数不需要输入参数,则可以通过lambda来自定义层次
#tf.nn.softplus : log(1 + e^x)
Customized_softplus = keras.layers.Lambda(lambda x :tf.nn.softplus(x))

使用自定义层次构建网络:

#使用序贯模型Sequential   tf.keras.models.sequential()

model = keras.models.Sequential([
    #keras.layers.Flatten(input_shape = x_train.shape[1:]),如果数据已经展平,真不用再使用flatten。
    #使用自定义层次
    CustomizedDenseLayer(30, activation="relu",input_shape = x_train.shape[1:]),
    CustomizedDenseLayer(1),
    Customized_softplus,
    #最后一层lambda自定义层次相当于以下两种写法
    #keras.layers.Dense(1, activation = 'softplus')
    #keras.layers.Dense(1) , keras.layers.Activation('softplus')
])
<think>好的,我现在需要帮用户解决TensorFlow 2.x中Estimator的版本兼容性问题。首先,我得回忆一下TensorFlow 2.x的变化。根据引用[1],TensorFlow 2.x的核心是基于静态图设计,提升了运行速度。但用户提到的是Estimator,这个在1.x中常用,比如tf.estimator.LinearClassifier。 用户想知道在2.x中Estimator的对应版本。首先,我得确认Estimator在2.x中是否还存在。根据官方文档,TensorFlow 2.x仍然保留了tf.estimator模块,但推荐使用Keras API。但用户可能还在维护旧代码,所以需要兼容性信息。 然后,检查引用里的内容,引用[3]提到可以通过导入方式或Eager Execution来判断版本。但用户的问题是关于Estimator的兼容性。可能需要考虑的是,Estimator在2.x中是否有更新,或者是否有替代方案。 另外,引用[4]提到GradientTape的使用,这可能和自定义模型有关,但和Estimator关系不大。不过,用户的问题更关注版本兼容,所以重点应在模块是否存在以及是否有变化。 根据经验,TensorFlow 2.x中Estimator API仍然可用,但处于维护模式,可能不会有新功能。同时,部分参数可能调整,比如默认启用Eager Execution,但Estimator原本是基于图执行的,可能需要设置。例如,在2.x中,可以通过tf.compat.v1.disable_eager_execution()来禁用Eager模式,但这可能影响性能。 此外,用户可能遇到旧代码迁移的问题,比如从1.x到2.x,Estimator是否需要修改导入路径。比如,在2.x中,直接使用tf.estimator而不是tf.contrib.estimator。需要注意是否有模块移动的情况。 另外,引用[2]提到卸载普通版本TensorFlow的问题,但这里可能不相关。不过,如果用户安装的是nvidia-tensorflow等变体,可能需要确保版本匹配,但用户的问题更偏向API兼容性。 总结,回答应包含以下几点: 1. TensorFlow 2.x仍然支持Estimator,但推荐使用Keras。 2. Estimator在2.x中的位置可能有变化,比如从contrib迁移到核心。 3. 兼容性问题如Eager Execution的影响,需要调整设置。 4. 迁移指南和官方文档的参考建议。 最后,生成相关问题时要围绕版本迁移、替代方案、常见错误等。</think>关于TensorFlow 2.x中Estimator的版本兼容性,以下是关键信息整理: ### 1. Estimator在TensorFlow 2.x中的状态 TensorFlow 2.x保留了`tf.estimator`模块,但官方推荐使用Keras API替代[^1]。Estimator的语法基本兼容,但需注意以下变化: - **模块路径调整**:原`tf.contrib.estimator`中的功能已迁移到`tf.estimator`[^3] - **默认执行模式**:TensorFlow 2.x默认启用Eager Execution,而Estimator基于静态图设计,需通过`tf.compat.v1.disable_eager_execution()`禁用Eager模式才能完全兼容旧代码[^4] ### 2. 常见兼容性操作 - **导入方式**:直接使用`import tensorflow as tf`后调用`tf.estimator.LinearClassifier`等接口 - **混合使用Keras**:可通过`tf.keras.estimator.model_to_estimator`将Keras模型转换为Estimator格式 - **代码迁移工具**:使用`tf_upgrade_v2`脚本自动转换旧版代码 ### 3. 典型兼容性问题 ```python # TensorFlow 2.x中需显式指定参数类型 estimator = tf.estimator.DNNClassifier( feature_columns=feature_columns, hidden_units=[1024, 512], n_classes=10, optimizer=lambda: tf.keras.optimizers.Adam(learning_rate=0.001) # 需使用lambda包装优化器 ) ``` ### 4. 官方推荐方案 对于新项目,建议采用Keras API实现等效功能: ```python model = tf.keras.Sequential([ tf.keras.layers.Dense(1024, activation='relu'), tf.keras.layers.Dense(512, activation='relu'), tf.keras.layers.Dense(10, activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值