小编0vb*_*vbb的帖子

Keras:save_model真的保存了所有优化器权重吗?

假设您有一个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)

因此,这仅保存基本参数,但不保存每变量优化器权重.

然而,倾倒后configsave_model,它看起来像一些优化权重被保存为好(链接).不幸的是,如果优化器的每个重量都保存下来,我真的无法理解.


因此,如果您想继续在新会话中训练模型,load_model优化器的状态是否真的与上次培训会话中的100%相同?例如,在具有动量的SGD的情况下,它是否保存所有每变量动量?

或者一般来说,如果你停止并恢复训练,它是否会对训练产生影响save/load_model

keras

9
推荐指数
1
解决办法
1314
查看次数

Pycharm SSH远程解释器:编辑器无法识别模块

我目前正在尝试通过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”文件,但直到现在仍无法使用。

python ssh pycharm root-framework pyroot

5
推荐指数
0
解决办法
1564
查看次数

Keras:显示多标签回归中每个标签的损失

假设您有一个以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_predy_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_predy_true向量中单个索引的损失,但这感觉像是一种解决方法:

def mean_absolute_error_label_0(y_true, y_pred):
    # calculate the loss only for the …
Run Code Online (Sandbox Code Playgroud)

python regression keras

5
推荐指数
1
解决办法
1830
查看次数

Keras:在特定层之后停止渐变

假设您有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_1x_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

5
推荐指数
1
解决办法
2040
查看次数

TF包装:Keras与Tensorpack的表现

我对Keras与其他TF Wrappers(如Tensorpack)的训练表现有疑问.

Q&A会议期间,Keras的作者表示该软件包没有性能成本:

Keras提供了一种更简单,更快捷的方法来在TensorFlow中构建和训练模型,因为模型仍由相同的TensorFlow引擎运行,因此无需性能成本.

另一方面,Tensorpack github声称它比Keras快2倍,即使是微小的CNN:

Tensorpack培训师几乎总是比基于feed_dict的包装更快.即使在一个微小的CNN示例中,训练的运行速度也比同等的Keras代码快2倍.

所以现在我想知道以下内容:谁是对的?在训练中,两倍对我来说非常重要.

performance keras tensorflow

4
推荐指数
1
解决办法
1601
查看次数