- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
TL;DR 我的模型训练了 1 个时期 - 用于测试目的。然而,当多次评估时,每次我使用相同的训练数据运行 evaluate_generator
方法时,都会产生不同的准确度。为什么会发生这种情况?在同一模型上多次评估相同的训练数据时,有没有办法获得相同的准确率?
我正在研究对话行为分类的语言问题,我的模型基于this纸。使用 keras
和 keras_contrib
存储库提供的工具,我正在复制确切的模型,但我有一个问题,为什么评估会给出不同的准确率。
作为引用,我训练了一个周期的模型,然后使用 keras_contrib
模块提供的实用程序 save_load_utils
将训练后的模型保存在文件中。然而,每当我使用这些权重运行模型(这些权重是针对单个时期进行训练的)时,我都会得到不同的准确率。我试了5-10次,范围在68%到74%之间,这个范围是比较大的。当我加载预训练(即 1 epoch)模型权重时,我期望获得相同的精度。 (即缺乏 float 的任何精度差异)但是,在此速率下结果的方差表明我可能做错了一些事情。
有谁知道为什么 model.evaluate_generator
方法每次以相同的权重运行它时都会生成如此不同的结果,即使我使用相同的 1-epoch-训练模型的权重来评估它?有什么方法可以修复我的评估代码,以便每次评估时为同一训练模型获得的准确性都是相同的? (即考虑浮点运算引起的任何微小差异)
下面是所有相关代码。与标准 StackOverflow 问题相比,代码示例有点长,但我想包含代码的所有相关部分。对于代码的长度,向 Python 程序员致歉。我是一名新手 Python 程序员,我可能可以用更简洁、Python 惯用的方式编写整个代码。
模型准备尾声:
def prepare_kadjk_model(max_mini_batch_size,
max_conversation_length, timesteps, num_word_dimensions,
word_to_index, word_vec_dict,
num_tags):
#Hyperparameters
m = timesteps
h = timesteps
model = Sequential()
dictionary_size = len(word_to_index) + 1
embedding_weights = numpy.zeros((dictionary_size, num_word_dimensions))
for word, index in word_to_index.items():
embedding_weights[index, :] = word_vec_dict[word]
# define inputs here
embedding_layer = Embedding(dictionary_size, num_word_dimensions,
weights=[embedding_weights],
embeddings_regularizer=regularizers.l2(0.0001))
model.add(TimeDistributed(embedding_layer,
input_shape=(max_conversation_length, timesteps)))
model.add(TimeDistributed(Bidirectional(LSTM(m // 2, return_sequences=True,
kernel_regularizer=regularizers.l2(0.0001)))))
model.add(TimeDistributed(Dropout(0.2)))
model.add(TimeDistributed(GlobalMaxPooling1D()))
model.add(Bidirectional(LSTM(h // 2, return_sequences = True,
kernel_regularizer=regularizers.l2(0.0001)), merge_mode='concat'))
model.add(Dropout(0.2))
crf = CRF(num_tags, sparse_target=False, kernel_regularizer=regularizers.l2(0.0001))
model.add(crf)
model.compile(optimizer, loss = crf_loss,
metrics=[crf_accuracy])
return model
批量准备功能:
def form_mini_batches(dataset_x, max_mini_batch_size):
num_conversations = len(dataset_x)
# Form mini batches of equal-length conversations
mini_batches = {}
for i in range(num_conversations):
num_utterances = len(dataset_x[i])
if num_utterances in mini_batches:
mini_batches[num_utterances].append( i )
else:
mini_batches[num_utterances] = [ i ]
# Enforce max_batch_size on previously formed mini batches
mini_batch_list = []
for conversations in mini_batches.values():
mini_batch_list += [conversations[x: x + max_mini_batch_size] for x in range(0, len(conversations), max_mini_batch_size)]
return mini_batch_list
def kadjk_batch_generator(dataset_x, dataset_y, tag_indices,
mini_batch_list, max_conversation_length,
timesteps, num_word_dimensions, num_tags,
word_index_to_append, tag_index_to_append):
num_mini_batches = len(mini_batch_list)
# Shuffle the order of batches
index_list = [x for x in range(num_mini_batches)]
random.shuffle(index_list)
k = -1
while True:
k = (k + 1) % len(index_list)
index = index_list[k]
conversation_indices = mini_batch_list[index]
num_conversations = len(conversation_indices)
batch_features = numpy.empty(shape = (num_conversations, max_conversation_length, timesteps),
dtype = int)
label_list = []
for i in range(num_conversations):
utterances = dataset_x[conversation_indices[i]]
labels = copy.deepcopy(dataset_y[conversation_indices[i]])
num_utterances = len(utterances)
num_labels_to_append = max(0, max_conversation_length - len(labels))
labels += [tag_index_to_append] * num_labels_to_append
tags = to_categorical(labels, num_tags)
del labels
for j in range(num_utterances):
utterance = copy.deepcopy(utterances[j])
num_to_append = max(0, timesteps - len(utterance))
if num_to_append > 0:
appendage = [word_index_to_append] * num_to_append
utterance += appendage
batch_features[i][j] = utterance
del utterance
remaining_space = (max_conversation_length - num_utterances, timesteps)
batch_features[i][num_utterances:] = numpy.ones(remaining_space) * word_index_to_append
label_list.append(tags)
batch_labels = numpy.array(label_list)
del label_list
yield batch_features, batch_labels
训练功能:
def train_kadjk(model, training, validation, num_epochs_to_train, tag_indices, max_mini_batch_size,
max_conversation_length, timesteps, num_word_dimensions, num_tags,
end_of_line_word_index, uninterpretable_label_index):
training_mini_batch_list = form_mini_batches(training[0], max_mini_batch_size)
validation_mini_batch_list = form_mini_batches(validation[0], max_mini_batch_size)
num_training_steps = len(training_mini_batch_list)
num_validation_steps = len(validation_mini_batch_list)
early_stop = EarlyStopping(patience = 5)
change_learning_rate = LearningRateScheduler(learning_rate_scheduler)
model.fit_generator(kadjk_batch_generator(training[0], training[1], tag_indices,
training_mini_batch_list, max_conversation_length,
timesteps, num_word_dimensions, num_tags,
end_of_line_word_index, uninterpretable_label_index),
steps_per_epoch = num_training_steps,
epochs = num_epochs_to_train,
validation_data = kadjk_batch_generator(validation[0], validation[1],
tag_indices,
validation_mini_batch_list,
max_conversation_length, timesteps,
num_word_dimensions, num_tags,
end_of_line_word_index,
uninterpretable_label_index),
validation_steps = num_validation_steps,
callbacks = [early_stop, change_learning_rate])
评估函数:
def evaluate_kadjk(model, testing, tag_indices, max_mini_batch_size, max_conversation_length,
timesteps, num_word_dimensions, num_tags,
end_of_line_word_index, uninterpretable_label_index):
testing_mini_batch_list = form_mini_batches(testing[0], max_mini_batch_size)
num_testing_steps = len(testing_mini_batch_list)
score = model.evaluate_generator(kadjk_batch_generator(testing[0], testing[1],
tag_indices,
testing_mini_batch_list,
max_conversation_length, timesteps,
num_word_dimensions, num_tags,
end_of_line_word_index,
uninterpretable_label_index),
steps = num_testing_steps)
print("len(score):" + str(len(score)))
print("score:" + str(score))
您可以导航here为了更全面地了解我正在从事的研究生论文项目,但我试图为任何可以提供帮助的人提供所需的所有相关功能。
最佳答案
我深入研究了 keras
的 Github 问题,并在 this 中找到了错误的可能原因。评论。
显然,与批量归一化层类似,使用 Dropout 层会导致变化,正如我在问题中所描述的那样。 Dropout 层会导致神经元在训练期间被丢弃。因此,当模型训练完成时,最初编译的模型中并非所有神经元都存在。
如果使用函数keras_contrib.save_load_utils.save_all_weights
保存模型权重,则会保存模型的权重。但是,一旦您终止该过程而不保存最终的神经元配置(不仅仅是权重),模型的最终配置就会丢失。如前所述here ,save_all_weights
,这是我用来保存模型的函数,并不保存模型本身的配置。
因此,如果您在不同的进程中编译模型,并加载使用 keras_contrib.save_load_utils.load_all_weights 保存的权重,即使您使用与测试模型相同的数据来测试模型在上一次运行中,新编译的模型有一些额外的神经元,这些神经元在原始模型的训练过程中被丢弃。这种配置上的差异,再加上它们可能(在本例中)使用随机权重进行初始化的事实,导致评估每次运行时都会给出不同的准确率。
解决方案似乎不仅是记录权重,而且还记录所有配置。这可以简单地通过使用模型实例的 save
方法而不是 keras_contrib.save_load_utils.save_all_weights
来完成。显然,要在不同的进程中重新加载整个模型,应使用 keras.models.load_model
而不是 keras_contrib.save_load_utils.load_all_weights
。
关于python - keras-evaluate_generator 使用相同的训练数据产生不同的准确率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55731245/
我在网上搜索但没有找到任何合适的文章解释如何使用 javascript 使用 WCF 服务,尤其是 WebScriptEndpoint。 任何人都可以对此给出任何指导吗? 谢谢 最佳答案 这是一篇关于
我正在编写一个将运行 Linux 命令的 C 程序,例如: cat/etc/passwd | grep 列表 |剪切-c 1-5 我没有任何结果 *这里 parent 等待第一个 child (chi
所以我正在尝试处理文件上传,然后将该文件作为二进制文件存储到数据库中。在我存储它之后,我尝试在给定的 URL 上提供文件。我似乎找不到适合这里的方法。我需要使用数据库,因为我使用 Google 应用引
我正在尝试制作一个宏,将下面的公式添加到单元格中,然后将其拖到整个列中并在 H 列中复制相同的公式 我想在 F 和 H 列中输入公式的数据 Range("F1").formula = "=IF(ISE
问题类似于this one ,但我想使用 OperatorPrecedenceParser 解析带有函数应用程序的表达式在 FParsec . 这是我的 AST: type Expression =
我想通过使用 sequelize 和 node.js 将这个查询更改为代码取决于在哪里 select COUNT(gender) as genderCount from customers where
我正在使用GNU bash,版本5.0.3(1)-发行版(x86_64-pc-linux-gnu),我想知道为什么简单的赋值语句会出现语法错误: #/bin/bash var1=/tmp
这里,为什么我的代码在 IE 中不起作用。我的代码适用于所有浏览器。没有问题。但是当我在 IE 上运行我的项目时,它发现错误。 而且我的 jquery 类和 insertadjacentHTMl 也不
我正在尝试更改标签的innerHTML。我无权访问该表单,因此无法编辑 HTML。标签具有的唯一标识符是“for”属性。 这是输入和标签的结构:
我有一个页面,我可以在其中返回用户帖子,可以使用一些 jquery 代码对这些帖子进行即时评论,在发布新评论后,我在帖子下插入新评论以及删除 按钮。问题是 Delete 按钮在新插入的元素上不起作用,
我有一个大约有 20 列的“管道分隔”文件。我只想使用 sha1sum 散列第一列,它是一个数字,如帐号,并按原样返回其余列。 使用 awk 或 sed 执行此操作的最佳方法是什么? Accounti
我需要将以下内容插入到我的表中...我的用户表有五列 id、用户名、密码、名称、条目。 (我还没有提交任何东西到条目中,我稍后会使用 php 来做)但由于某种原因我不断收到这个错误:#1054 - U
所以我试图有一个输入字段,我可以在其中输入任何字符,但然后将输入的值小写,删除任何非字母数字字符,留下“。”而不是空格。 例如,如果我输入: 地球的 70% 是水,-!*#$^^ & 30% 土地 输
我正在尝试做一些我认为非常简单的事情,但出于某种原因我没有得到想要的结果?我是 javascript 的新手,但对 java 有经验,所以我相信我没有使用某种正确的规则。 这是一个获取输入值、检查选择
我想使用 angularjs 从 mysql 数据库加载数据。 这就是应用程序的工作原理;用户登录,他们的用户名存储在 cookie 中。该用户名显示在主页上 我想获取这个值并通过 angularjs
我正在使用 autoLayout,我想在 UITableViewCell 上放置一个 UIlabel,它应该始终位于单元格的右侧和右侧的中心。 这就是我想要实现的目标 所以在这里你可以看到我正在谈论的
我需要与 MySql 等效的 elasticsearch 查询。我的 sql 查询: SELECT DISTINCT t.product_id AS id FROM tbl_sup_price t
我正在实现代码以使用 JSON。 func setup() { if let flickrURL = NSURL(string: "https://api.flickr.com/
我尝试使用for循环声明变量,然后测试cols和rols是否相同。如果是,它将运行递归函数。但是,我在 javascript 中执行 do 时遇到问题。有人可以帮忙吗? 现在,在比较 col.1 和
我举了一个我正在处理的问题的简短示例。 HTML代码: 1 2 3 CSS 代码: .BB a:hover{ color: #000; } .BB > li:after {
我是一名优秀的程序员,十分优秀!