python - 如何实现随机深度,并随机丢弃整个卷积层?
问题描述
我正在尝试实现这个想法:https ://arxiv.org/abs/1603.09382 。基本思想是在基于“保持概率”的训练期间丢弃 Conv2D 层,例如 Dropout。我想我可以用这样的自定义层来做到这一点:
class StochasticConv2D(layers.Layer):
def __init__(self, **kwargs):
super(StochasticConv2D, self).__init__()
self.conv2D = layers.Conv2D(**kwargs)
def call(self, inputs, training, keep_prob):
if training and (np.random.uniform() > keep_prob):
return inputs
return self.conv2D(inputs)
当我尝试使用 training = True 时,我收到此错误:
ValueError: tf.function-decorated function tried to create variables on non-first call.
如果我让它工作,我不太确定如何实现非训练模式。我是否使用 training = false 再次定义模型并加载训练中保存的权重?如果我将validation_data 传递给model.fit(),如何在运行验证时将“training”设置为false?
解决方案
这似乎可以做到(先前解决方案的修改版本):
class StochasticConv2D(layers.Layer):
def __init__(self, keep_prob, **kwargs):
super(StochasticConv2D, self).__init__()
self.keep_prob = keep_prob
self.conv2D = layers.Conv2D(**kwargs)
def call(self, inputs):
if keras.backend.learning_phase():
coin_toss = tf.random.uniform(())
return tf.cond(tf.greater(coin_toss, self.keep_prob), lambda: inputs, lambda: self.conv2D(inputs))
return self.conv2D(inputs)
推荐阅读
- python - 说明散点图中特定数据点的坐标
- python - Python-MySQL 查询不显示结果,包括同一查询中的先前导入
- python-3.x - 从 Steam 社区市场上的 Item 获取检查链接
- android - 有没有办法在颤动的文本字段中更改文本时仅更改文本?
- python - scrapy+selenium 完成后如何抓取不同的页面列表?
- java - 如何在签名和证书部分删除 XML 数字签名中奇怪的行尾?
- python - 无法从 Windows 访问在 8000 上运行的 Django 应用程序
- swift - 在任何情况下都需要调用 `disposed(by:)` 吗?
- python - PermissionError:[Errno 13] 使用带有 pip-20.0.2-py2.py3-none-any.whl 轮文件的 virtualenv 和 virtualenvwrapper 的权限被拒绝
- python - 如何从 pcap 文件中提取所有数据包的 TCP 标头?