我有一个模型,我已经训练了40个时代.我为每个时代保留了检查站,也保存了模型model.save()
.培训的代码是
n_units = 1000
model = Sequential()
model.add(LSTM(n_units, input_shape=(None, vec_size), return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(n_units, return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(n_units))
model.add(Dropout(0.2))
model.add(Dense(vec_size, activation='linear'))
model.compile(loss='mean_squared_error', optimizer='adam')
# define the checkpoint
filepath="word2vec-{epoch:02d}-{loss:.4f}.hdf5"
checkpoint = ModelCheckpoint(filepath, monitor='loss', verbose=1, save_best_only=True, mode='min')
callbacks_list = [checkpoint]
# fit the model
model.fit(x, y, epochs=40, batch_size=50, callbacks=callbacks_list)
Run Code Online (Sandbox Code Playgroud)
但是,当加载模型并再次训练时,它会重新开始,就像之前没有训练过一样.损失不是从上次培训开始的.
让我感到困惑的是,当我用重新定义的模型结构加载模型时load_weight
,model.predict()
效果很好.因此我相信模型权重被加载.
model = Sequential()
model.add(LSTM(n_units, input_shape=(None, vec_size), return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(n_units, return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(n_units))
model.add(Dropout(0.2))
model.add(Dense(vec_size, activation='linear'))
filename = "word2vec-39-0.0027.hdf5"
model.load_weights(filename)
model.compile(loss='mean_squared_error', optimizer='adam')
Run Code Online (Sandbox Code Playgroud)
但是,当我继续训练时
filepath="word2vec-{epoch:02d}-{loss:.4f}.hdf5"
checkpoint = ModelCheckpoint(filepath, monitor='loss', …
Run Code Online (Sandbox Code Playgroud) 根据Tensorflow的官方网站(https://www.tensorflow.org/api_docs/python/tf/contrib/rnn/BasicLSTMCell#zero_state),zero_state必须指定batch_size.我发现的许多例子使用此代码:
init_state = lstm_cell.zero_state(batch_size, dtype=tf.float32)
outputs, final_state = tf.nn.dynamic_rnn(lstm_cell, X_in,
initial_state=init_state, time_major=False)
Run Code Online (Sandbox Code Playgroud)
对于培训步骤,可以修复批量大小.但是,在预测时,测试集的形状可能与训练集的批量大小不同.例如,我的一批训练数据具有形状[100,255,128].批量大小为100,包含255个步骤和128个输入.而测试集是[2000,255,128].我无法预测,因为在dynamic_rnn(initial_state)中,它已经设置了一个固定的batch_size = 100.如何修复此问题?
谢谢.
我正在用Rcpp制作一个R包.它在我安装了Rtools的机器上工作正常.但最近,我尝试在不同的机器(Windows)上本地安装我的软件包并得到编译错误.原因是在那台机器上没有g ++编译器(对于Windows,g ++与Rtools一起提供).安装Rtools之后,它运行得很好.
所以问题是,如果我将它上传到CRAN,是否还需要用户手动安装Rtools?或者该功能install.package()
是否为它们检测并安装Rtools?
另外,如果你们知道一些用Rcpp写的包,请告诉我.我想看看它是如何工作的.
我正在开发一个带有 C++ 函数的 R 包。我使用 Rcpp。编写和测试时一切正常。但是,当我完成并循环运行它时,我偶尔会收到以下警告和错误:
警告:“.Call”中的堆栈不平衡,78 然后是 77
警告:'{' 中的堆栈不平衡,75 然后是 74
警告:“.Call”中的堆栈不平衡,78 然后是 79
警告:'{' 中的堆栈不平衡,75 然后是 76
警告:“.Call”中的堆栈不平衡,78 然后是 77
警告:'{' 中的堆栈不平衡,75 然后是 74
所以我用谷歌搜索堆栈不平衡,我发现:
本文指出堆栈不平衡通常是由语言之间调用约定的差异(不匹配)引起的。据我所知,callng约定是调用者函数删除局部变量还是被调用者函数删除的约定。
我发现了这个:
http://www.stats.uwo.ca/faculty/murdoch/software/compilingDLLs/
它说 R 正在使用cdecl
而 C++ 使用stdcall
.
“如果您的函数使用了
stdcall
而不是cdecl
,则返回时可能会发生崩溃,因为您的参数将在它们已经消失后从堆栈中删除。”
如果我在声明中犯了任何错误,请告诉我。
这是我的 R 代码调用的 C++ 函数:
//[[Rcpp::export]]
int compute(SEXP p_in, Rcpp::NumericVector a) {
Rcpp::XPtr<emcdf> p(p_in);
p->cdf(a);
return p->getResult();
}
//p_in is an external pointer(pointer to an emcdf object in C++)
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是,我该如何解决这个问题?
我感谢您的帮助。