【问题标题】:CoreMLtools and Keras ValueError: need more than 1 value to unpackCoreMLtools 和 Keras ValueError:需要超过 1 个值才能解压
【发布时间】:2018-05-20 20:43:28
【问题描述】:

我正在使用 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')

【问题讨论】:

  • 您找到解决方案了吗?
  • @TMob 我没有。
  • 我没有和你做同样的事情,我试图将 tiny-YOLOv3 转换为 CoreML,但最后是 input_layer 在转换时丢失了它的输入大小(因为不知何故 Keras 没有不需要它?...不知道)。它最终成为 (None, None, 3) 而 CoreML 无法处理“无”。当我将其更改为 (416, 416, 3) 时,它转换得很好。
  • 对于完全相同的问题(mlmodel 的开始)@TMob,您可以扩展您的解决方案吗?这是有道理的,但我不知道如何注入这种变化。

标签: tensorflow keras coreml


【解决方案1】:

我写这里是为了响应@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 大小是否存在同样的问题。

【讨论】:

    猜你喜欢
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多