- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在keras blog上有一个VGG16微调的例子,但我无法重现它。
更准确地说,这里是用于在没有顶层的情况下初始化 VGG16 并卡住除最顶层以外的所有 block 的代码:
WEIGHTS_PATH_NO_TOP = 'https://github.com/fchollet/deep-learning-models/releases/download/v0.1/vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5'
weights_path = get_file('vgg16_weights.h5', WEIGHTS_PATH_NO_TOP)
model = Sequential()
model.add(InputLayer(input_shape=(150, 150, 3)))
model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(MaxPooling2D((2, 2), strides=(2, 2)))
model.add(Conv2D(128, (3, 3), activation='relu', padding='same'))
model.add(Conv2D(128, (3, 3), activation='relu', padding='same'))
model.add(MaxPooling2D((2, 2), strides=(2, 2)))
model.add(Conv2D(256, (3, 3), activation='relu', padding='same'))
model.add(Conv2D(256, (3, 3), activation='relu', padding='same'))
model.add(Conv2D(256, (3, 3), activation='relu', padding='same'))
model.add(MaxPooling2D((2, 2), strides=(2, 2)))
model.add(Conv2D(512, (3, 3), activation='relu', padding='same'))
model.add(Conv2D(512, (3, 3), activation='relu', padding='same'))
model.add(Conv2D(512, (3, 3), activation='relu', padding='same'))
model.add(MaxPooling2D((2, 2), strides=(2, 2)))
model.add(Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv1'))
model.add(Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv2'))
model.add(Conv2D(512, (3, 3), activation='relu', padding='same', name='block5_conv3'))
model.add(MaxPooling2D((2, 2), strides=(2, 2), name='block5_maxpool'))
model.load_weights(weights_path)
for layer in model.layers:
layer.trainable = False
for layer in model.layers[-4:]:
layer.trainable = True
print("Layer '%s' is trainable" % layer.name)
接下来,创建一个只有一个隐藏层的顶层模型:
top_model = Sequential()
top_model.add(Flatten(input_shape=model.output_shape[1:]))
top_model.add(Dense(256, activation='relu'))
top_model.add(Dropout(0.5))
top_model.add(Dense(1, activation='sigmoid'))
top_model.load_weights('top_model.h5')
请注意,它之前曾针对瓶颈特征进行过训练,如博文中所述。接下来,将这个顶层模型添加到基础模型中并编译:
model.add(top_model)
model.compile(loss='binary_crossentropy',
optimizer=SGD(lr=1e-4, momentum=0.9),
metrics=['accuracy'])
最终,适合猫/狗数据:
batch_size = 16
train_datagen = ImageDataGenerator(rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
test_datagen = ImageDataGenerator(rescale=1./255)
train_gen = train_datagen.flow_from_directory(
TRAIN_DIR,
target_size=(150, 150),
batch_size=batch_size,
class_mode='binary')
valid_gen = test_datagen.flow_from_directory(
VALID_DIR,
target_size=(150, 150),
batch_size=batch_size,
class_mode='binary')
model.fit_generator(
train_gen,
steps_per_epoch=nb_train_samples // batch_size,
epochs=nb_epoch,
validation_data=valid_gen,
validation_steps=nb_valid_samples // batch_size)
但这是我在尝试拟合时遇到的错误:
ValueError: Error when checking model target: expected block5_maxpool to have 4 > dimensions, but got array with shape (16, 1)
因此,基础模型中的最后一个池化层似乎有问题。或者可能我在尝试将基本模型与顶级模型连接时做错了什么。
有没有人有类似的问题?或者也许有更好的方法来构建这种“级联”模型?我正在使用 keras==2.0.0
和 theano
后端。
Note: I was using examples from gist and
applications.VGG16
utility, but has issues trying to concatenate models, I am not too familiar withkeras
functional API. So this solution I provide here is the most "successful" one, i.e. it fails only on fitting stage.
好的,这里是关于我正在尝试做的事情的一个小解释。首先,我从 VGG16 生成瓶颈特征如下:
def save_bottleneck_features():
datagen = ImageDataGenerator(rescale=1./255)
model = applications.VGG16(include_top=False, weights='imagenet')
generator = datagen.flow_from_directory(
TRAIN_DIR,
target_size=(150, 150),
batch_size=batch_size,
class_mode=None,
shuffle=False)
print("Predicting train samples..")
bottleneck_features_train = model.predict_generator(generator, nb_train_samples)
np.save(open('bottleneck_features_train.npy', 'w'), bottleneck_features_train)
generator = datagen.flow_from_directory(
VALID_DIR,
target_size=(150, 150),
batch_size=batch_size,
class_mode=None,
shuffle=False)
print("Predicting valid samples..")
bottleneck_features_valid = model.predict_generator(generator, nb_valid_samples)
np.save(open('bottleneck_features_valid.npy', 'w'), bottleneck_features_valid)
然后,我创建了一个顶级模型,并按如下方式对这些特征进行训练:
def train_top_model():
train_data = np.load(open('bottleneck_features_train.npy'))
train_labels = np.array([0]*(nb_train_samples / 2) +
[1]*(nb_train_samples / 2))
valid_data = np.load(open('bottleneck_features_valid.npy'))
valid_labels = np.array([0]*(nb_valid_samples / 2) +
[1]*(nb_valid_samples / 2))
model = Sequential()
model.add(Flatten(input_shape=train_data.shape[1:]))
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])
model.fit(train_data, train_labels,
nb_epoch=nb_epoch,
batch_size=batch_size,
validation_data=(valid_data, valid_labels),
verbose=1)
model.save_weights('top_model.h5')
基本上,有两个经过训练的模型,base_model
具有 ImageNet 权重,top_model
具有从瓶颈特征生成的权重。我想知道如何连接它们?有可能还是我做错了什么?因为正如我所见,来自@thomas-pinetz 的响应假设顶级模型没有单独训练并立即附加到模型。不确定我是否清楚,这里引用博客:
In order to perform fine-tuning, all layers should start with properly trained weights: for instance you should not slap a randomly initialized fully-connected network on top of a pre-trained convolutional base. This is because the large gradient updates triggered by the randomly initialized weights would wreck the learned weights in the convolutional base. In our case this is why we first train the top-level classifier, and only then start fine-tuning convolutional weights alongside it.
最佳答案
我认为 vgg 网络描述的权重不适合您的模型,错误源于此。无论如何,如 ( https://keras.io/applications/#vgg16 ) 中所述,有一种更好的方法可以使用网络本身来执行此操作。
你可以只使用:
base_model = keras.applications.vgg16.VGG16(include_top=False, weights='imagenet', input_tensor=None, input_shape=None)
实例化一个预训练的 vgg 网络。然后你可以卡住图层并使用模型类来实例化你自己的模型,如下所示:
x = base_model.output
x = Flatten()(x)
x = Dense(your_classes, activation='softmax')(x) #minor edit
new_model = Model(input=base_model.input, output=x)
要组合底部网络和顶部网络,您可以使用以下代码片段。使用了以下函数(Input Layer ( https://keras.io/getting-started/functional-api-guide/ )/load_model ( https://keras.io/getting-started/faq/#how-can-i-save-a-keras-model ) 和keras的函数式API):
final_input = Input(shape=(3, 224, 224))
base_model = vgg...
top_model = load_model(weights_file)
x = base_model(final_input)
result = top_model(x)
final_model = Model(input=final_input, output=result)
关于python - Keras VGG16 微调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43386463/
我已经使用 VGG 作为图像分类模型实现了图像字幕。我读过关于 YOLO 是一种快速图像分类和检测模型的文章,它主要用于多目标检测。但是对于图像字幕,我只想要类而不是边界框。 最佳答案 我完全同意 P
你能告诉我每层有多少个神经元吗?我觉得这将增进我对 VGG 正在发生的事情的理解。 让我们在这里使用这段代码只是为了得到一些具体的东西。 https://github.com/machrisaa/te
我的问题是如何将从预训练 Vgg16 模型加载的常量张量转换为 tf.Variable 张量?动机是我需要计算关于 Conv4_3 层内核的特定损失的梯度,但是,内核似乎设置为 tf.Constant
我正在使用使用 VGG(神经网络)的基于转移式的深度学习方法。后者适用于小尺寸(512x512 像素)的图像,但是当输入图像很大(尺寸 > 1500 像素)时它会提供失真的结果。该方法的作者建议将输入
我所做的是: from keras.applications.vgg16 import VGG16 from keras.layers import * from keras.models impor
我想知道是否可以将自定义模型添加到 keras 中的损失函数。例如: def model_loss(y_true, y_pred): inp = Input(shape=(128, 128,
我加载了预训练的 VGG 人脸 CNN 并成功运行。我想从第 3 层和第 8 层提取超列平均值。我正在关注关于从 here 中提取超列的部分。 .但是,由于 get_output 函数不起作用,我不得
我正在使用 Python 3.7.7 和 Tensorflow 2.1.0。 我想创建一个 VGG16 自动编码器网络,向它加载一个权重文件,然后获取它的编码器和解码器。 获取 VGG16 自编码器网
我有一个 VGG19 编码器,它接受 (256,256,3) 的输入图像 y 并返回维度 (32,32, 512) 的张量 来自 vgg 的 conv-4-1 层。我需要将其转换为 numpy 数组以
当使用 torchvision.models 模块加载预训练的 VGG 网络并使用它对任意 RGB 图像进行分类时,网络的输出在每次调用之间明显不同。为什么会这样?根据我的理解,VGG 前向传播的任何
我已关注this加载并运行预训练的 VGG 模型。但是,我试图从隐藏层中提取特征图,并尝试复制“提取任意特征图”部分 here 中的结果。 。我的代码如下: #!/usr/bin/python imp
我正在尝试使用来自 keras 的预训练 VGG 16。但我真的不确定输入范围应该是多少。 快速回答,这些颜色顺序中的哪些? RGB BGR 哪个范围? 0 到 255? 从大约 -125 平衡到大约
我正在使用包含 3k 图像的数据集从头开始训练 VGG-16 模型。 我使用 Tensorflow 平台和 8 个 CPU,没有任何 GPU。 训练率 - 0.01, 重量衰减 - 0.0005, 动
这个问题是对 this answer 评论中讨论的跟进。 . 据我了解,preprocess_input() function 确实意味着输入图像的减法和 std-dev dvision。平均值是在训
刚接触pytorch,想用Vgg做迁移学习。我想删除全连接层并添加一些新的全连接层。我还想使用灰度输入而不是 RGB 输入。为此,我将添加输入层的权重并获得单个权重。所以三个 channel 的权重会
我使用 VGG16 基础创建了一个自定义 Keras 模型,并对其进行训练和保存: from keras.applications import VGG16 from keras import mod
我正在尝试打印所有已知类别及其概率值。第一个值是概率最高的类别。 这是迄今为止我的代码: from keras.applications.vgg16 import VGG16 from keras.p
我试图将具有以下形状的数据拟合到预训练的 keras vgg19 模型中。 图像输入形状为(32383, 96, 96, 3)标签形状为 (32383, 17)我收到了这个错误 expected bl
我正在使用预先训练的 VGG-16 网络将图像转换为特征。我可以按顺序完成这个工作。但是,我想并行执行此操作,但我不确定如何正确构建批处理。 具体来说,假设我加载了 16 个保存在 numpy 数组中
我实际上正在尝试使用 Keras 获得 VGG16 的顺序模型版本。功能版本可以通过以下方式获得: from __future__ import division, print_function im
我是一名优秀的程序员,十分优秀!