예제 #1
0
def test_sequential_lstm_mxnet_model_saving():
    max_features = 1000
    maxlen = 80
    batch_size = 32

    model = Sequential()
    model.add(Embedding(max_features, 128, input_length=maxlen))
    model.add(LSTM(128, unroll=True))

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

    # Generate random data
    x = np.random.random((1000, maxlen))
    y = np.random.random((1000, 128))
    print("X shape - ", x.shape)
    print("Y shape - ", y.shape)
    model.fit(x, y, batch_size=batch_size, epochs=2)

    save_mxnet_model(model, prefix='test_lstm', epoch=0)

    # Import with MXNet and try to perform inference
    import mxnet as mx
    sym, arg_params, aux_params = mx.model.load_checkpoint(prefix='test_lstm', epoch=0)
    mod = mx.mod.Module(symbol=sym, data_names=['/embedding_1_input1'], context=mx.cpu(), label_names=None)
    mod.bind(for_training=False, data_shapes=[('/embedding_1_input1', (1, 80))], label_shapes=mod._label_shapes)
    mod.set_params(arg_params, aux_params, allow_missing=True)
    data_iter = mx.io.NDArrayIter([mx.nd.random.normal(shape=(1, 80))], label=None, batch_size=1)
    mod.predict(data_iter)

    os.remove('test_lstm-symbol.json')
    os.remove('test_lstm-0000.params')
예제 #2
0
def test_sequential_mxnet_model_saving_no_compile():
    model = Sequential()
    model.add(Dense(2, input_shape=(3, )))
    model.add(RepeatVector(3))
    model.add(TimeDistributed(Dense(3)))
    with pytest.raises(AssertionError):
        save_mxnet_model(model, prefix='test', epoch=0)
예제 #3
0
def test_sequential_mxnet_model_not_compiled():
    model = Sequential()
    model.add(Dense(8, input_shape=(32, )))
    model.add(Dense(4, input_shape=(8, )))

    model_prefix = 'test_dense'
    with pytest.raises(AssertionError):
        save_mxnet_model(model, model_prefix, epoch=0)
예제 #4
0
def test_sequential_mxnet_model_saving():
    model = Sequential()
    model.add(Dense(2, input_shape=(3, )))
    model.add(RepeatVector(3))
    model.add(TimeDistributed(Dense(3)))
    model.compile(loss=losses.MSE,
                  optimizer=optimizers.RMSprop(lr=0.0001),
                  metrics=[metrics.categorical_accuracy],
                  sample_weight_mode='temporal')
    x = np.random.random((1, 3))
    y = np.random.random((1, 3, 3))
    model.train_on_batch(x, y)

    data_names, _ = save_mxnet_model(model, prefix='test', epoch=0)

    # Import with MXNet and try to perform inference
    import mxnet as mx
    sym, arg_params, aux_params = mx.model.load_checkpoint(prefix='test',
                                                           epoch=0)
    mod = mx.mod.Module(symbol=sym,
                        data_names=data_names,
                        context=mx.cpu(),
                        label_names=None)
    mod.bind(for_training=False,
             data_shapes=[(data_names[0], (1, 3))],
             label_shapes=mod._label_shapes)
    mod.set_params(arg_params, aux_params, allow_missing=True)
    data_iter = mx.io.NDArrayIter([mx.nd.random.normal(shape=(1, 3))],
                                  label=None,
                                  batch_size=1)
    mod.predict(data_iter)

    os.remove('test-symbol.json')
    os.remove('test-0000.params')
def save_model(model, model_dir):
    prefix = 'mnist_cnn'
    params_filename = '{}-0000.params'.format(prefix)
    symbol_filename = '{}-symbol.json'.format(prefix)
    data_names, data_shapes = save_mxnet_model(model=model,
                                               prefix=prefix,
                                               epoch=0)
    shutil.copy(src=str(Path('.', params_filename)),
                dst=str(Path(model_dir, params_filename)))
    shutil.copy(src=str(Path('.', symbol_filename)),
                dst=str(Path(model_dir, symbol_filename)))
