2017-07-06 122 views
3

我努力訓練keras模型,並將其轉換爲使用keras 1.2.2TensorFlow後端coreML模型。這是爲了分類任務。 CoreML的輸入顯示爲MultiArray。我需要這是Image <BGR, 32, 32>或類似CVPixelBuffer。我試着按here加上image_input_names='data'。我的input shape(height, width, depth),我相信是需要的。IOS/CoreML - 輸入類型的MultiArray當keras模型轉換爲CoreML

請幫助解決此問題。我用cifar10數據集和下面的代碼(Reference):

from keras.datasets import cifar10 
from keras.models import Model 
from keras.layers import Input, Convolution2D, MaxPooling2D, Dense, Dropout, Flatten 
from keras.utils import np_utils 
import numpy as np 
import coremltools 

np.random.seed(1234) 

batch_size = 32 
num_epochs = 1 

kernel_size = 3 
pool_size = 2 
conv_depth_1 = 32 
conv_depth_2 = 64 
drop_prob_1 = 0.25 
drop_prob_2 = 0.5 
hidden_size = 512 

(X_train, y_train), (X_test, y_test) = cifar10.load_data() 
num_train, height, width, depth = X_train.shape 
num_test = X_test.shape[0] 
num_classes = 10 

X_train = X_train.astype('float32') 
X_test = X_test.astype('float32') 
X_train /= np.max(X_train) 
X_test /= np.max(X_test) 

y_train = np_utils.to_categorical(y_train, num_classes) 
y_test = np_utils.to_categorical(y_test, num_classes) 

data = Input(shape=(height, width, depth)) 
conv_1 = Convolution2D(conv_depth_1, (kernel_size, kernel_size), padding='same', activation='relu')(data) 
conv_2 = Convolution2D(conv_depth_1, (kernel_size, kernel_size), padding='same', activation='relu')(conv_1) 
pool_1 = MaxPooling2D(pool_size=(pool_size, pool_size))(conv_2) 
drop_1 = Dropout(drop_prob_1)(pool_1) 

conv_3 = Convolution2D(conv_depth_2, (kernel_size, kernel_size), padding='same', activation='relu')(drop_1) 
conv_4 = Convolution2D(conv_depth_2, (kernel_size, kernel_size), padding='same', activation='relu')(conv_3) 
pool_2 = MaxPooling2D(pool_size=(pool_size, pool_size))(conv_4) 
drop_2 = Dropout(drop_prob_1)(pool_2) 

flat = Flatten()(drop_2) 
hidden = Dense(hidden_size, activation='relu')(flat) 
drop_3 = Dropout(drop_prob_2)(hidden) 
out = Dense(num_classes, activation='softmax')(drop_3) 

model = Model(inputs=data, outputs=out) 

model.compile(loss='categorical_crossentropy', 
       optimizer='adam', 
       metrics=['accuracy']) 

model.fit(X_train, y_train,     
      batch_size=batch_size, epochs=num_epochs, 
      verbose=1, validation_split=0.1) 
loss, accuracy = model.evaluate(X_test, y_test, verbose=1) 
print ("\nTest Loss: {loss} and Test Accuracy: {acc}\n".format(loss = loss, acc = accuracy)) 
coreml_model = coremltools.converters.keras.convert(model, input_names='data', image_input_names='data') 
coreml_model.save('my_model.mlmodel') 

回答

0

問題出在我的tf版本和protobuf版本。我可以通過安裝coremltools`documentation中提到的版本來解決此問題。

1

我剛剛選中此與Keras 2和模型的輸入Image<RGB,32,32>,不MultiArray。也許這取決於Keras版本。

如果您需要它是BGR,請將is_bgr=True添加到coremltools.converters.keras.convert()調用中。

Here is the documentation這個轉換器。

+0

我確實解決了這個問題。我的TF版本和protobuf版本不對。謝謝回覆。 –