keras框架使用小结

建立模型

1.函数式模型

from keras.layers import Input, Dense
from keras.models import Model

# This returns a tensor
inputs = Input(shape=(784,))

# a layer instance is callable on a tensor, and returns a tensor
x = Dense(64, activation='relu')(inputs)
x = Dense(64, activation='relu')(x)
predictions = Dense(10, activation='softmax')(x)

# This creates a model that includes
# the Input layer and three Dense layers
model = Model(inputs=inputs, outputs=predictions)
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
model.summary()

2.Squential式模型

from keras.models import Sequential
from keras.layers import Dense, Activation

model = Sequential()
model.add(Dense(64, input_shape=(784,),activation='relu'))
#model.add(Activation('relu'))
model.add(Dense(64,activation='relu'))
#model.add(Activation('relu'))
model.add(Dense(10,activation='softmax'))
#model.add(Activation('softmax'))

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

model.summary()
from keras.models import Sequential
from keras.layers import Dense, Activation

model = Sequential([
Dense(64,input_shape=(784,)),
Activation('relu'),
Dense(64),
Activation('relu'),
Dense(10),
Activation('softmax'),
])

model.summary()

保存和载入模型

1.简单的demo

import numpy as np
np.random.seed(1337)  # for reproducibility

from keras.models import Sequential
from keras.layers import Dense
from keras.models import load_model

# create some data
X = np.linspace(-1, 1, 200)
np.random.shuffle(X)    # randomize the data
Y = 0.5 * X + 2 + np.random.normal(0, 0.05, (200, ))
X_train, Y_train = X[:160], Y[:160]     # first 160 data points
X_test, Y_test = X[160:], Y[160:]       # last 40 data points
model = Sequential()
model.add(Dense(output_dim=1, input_dim=1))
model.compile(loss='mse', optimizer='sgd')
for step in range(301):
    cost = model.train_on_batch(X_train, Y_train)

# save
print('test before save: ', model.predict(X_test[0:2]))
model.save('my_model.h5')   # HDF5 file, you have to pip3 install h5py if don't have it
del model  # deletes the existing model

# load
model = load_model('my_model.h5')
print('test after load: ', model.predict(X_test[0:2]))

2.CNN的demo,主要参考这篇文章

from keras.models import Sequential
from keras.layers import Dense, Conv2D, MaxPooling2D, Flatten, Dropout
from keras.losses import categorical_crossentropy
from keras.optimizers import Adam
from keras.optimizers import SGD
from keras.models import model_from_json
from keras.models import load_model
from keras.utils import np_utils
import numpy as np
import os
from sklearn.model_selection import train_test_split

def load_data(resultpath):
    datapath = os.path.join(resultpath, "data10_4.npz")
    if os.path.exists(datapath):
        data = np.load(datapath)
        X, Y = data["X"], data["Y"]
    else:
        X = np.array(np.arange(432000)).reshape(10, 120, 120, 3)
        Y = [0, 0, 1, 1, 2, 2, 3, 3, 2, 0]
        X = X.astype('float32')
        Y = np_utils.to_categorical(Y, 4)
        np.savez(datapath, X=X, Y=Y)
        print('Saved dataset to dataset.npz.')
    print('X_shape:{}\nY_shape:{}'.format(X.shape, Y.shape))
    return X, Y

def define_model():
    model = Sequential()

    # setup first conv layer
    model.add(Conv2D(32, (3, 3), activation="relu",
                     input_shape=(120, 120, 3), padding='same'))  # [10, 120, 120, 32]

    # setup first maxpooling layer
    model.add(MaxPooling2D(pool_size=(2, 2)))  # [10, 60, 60, 32]

    # setup second conv layer
    model.add(Conv2D(8, kernel_size=(3, 3), activation="relu",
                     padding='same'))  # [10, 60, 60, 8]

    # setup second maxpooling layer
    model.add(MaxPooling2D(pool_size=(3, 3)))  # [10, 20, 20, 8]

    # add bianping layer, 3200 = 20 * 20 * 8
    model.add(Flatten())  # [10, 3200]

    # add first full connection layer
    model.add(Dense(512, activation='sigmoid'))  # [10, 512]

    # add dropout layer
    model.add(Dropout(0.5))

    # add second full connection layer
    model.add(Dense(4, activation='softmax'))  # [10, 4]

    return model

def train_model(resultpath):
    model = define_model()

    # if want to use SGD, first define sgd, then set optimizer=sgd
    sgd = SGD(lr=0.001, decay=1e-6, momentum=0, nesterov=True)

    # select loss\optimizer\
    model.compile(loss=categorical_crossentropy,
                  optimizer=Adam(), metrics=['accuracy'])
    model.summary()

    # load data
    X, Y = load_data(resultpath)

    # split train and test data
    X_train, X_test, Y_train, Y_test = train_test_split(
        X, Y, test_size=0.2, random_state=2)

    # input data to model and train
    history = model.fit(X_train, Y_train, batch_size=2, epochs=10,
                        validation_data=(X_test, Y_test), verbose=1, shuffle=True)

    # evaluate the model
    loss, acc = model.evaluate(X_test, Y_test, verbose=0)
    print('Test loss:', loss)
    print('Test accuracy:', acc)

    return model

def my_save_model(resultpath):

    model = train_model(resultpath)

    # the first way to save model
    model.save(os.path.join(resultpath, 'my_model.h5'))

    # the secon way : save trained network structure and weights
    model_json = model.to_json()
    open(os.path.join(resultpath, 'my_model_structure.json'), 'w').write(model_json)
    model.save_weights(os.path.join(resultpath, 'my_model_weights.hd5'))

def my_load_model(resultpath):

    # test data
    X = np.array(np.arange(86400)).reshape(2, 120, 120, 3)
    Y = [0, 1]
    X = X.astype('float32')
    Y = np_utils.to_categorical(Y, 4)

    # the first way of load model
    model2 = load_model(os.path.join(resultpath, 'my_model.h5'))
    model2.compile(loss=categorical_crossentropy,
                   optimizer=Adam(), metrics=['accuracy'])

    test_loss, test_acc = model2.evaluate(X, Y, verbose=0)
    print('Test loss:', test_loss)
    print('Test accuracy:', test_acc)

    y = model2.predict_classes(X)
    print("predicct is: ", y)

    # the second way : load model structure and weights
    model = model_from_json(open(os.path.join(resultpath, 'my_model_structure.json')).read())
    model.load_weights(os.path.join(resultpath, 'my_model_weights.hd5'))
    model.compile(loss=categorical_crossentropy,
                  optimizer=Adam(), metrics=['accuracy'])

    test_loss, test_acc = model.evaluate(X, Y, verbose=0)
    print('Test loss:', test_loss)
    print('Test accuracy:', test_acc)

    y = model.predict_classes(X)
    print("predicct is: ", y)

def main():
    resultpath = "result"
    train_model(resultpath)
    #my_save_model(resultpath)
    #my_load_model(resultpath)


if __name__ == "__main__":
    main()

猜你喜欢

转载自blog.csdn.net/qq_38109843/article/details/88898578