我的问题很简单,什么是验证数据传递的顺序模型model.fit 使用?
并且,它是否会影响模型的训练方式(通常使用验证集,例如,在模型中选择超参数,但我认为这不会发生在这里)?
我在谈论可以像这样传递的验证集:
# Create model
model = Sequential()
# Add layers
model.add(...)
# Train model (use 10% of training set as validation set)
history = model.fit(X_train, Y_train, validation_split=0.1)
# Train model (use validation data as validation set)
history = model.fit(X_train, Y_train, validation_data=(X_test, Y_test))
Run Code Online (Sandbox Code Playgroud)
我调查了一下,我看到keras.models.Sequential.fit
调用keras.models.training.fit
,这就好比创建变量val_acc
和val_loss
(可从回调来访问).keras.models.training.fit
还调用keras.models.training._fit_loop
,它将验证数据添加到callbacks.validation_data
调用中,并且还调用keras.models.training._test_loop
,这将self.test_function
在模型的批量上循环验证数据.此函数的结果用于填充日志的值,这些值是可从回调中访问的值.
看到这一切之后,我觉得传递给它的验证集model.fit
并不用于在训练期间验证任何东西,它的唯一用途是获得关于训练模型在完全独立集合的每个时期中如何执行的反馈.因此,使用相同的验证和测试集会很好,对吧?
任何人都可以确认除了从回调中读取之外,model.fit中的验证集是否还有其他任何目标?
我试图用Keras实现加权二进制交叉熵,但我不确定代码是否正确.训练输出似乎有点令人困惑.在几个时代之后,我得到的精确度为~0.15.我认为这太少了(即使是随机猜测).
输出中通常有大约11%的值和89%的零,因此权重为w_zero = 0.89且w_one = 0.11.
我的代码:
def create_weighted_binary_crossentropy(zero_weight, one_weight):
def weighted_binary_crossentropy(y_true, y_pred):
# Original binary crossentropy (see losses.py):
# K.mean(K.binary_crossentropy(y_true, y_pred), axis=-1)
# Calculate the binary crossentropy
b_ce = K.binary_crossentropy(y_true, y_pred)
# Apply the weights
weight_vector = y_true * one_weight + (1. - y_true) * zero_weight
weighted_b_ce = weight_vector * b_ce
# Return the mean error
return K.mean(weighted_b_ce)
return weighted_binary_crossentropy
Run Code Online (Sandbox Code Playgroud)
也许有人看到什么错了?
谢谢
在Keras,
我正在尝试导入_obtain_input_shape
如下:
from keras.applications.imagenet_utils import _obtain_input_shape
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误:
ImportError:无法导入名称'_obtain_input_shape'
我试图导入_obtain_input_shape的原因是我可以确定输入形状(以便按如下方式加载VGG-Face:
我用它来确定输入张量的正确输入形状如下:
input_shape = _obtain_input_shape(input_shape,
default_size=224,
min_size=48,
data_format=K.image_data_format(),
require_flatten=include_top)`
Run Code Online (Sandbox Code Playgroud)
请协助?提前致谢.
我正在训练一个 keras 序列模型。我希望在训练没有进展时降低学习率。
我使用 ReduceLROnPlateau 回调。
在前 2 个 epoch 没有进展后,学习率按预期降低。但随后每 2 个 epoch 减少一次,导致训练停止进展。
那是keras错误吗?或者我以错误的方式使用该功能?
编码:
earlystopper = EarlyStopping(patience=8, verbose=1)
checkpointer = ModelCheckpoint(filepath = 'model_zero7.{epoch:02d}-{val_loss:.6f}.hdf5',
verbose=1,
save_best_only=True, save_weights_only = True)
reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.2,
patience=2, min_lr=0.000001, verbose=1)
history_zero7 = model_zero.fit_generator(bach_gen_only1,
validation_data = (v_im, v_lb),
steps_per_epoch=25,epochs=100,
callbacks=[earlystopper, checkpointer, reduce_lr])
Run Code Online (Sandbox Code Playgroud)
输出:
Epoch 00006: val_loss did not improve from 0.68605
Epoch 7/100
25/25 [==============================] - 213s 9s/step - loss: 0.6873 - binary_crossentropy: 0.0797 - dice_coef_loss: -0.8224 - jaccard_distance_loss_flat: 0.2998 - val_loss: 0.6865 …
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种在使用Keras创建的神经网络中获得变量重要性的正确或最佳方法.我目前这样做的方式是我只考虑第一层中变量的权重(而不是偏差),假设更重要的变量在第一层中具有更高的权重.有没有其他/更好的方法呢?
似乎已经有几个线程/问题,但在我看来,这已经解决了:
https://github.com/fchollet/keras/issues/6050
https://github.com/fchollet/keras/issues/3230
人们似乎遇到了变量初始化或度量标准为0的问题.
我需要计算不同的细分指标,并希望在我的Keras模型中包含tf.metric.mean_iou.这是迄今为止我能够想到的最好的:
def mean_iou(y_true, y_pred):
score, up_opt = tf.metrics.mean_iou(y_true, y_pred, NUM_CLASSES)
K.get_session().run(tf.local_variables_initializer())
return score
model.compile(optimizer=adam, loss='categorical_crossentropy', metrics=[mean_iou])
Run Code Online (Sandbox Code Playgroud)
此代码不会抛出任何错误,但mean_iou总是返回0.我相信这是因为不评估up_opt.我已经看到在TF 1.3之前,人们已经建议使用control_flow_ops.with_dependencies([up_opt],score)来实现这一点.这在TF 1.3中似乎不太可能.
总之,如何评估Keras 2.0.6中的TF 1.3指标?这似乎是一个非常重要的特征.
在一些特征提取实验中,我注意到“model.pop()”功能没有按预期工作。对于像 vgg16 这样的预训练模型,在使用 'model.pop()' 后,model.summary() 显示该层已被删除(预期有 4096 个特征),但是在将图像通过新模型时,结果相同特征数量(1000)作为原始模型。无论移除多少层,包括一个完全空的模型,它都会生成相同的输出。寻求您对可能出现的问题的指导。
#Passing an image through the full vgg16 model
model = VGG16(weights = 'imagenet', include_top = True, input_shape = (224,224,3))
img = image.load_img( 'cat.jpg', target_size=(224,224) )
img = image.img_to_array( img )
img = np.expand_dims( img, axis=0 )
img = preprocess_input( img )
features = model.predict( img )
features = features.flatten()
print(len(features)) #Expected 1000 features corresponding to 1000 imagenet classes
Run Code Online (Sandbox Code Playgroud)
1000
model.layers.pop()
img = image.load_img( 'cat.jpg', target_size=(224,224) )
img = image.img_to_array( img )
img …
Run Code Online (Sandbox Code Playgroud) 我已经使用自定义优化器编译和训练了 keras 模型。我保存了模型,但是当我尝试加载模型时,它抛出一个错误,指出ValueError: Unknown optimizer: MyOptimizer
. 我试图将 MyOptimizer 作为自定义对象传递,例如 :models.load_model('myModel.h5', custom_objects={'optimizer':MyOptimizer})
并且它仍然抛出错误。如何使用自定义对象将模型加载到 keras 模型?
这是Keras中初始v3的预处理功能.它与其他模型预处理完全不同.
def preprocess_input(x):
x /= 255.
x -= 0.5
x *= 2.
return x
Run Code Online (Sandbox Code Playgroud)
1.为什么没有平均减法?
2.为什么没有RGB到BGR?
3. [-1,1]之间的映射对于这个模型是正常的吗?
这是Keras中VGG和ResNet的预处理功能:
def preprocess_input(x, data_format=None):
if data_format is None:
data_format = K.image_data_format()
assert data_format in {'channels_last', 'channels_first'}
if data_format == 'channels_first':
# 'RGB'->'BGR'
x = x[:, ::-1, :, :]
# Zero-center by mean pixel
x[:, 0, :, :] -= 103.939
x[:, 1, :, :] -= 116.779
x[:, 2, :, :] -= 123.68
else:
# 'RGB'->'BGR'
x = x[:, :, :, ::-1]
# Zero-center …
Run Code Online (Sandbox Code Playgroud)