예제 #6
0
def test_sequential_lstm_mxnet_model_saving():
    maxlen = 80

    model = Sequential()
    model.add(Embedding(1000, 128, input_length=maxlen))
    model.add(LSTM(128, unroll=True))

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

    # Generate data for dummy network
    X = np.random.random((1000, 80))
    Y = np.random.random((1000, 128))
    model.fit(X, Y, batch_size=32, nb_epoch=2)

    model_prefix = 'test_lstm'
    data_names, data_shapes = save_mxnet_model(model,
                                               prefix=model_prefix,
                                               epoch=0)

    # Import with MXNet and try to perform inference
    import mxnet as mx

    X_dummy_for_pred = mx.nd.random.normal(shape=(1, 80))
    pred_keras = model.predict([X_dummy_for_pred.asnumpy()], batch_size=1)

    sym, arg_params, aux_params = mx.model.load_checkpoint(model_prefix,
                                                           epoch=0)
    mod = mx.mod.Module(symbol=sym,
                        data_names=[data_names[0]],
                        context=mx.cpu(),
                        label_names=None)
    mod.bind(for_training=False,
             data_shapes=[(data_names[0], (1, 80))],
             label_shapes=mod._label_shapes)
    mod.set_params(arg_params, aux_params, allow_missing=True)
    data_iter = mx.io.NDArrayIter([X_dummy_for_pred], label=None, batch_size=1)
    pred_mxnet = mod.predict(data_iter)

    # Check if predictions made through mxnet and keras model are same
    assert_allclose(pred_mxnet.asnumpy(), pred_keras, rtol=1e-03)

    os.remove(model_prefix + "-symbol.json")
    os.remove(model_prefix + "-0000.params")
예제 #7
0
def test_sequential_get_mxnet_model_info():
    model = Sequential()
    model.add(Dense(2, input_shape=(3, )))
    model.add(RepeatVector(3))
    model.add(TimeDistributed(Dense(3)))
    model.compile(loss=losses.MSE,
                  optimizer=optimizers.RMSprop(lr=0.0001),
                  metrics=[metrics.categorical_accuracy],
                  sample_weight_mode='temporal')
    x = np.random.random((1, 3))
    y = np.random.random((1, 3, 3))
    model.train_on_batch(x, y)

    data_names, data_shapes = K.get_mxnet_model_info(model)

    data_names_saved_model, data_shapes_saved_model = save_mxnet_model(
        model, prefix='test', epoch=0)

    # Only one input
    assert len(data_names) == 1
    # Example data_names = ['/dense_8_input1']
    assert data_names[0].startswith('/dense_')

    # Example data_shape = [DataDesc[/dense_8_input1,(1, 3),float32,NCHW]]
    assert len(data_shapes) == 1
    assert data_shapes[0].name == data_names[0]
    # In this example, we are passing x as input with shape (1,3)
    assert data_shapes[0].shape == (1, 3)

    # Compare with returned values from Save MXNet Model API. They should be the same.
    assert len(data_names) == len(data_names_saved_model)
    assert data_names[0] == data_names_saved_model[0]

    assert len(data_shapes) == len(data_shapes_saved_model)
    assert data_shapes[0].name == data_shapes_saved_model[0].name
    assert data_shapes[0].shape == data_shapes_saved_model[0].shape

    os.remove('test-symbol.json')
    os.remove('test-0000.params')
예제 #8
0
def test_sequential_dense_mxnet_model_saving():
    model = Sequential()
    model.add(Dense(8, input_shape=(32, )))
    model.add(Dense(4, input_shape=(8, )))

    model.compile(loss='mean_squared_error', optimizer='sgd')

    # Generate data for dummy network
    X = np.random.random((8, 32))
    Y = np.random.random((8, 4))
    model.fit(X, Y, batch_size=8, nb_epoch=5)

    model_prefix = 'test_dense'
    data_names, data_shapes = save_mxnet_model(model, model_prefix, epoch=1)

    # Import with MXNet and try to perform inference
    import mxnet as mx

    X_dummy_for_pred = mx.nd.random.normal(shape=(4, 32))
    pred_keras = model.predict([X_dummy_for_pred.asnumpy()], batch_size=4)

    sym, arg_params, aux_params = mx.model.load_checkpoint(model_prefix,
                                                           epoch=1)
    mod = mx.mod.Module(symbol=sym,
                        data_names=[data_names[0]],
                        context=mx.cpu(),
                        label_names=None)
    mod.bind(for_training=False,
             data_shapes=[(data_names[0], (4, 32))],
             label_shapes=mod._label_shapes)
    mod.set_params(arg_params, aux_params, allow_missing=True)
    data_iter = mx.io.NDArrayIter([X_dummy_for_pred], label=None, batch_size=1)
    pred_mxnet = mod.predict(data_iter)

    # Check if predictions made through mxnet and keras model are same
    assert_allclose(pred_mxnet.asnumpy(), pred_keras, rtol=1e-03)

    os.remove(model_prefix + "-symbol.json")
    os.remove(model_prefix + "-0001.params")
