假设您有一个Keras模型,其中包含您通过Adam保存的优化器save_model.如果再次加载模型load_model,它是否真的加载所有优化器参数+权重?
根据save_model(Link)的代码,Keras保存优化器的配置:
f.attrs['training_config'] = json.dumps({
'optimizer_config': {
'class_name': model.optimizer.__class__.__name__,
'config': model.optimizer.get_config()},
Run Code Online (Sandbox Code Playgroud)
例如,在Adam的情况下(Link),如下:
def get_config(self):
config = {'lr': float(K.get_value(self.lr)),
'beta_1': float(K.get_value(self.beta_1)),
'beta_2': float(K.get_value(self.beta_2)),
'decay': float(K.get_value(self.decay)),
'epsilon': self.epsilon}
Run Code Online (Sandbox Code Playgroud)
因此,这仅保存基本参数,但不保存每变量优化器权重.
然而,倾倒后config的save_model,它看起来像一些优化权重被保存为好(链接).不幸的是,如果优化器的每个重量都保存下来,我真的无法理解.
因此,如果您想继续在新会话中训练模型,load_model优化器的状态是否真的与上次培训会话中的100%相同?例如,在具有动量的SGD的情况下,它是否保存所有每变量动量?
或者一般来说,如果你停止并恢复训练,它是否会对训练产生影响save/load_model?
我目前正在尝试通过SSH使用远程解释器运行PyCharm。
连接本身运行良好,但是编辑器无法识别我导入的模块之一“ ROOT”(“ import ROOT”语句中的“ No module named ROOT”)。
在可以在任何python会话中导入“ ROOT”之前(使用Terminal而不是PyCharm时),必须调用带有环境变量等的“ thisroot.sh”文件。因此,借助于.bash_profile / .bashrc文件,它是在每次ssh登录时获得的。因此,如果在SSH终端中启动python之前未获取.sh文件,则python无法找到该模块。
因此,我认为问题在于,建立连接后,PyCharm不会调用.bashrc文件(因此不会提供“ thisroot.sh”文件的源代码)。如果我直接在PyCharm中打开远程Python控制台,则也找不到“ ROOT”模块。
对于不太复杂的模块,可以手动将环境变量添加到PyCharm设置中。但是对于我的模块,这实际上是不可行的。
有没有办法让PyCharm在编辑器中识别模块(并在远程Python控制台中找到它)?我曾尝试使用PyCharm StartUp脚本设置来采购“ thisroot”文件,但直到现在仍无法使用。
假设您有一个以n神经元作为输出的 Keras 模型,其中每个神经元都与一个回归变量(例如汽车的速度、汽车的高度等)相关联,如下面的代码片段所示:
# define Keras model
input_layer = Input(shape=shape)
... # e.g. conv layers
x = Dense(n, activation='linear')(x)
model = Model(inputs=input_layer, outputs=x)
model.compile(loss='mean_absolute_error', optimizer='sgd', metrics=['mean_squared_error'])
history = model.fit_generator(...)
Run Code Online (Sandbox Code Playgroud)
现在,存储在历史字典中的 MAE 损失是单个数字,它是基于n- 维y_pred和y_true
数组计算的。因此,单个损失值是n标签的单个损失的平均值,正如在 Keras MAE 函数中所见:
def mean_absolute_error(y_true, y_pred):
return K.mean(K.abs(y_pred - y_true), axis=-1)
Run Code Online (Sandbox Code Playgroud)
但是,我想获得一个包含每个n标签损失的历史对象,即{loss: {'speed': loss_value_speed, 'height': loss_value_height}}. 理想情况下,训练期间的进度条还应显示单个损失而不是组合损失。
我怎样才能做到这一点?
我想可以为每个输出神经元编写一个自定义指标,它只计算y_pred和y_true向量中单个索引的损失,但这感觉像是一种解决方法:
def mean_absolute_error_label_0(y_true, y_pred):
# calculate the loss only for the …Run Code Online (Sandbox Code Playgroud) 假设您有Keras NN模型,如何在特定层之后的反向传播中停止梯度?
即,如果我们有一个带有两个输出的模型:
input_layer = Input(shape=(10,10,3))
x = Convolution2D(...)(input_layer)
x = Activation('relu')(x)
x = Flatten()(x)
x_1 = Dense(64)(x)
x_1 = Dense(32)(x_1)
x_1 = Dense(2)(x_1)
x_2 = Dense(64)(x)
x_2 = Dense(32)(x_2)
x_2 = Dense(2)(x_2)
model = Model(inputs=input_layer, outputs=[x_1, x_2])
Run Code Online (Sandbox Code Playgroud)
如何x_1在x_1 = Dense(64)(x)层之后停止输出的梯度,以免在卷积层的权重更新中不计入它?
根据在keras的特定层中停止渐变反向道具的答案,我会在x_1致密层之前添加一个lambda 层,但我不确定:
x_1 = Dense(64)(x)
x_1_stop_grad = Lambda(lambda x: K.stop_gradient(x))(x_1)
x_1 = Dense(32)(x_1)
x_1 = Dense(2)(x_1)
Run Code Online (Sandbox Code Playgroud)
我是否必须在第一个致密层之前或之后添加lambda x_1层?
我对Keras与其他TF Wrappers(如Tensorpack)的训练表现有疑问.
在Q&A会议期间,Keras的作者表示该软件包没有性能成本:
Keras提供了一种更简单,更快捷的方法来在TensorFlow中构建和训练模型,因为模型仍由相同的TensorFlow引擎运行,因此无需性能成本.
另一方面,Tensorpack github声称它比Keras快2倍,即使是微小的CNN:
Tensorpack培训师几乎总是比基于feed_dict的包装更快.即使在一个微小的CNN示例中,训练的运行速度也比同等的Keras代码快2倍.
所以现在我想知道以下内容:谁是对的?在训练中,两倍对我来说非常重要.