我正在尝试培训LSTM,在我的模型中,我有指数级的学习率衰减和辍学层.为了在测试和验证时停用辍学层,我已经为辍学率放置了一个占位符,并且默认值为1.0,并且在训练时,我将其设置为0.5. dropou_rate占位持有人值传递给tf.layers.dropout().当我在验证期间运行此操作时,我会收到以下错误. valueerror:输入包含NAN,Infinity或一个太大的值 dtype('float64'). 如下所示是堆栈跟踪: trackback(最近的最新通话):文件 "/home/suleka/documents/sales_prediction/salesprediction_lstm_mv.py", 第329行 train_test()文件"/home/suleka/documents/sales_prediction/salesprediction_lstm_mv.py", 第270行,在train_test中 MeansQuaredError =
以下是关于 dropout 的编程技术问答
来自 "这个想法是在测试时使用单个神经网,而不会辍学. 该网络的权重是训练有素的缩放版本 权重.如果在训练过程中保留了概率P的单位,则 该单元的外向重量在测试时乘以P乘以P 如图2所示.这确保了任何隐藏单元的预期 输出(在训练时掉落单位的分布下)为 与测试时的实际输出相同." 为什么我们要保留预期的输出?如果我们使用Relu激活,则权重或激活的线性缩放会导致网络输出的线性缩放,并且对分类精度没有任何影响. 我缺少什么? 解决方案 确切地说,我们要保留"预期输出",而要保留输出的预期值,也就是说,我们要弥补培训的差异(当我们不传递值时一些节点)和测试阶段通过保留输出的平均值(预期)值. 在恢复激活的情况下,这种缩放确实会导致输出的线性缩放(当它们为正时),但是为什么您认为它不会影响分类模型的最终精度?至少在最后,我们通常应用非线性的Sigmoid的SoftMax,并取决于此缩放.
我已经培训了Keras中某些时间的以下模型: input_layer = Input(batch_shape=(56, 3864)) first_layer = Dense(24, input_dim=28, activation='relu', activity_regularizer=None, kernel_regularizer=None)(input_layer) first_layer = Dropout(0.3)(first_layer) second_layer = Dense(12, activation='relu')(first_layer) second_layer = Dropout(0.3)(second_layer) out = Dense(56)(second_layer) model_1 = Mod
有两种方法可以执行辍学: torch.nn.Dropout torch.nn.functional.Dropout 我问: 它们之间有区别吗? 我什么时候应该用一个? 当我切换它们时,我看不到任何性能差异. 解决方案 其他答案中已经显示了技术差异.但是,主要区别是nn.Dropout是一个有一定便利的火炬模块: 一个简短的示例来说明某些差异: import torch import torch.nn as nn class Model1(nn.Module): # Model 1 using functional dropout def __init__(self, p=0.0): super().__init__() self.p = p def forward(self, inputs): return nn.functional.dropout(inputs,
在神经网中,正则化(例如L2,辍学)通常用于减少过度拟合.例如,下面的图显示了典型的损失与时期,有和没有辍学.实线=火车,虚线=验证,蓝色=基线(无辍学),橙色=带有辍学.图由TensorFlow教程提供. 正则化延迟了验证损失开始增加的时期,但是正则化显然不会降低验证损失的最小值的最低值(至少在我的模型和上述图的教程中). 如果我们在验证损失最小时使用早期停止来停止训练(以避免过度拟合),并且如果正则化仅延迟了最小验证损失点(与减少最低验证损失值),那么似乎正则化似乎不会导致在具有更大概括的网络中,而只是减慢了培训. 如何使用正则化来减少最小验证损失(以改善模型概括)而不是仅延迟它?如果正则化仅延迟了最小验证损失而不降低损失,那么为什么要使用它? 解决方案 从单个教程情节中过度逐步化不是一个好主意.这是 很明显,如果辍学的效果是延迟收敛,那将不会有太多用处.但是,当然它不起作用始终(正如您的情节清楚地表明的那样),因此不应在默认情况下使用(可以说这是这里的课
我正在尝试使用Pytorch上的MC辍学实现贝叶斯CNN, 主要的想法是,通过在测试时间应用辍学并在许多正向通行证上运行,您可以从各种不同的模型中得到预测. 我找到了MC辍学的应用,我真的没有得到他们如何应用此方法的应用,以及他们如何确切地从预测列表中选择正确的预测 这是代码 def mcdropout_test(model): model.train() test_loss = 0 correct = 0 T = 100 for data, target in test_loader: if args.cuda: data, target = data.cuda(), target.cuda() data, target = Variable(data, volatile=True), Variable(target) output_list = []
有时我会看到有些模型使用SpatialDropout1D而不是Dropout.例如,在语音标记神经网络的一部分中,它们使用: model = Sequential() model.add(Embedding(s_vocabsize, EMBED_SIZE, input_length=MAX_SEQLEN)) model.add(SpatialDropout1D(0.2)) ##This model.add(GRU(HIDDEN_SIZE, dropout=0.2, recurrent_dropout=0.2)) model.add(RepeatVector(MAX_SEQLEN)) model.add(GRU(HIDDEN_SIZE, return_sequences=True)) model.add(TimeDistributed(Dense(t_vocabsize))) model.add(Activation("softmax"))
我有一个非常基本的查询.我制作了4个几乎相同的(输入形状)CNN,并在连接到完全连接层的馈电网络时合并了它们. 几乎相同CNN的代码: model3 = Sequential() model3.add(Convolution2D(32, (3, 3), activation='relu', padding='same', input_shape=(batch_size[3], seq_len, channels))) model3.add(MaxPooling2D(pool_size=(2, 2))) model3.add(Dropout(0.1)) model3.add(Convolution2D(64, (3, 3), activation='relu', padding='same')) model3.add(MaxPooling2D(pool_size=(2, 2))) model3.add(
我目前正在尝试找到一种方法来检索给定层"忽略"的权重(尤其是在测试阶段使用"训练"标志使用辍学时). 是否有一种简单的方法可以找到它,或者我有义务创建一个自定义的辍学层? 解决方案 没有简单的方法. KERAS'TensorFlow后端简单地调用tf.nn.dropout,它通过生成其输入大小的随机矩阵而起作用,如果随机矩阵中的相应值小于阈值,则将输入中的值设置为零. . 这是关键步骤,位于# Sample a uniform distribution on [0.0, 1.0) and select values larger than # rate. random_tensor = random_ops.random_uniform( noise_shape, seed=seed, dtype=x.dtype) keep_prob = 1 - rate ret = (1 / keep_prob) * math_ops.cast(keep_prob >= random_
是否可以在Keras中使用火车和测试阶段的辍学? 如下所述: https:https:https:https:https: github.com/soumith/ganhacks#17-iase-dropouts-in-g-in-both-both-and-and-and-test-phase 解决方案 当然,您可以将training参数设置为True 呼叫 Dropout层.这样,辍学将应用于训练和测试阶段: drp_output = Dropout(rate)(inputs, training=True) # dropout would be active in train and test phases 其他解决方案 两个答案都使我有些困惑.更简单地,您可能会发现自己在做这样的事情: model = Model(...) ... model.add(Dropout(0.5)) ... model.fit(...) # invokes
我有两个训练有素的型号(model_A和model_B),并且两个都有辍学层.我已经冻结了model_A和model_B,并将它们与新的密集层合并以获取model_AB(但我尚未删除model_A's and model_B的辍学层). model_AB的重量将是不可训练的,除了附加的密集层. 现在我的问题是:model_A>和model_B active(即掉落神经元)中的辍学层是model_AB? 解决方案 简短答案:辍学层将继续在训练期间脱落神经元,即使您将其trainable属性设置为False. 长答案: keras中有两个不同的概念: 更新一层的权重和状态:这是使用该层的trainable属性控制的不会更新. 一层在训练和测试阶段中的行为:您知道的一层,例如辍学,在训练和测试阶段时可能具有不同的行为.使用keras.backend.set_learning_phase()设置KERAS的学习阶段.例如,当您调用model.fit(...)时,学习阶
model.eval()方法修改了某些模块(层),这些模块在训练和推理过程中必须采取不同的行为.在 这仅对某些模块具有[]效应.有关其在培训/评估模式中的行为的详细信息,请参见特定模块的文档,如果受到影响,例如Dropout,BatchNorm,等等 是否有详尽的列表受到影响? 解决方案 除了 @iacob : 基类 模块 标准 rnn lstm gru dropout > 0(默认:0) 变压器层 变压器 transformerencoder transformerDecoder dropout > 0(Transformer默认值:0.1) 懒惰变体 lazybatchnorm 当前每晚 track_running_stats=True 其他解决方案 搜索 站点: https://pytorch.org/docs/stable/stable/generated/generated/torch.nn. " 在评估期间" 在Google上
此代码试图利用辍学的自定义实现: %reset -f import torch import torch.nn as nn # import torchvision # import torchvision.transforms as transforms import torch import torch.nn as nn import torch.utils.data as data_utils import numpy as np import matplotlib.pyplot as plt import torch.nn.functional as F num_epochs = 1000 number_samples = 10 from sklearn.datasets import make_moons from matplotlib import pyplot from pandas import DataFrame # generate 2d classif
我有一个由3个LSTM层组成的模型,然后是批处理范围层,最后是致密层.这是代码: def build_uncomplied_model(hparams): inputs = tf.keras.Input(shape=(None, hparams["n_features"])) x = return_RNN(hparams["rnn_type"])(hparams["cell_size_1"], return_sequences=True, recurrent_dropout=hparams['dropout'])(inputs) x = return_RNN(hparams["rnn_type"])(hparams["cell_size_2"], return_sequences=True)(x) x = return_RNN(hparams["rnn_type"])(hparams["cell_size_3"], return_sequences=
在Keras中,您可以指定这样的辍学层: model.add(Dropout(0.5)) 但是,使用GRU单元格,您可以将辍学指定为构造函数中的参数: model.add(GRU(units=512, return_sequences=True, dropout=0.5, input_shape=(None, features_size,))) 有什么区别?一个比另一个更可取吗? 在 keras的文档请参阅"使用LSTM的序列分类") 解决方案 复发层一遍又一遍地执行相同的重复操作. 在每个时间步中,它需要两个输入: 您的输入(序列的一步) 内部输入(例如,可以是上一个步骤的输出) 请注意,输入和输出的尺寸可能不匹配,这意味着"输入"维度将与"复发输入(上一步/状态)" dimesions. 然后,在每个经常性时间段中,都有两个操作,有两个不同的内核: 一个内核应用于"输入"
这是我定义的模型,它是一个简单的LSTM,具有2个完全连接的层. import copy import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim class mylstm(nn.Module): def __init__(self,input_dim, output_dim, hidden_dim,linear_dim): super(mylstm, self).__init__() self.hidden_dim=hidden_dim self.lstm=nn.LSTMCell(input_dim,self.hidden_dim) self.linear1=nn.Linear(hidden_dim,linear_dim) self.linear2=nn.Lin
来自Keras文档: 辍学:漂浮在0到1之间. 输入的线性转换. recurrent_dropout:浮动在0到1之间. 删除复发状态的线性转换. 任何人都可以指向每个辍学的下图下图的位置吗? 解决方案 我建议您看看(第一部分)本文.定期辍学应用于输入和/或输出,这意味着垂直箭头x_t和h_t.在您的情况下,如果将其作为参数添加到图层中,它将掩盖输入;您可以在复发层之后添加一个辍学层,以掩盖输出.经常性辍学蒙版(或"掉落")复发单元之间的连接;那将是图片中的水平箭头. 这张照片取自上面的论文.在左侧,在输入和输出上定期辍学.在右边,常规辍学加上复发液掉落: (在这种情况下,忽略箭头的颜色;在纸张中,他们在每个时间段上都要保留相同的辍学蒙版) ) 其他解决方案 上面回答要重点介绍了一种复发的辍学方法之一,但Tensorflow和keras不使用一种方法. tensorflow doc . keras/tf指的是 semeniuta等人提出的
我试图在测试过程中使用辍学的回归问题预测不确定性,按照 Yarin Gal的文章.我使用KERAS的后端功能创建了一个 stack Everflow溢出问题的问题的答案的答案.该类将NN模型作为输入,并在测试过程中随机删除神经元,以给出随机估计值,而不是预测时间序列的确定性输出. i创建一个简单的编码器模型,如下图所示,用于在训练过程中使用0.1辍学的预测: input_sequence = Input(shape=(lookback, train_x.shape[2])) encoder = LSTM(128, return_sequences=False)(input_sequence) r_vec = RepeatVector(forward_pred)(encoder) decoder = LSTM(128, return_sequences=True, dropout=0.1)(r_vec) #maybe use dropout=0.1 output = TimeD
我在模型中使用辍学层.当我使用时间数据时,我希望 noings_shape 在per timeStep - >(batch_size,1,功能). 问题是,如果我使用不适合提供样本的批处理大小,我会收到一条错误消息.示例: batch_size = 2,samples = 7. 其他层(我的情况:掩蔽,密集和LSTM)显然没有问题,只需在最后一个而不适合的样品中使用较小的批次. ConcreteError: 训练数据形状为:[23,300,34] batchsize = 3 无效的符号(有关追溯见上文):不兼容的形状: [2,300,34] vs. [3,1,34] [[node:dropout_18/cond/dropt/mul = = mul [t = dt_float, _device ="/job:localhost/replica:0/任务:0/设备:cpu:0"](dropout_18/cond/dropt/div, dropout_18/cond/dro