예제 #9
0
                  trainable=False,
                  name="embed"))
    model.add(
        Conv1D(filters=128, kernel_size=3, activation='relu', name="conv_1"))
    model.add(MaxPooling1D(pool_size=5, name="maxpool_1"))
    model.add(Flatten(name="flat_1"))
    model.add(Dropout(0.3, name="dropout_1"))
    model.add(Dense(128, activation='relu', name="dense_1"))
    model.add(Dense(args.num_classes, activation='softmax', name="out_1"))

    # compile the model
    model.compile(optimizer='rmsprop',
                  loss='binary_crossentropy',
                  metrics=['acc'])

    model.summary()

    model.fit(x_train, y_train, batch_size=16, epochs=args.epochs, verbose=2)
    model.evaluate(x_test, y_test, verbose=2)
    model_prefix = os.path.join(args.model_dir, 'model')
    model.save(model_prefix + '.hd5')
    data_name, data_shapes = save_mxnet_model(model=model,
                                              prefix=model_prefix,
                                              epoch=0)
    signature = [{
        'name': data_name[0],
        'shape': [dim for dim in data_desc.shape]
    } for data_desc in data_shapes]
    with open(os.path.join(args.model_dir, 'model-shapes.json'), 'w') as f:
        json.dump(signature, f)
예제 #10
0
    model.fit(x_train,
              y_train,
              batch_size=batch_size,
              epochs=epochs,
              verbose=1,
              validation_data=(x_test, y_test))
    score = model.evaluate(x_test, y_test, verbose=0)

    print('Test loss:', score[0])
    print('Test accuracy:', score[1])

    model_name = 'mnist-cnn-' + str(epochs)
    model.save(model_path + '/' + model_name + '.hd5')  # Keras model
    print("Saved Keras model")
    save_mxnet_model(model=model,
                     prefix=model_path + '/' + model_name)  # MXNet model
    print("Saved MXNet model")

    sys.exit(0)
except Exception as e:
    # Write out an error file. This will be returned as the failureReason in the
    # DescribeTrainingJob result.
    trc = traceback.format_exc()
    with open(os.path.join(output_path, 'failure'), 'w') as s:
        s.write('Exception during training: ' + str(e) + '\n' + trc)
    # Printing this causes the exception to be in the training job logs, as well.
    print('Exception during training: ' + str(e) + '\n' + trc, file=sys.stderr)
    # A non-zero exit code causes the training job to be marked as Failed.
    sys.exit(255)
예제 #11
0
model = Sequential()
model.add(
    Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))

model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.Adadelta(),
              metrics=['accuracy'])

model.fit(x_train,
          y_train,
          batch_size=batch_size,
          epochs=epochs,
          verbose=1,
          validation_data=(x_test, y_test))
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

# Step 2: Save the model in MXNet model format.
# data_names and data_shapes are values of the parameters to be used when loading the Model in MXNet.
data_names, data_shapes = save_mxnet_model(model=model,
                                           prefix='mnist_cnn',
                                           epoch=0)
예제 #12
0
out = new_classification_layer(base_model.layers[-2].output)

# create a new network between inp and out
model_new = Model(inp, out)
model_new.summary()

# make all layers untrainable by freezing weights (except for last layer)
for layer in model_new.layers[:-1]:
    layer.trainable = False

    # ensure the last layer is trainable/not frozen    
for layer in model_new.layers[-1:]:
    layer.trainable = True

# check to see it is correct:
for layer in model_new.layers:
    print(layer.trainable)

model_new.compile(Adam(lr=.0001), loss="categorical_crossentropy", metrics=['accuracy'])
model_new.summary()

# We train the model, in this case using a low size of epochs, since the model learns the data quite quickly
model_new.fit_generator(train_batches, steps_per_epoch=101,
                   validation_data=valid_batches, validation_steps=106, epochs=25, verbose=2)

model_new.fit_generator(train_batches, steps_per_epoch=101,
                   validation_data=valid_batches, validation_steps=106, epochs=5, verbose=2)

#model_new.save("VGG16signature.h5")
data_names, data_shapes = save_mxnet_model(model=model_new, prefix='signature_cnn', epoch=0)