我正在使用 Keras 微调 Inception V3 模型,以便使用 coremltools 将其转换为 .mlmodel 文件。
但是,在转换模型时,当转换器到达模型的最后一层时,coremltools 会抛出错误,并显示以下内容:
coremltools/models/neural_network.py", line 2501, in set_pre_processing_parameters
channels, height, width = array_shape
ValueError: need more than 1 value to unpack
我在此处找到的应用程序中使用了 Keras 文档中的代码:https://keras.io/applications/#fine-tune-inceptionv3-on-a-new-set-of-classes
并添加了一段代码,从此处找到的 VGG 示例加载我的数据集:https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html
我的最终脚本如下所示,使用 TesorFlow 作为后端:
加载数据from keras.preprocessing.image import ImageDataGenerator
img_width, img_height = 299, 299
train_data_dir = 'data/train'
validation_data_dir = 'data/validation'
nb_train_samples = 358
nb_validation_samples = 21
epochs = 1
batch_size = 15
train_datagen = ImageDataGenerator(
rescale=1. / 255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
test_datagen = ImageDataGenerator(rescale=1. / 255)
train_generator = train_datagen.flow_from_directory(
train_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='categorical')
validation_generator = test_datagen.flow_from_directory(
validation_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='categorical')
训练模型
base_model = InceptionV3(weights='imagenet', include_top=False)
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(1024, activation='relu')(x)
predictions = Dense(7, activation='softmax')(x)
model = Model(inputs=base_model.input, outputs=predictions)
for layer in base_model.layers:
layer.trainable = False
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit_generator(
train_generator,
steps_per_epoch=nb_train_samples // batch_size,
epochs=epochs,
validation_data=validation_generator,
validation_steps=nb_validation_samples // batch_size)
for i, layer in enumerate(base_model.layers):
print(i, layer.name)
for layer in model.layers[:249]:
layer.trainable = False
for layer in model.layers[249:]:
layer.trainable = True
from keras.optimizers import SGD
model.compile(optimizer=SGD(lr=0.0001, momentum=0.9), loss='categorical_crossentropy', metrics=['accuracy'])
model.fit_generator(
train_generator,
steps_per_epoch=nb_train_samples // batch_size,
epochs=epochs,
validation_data=validation_generator,
validation_steps=nb_validation_samples // batch_size)
model.save('finetuned_inception.h5')
最佳答案
我写在这里是为了回应@SwimBikeRun的请求(因为我需要更多的空间) 我将 YOLO 转换为 Keras,然后将 Keras 转换为 CoreML。为了进行转换,我使用了这个脚本 https://github.com/qqwweee/keras-yolo3/blob/master/convert.py
在转换过程中,模型最终是这样创建的:
input_layer = Input(shape=(None, None, 3))
...
model = Model(inputs=input_layer, outputs=[all_layers[i] for i in out_index])
这些“无”输入是导致 CoreML 转换失败的原因。对于 CoreML,模型的输入大小必须已知。所以我把它改成这样:
input_layer = Input(shape=(416, 416, 3)
您的输入大小可能会有所不同。
对于您原来的问题:
也许检查您的 base_model.input
大小是否存在同样的问题。
关于tensorflow - CoreMLtools 和 Keras ValueError : need more than 1 value to unpack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47683255/