本文共 6328 字,大约阅读时间需要 21 分钟。
Keras是TensorFlow的高级封装,支持多种深度学习框架,作为TensorFlow的核心组件之一,已成为TensorFlow官方推荐使用的高层API之一。本文将从基础到高级API,探讨如何高效地使用Keras进行深度学习模型构建与训练。
Keras的核心API与TensorFlow Learn类似,便于定义和训练模型,主要包括数据处理、模型构建和训练三个方面。安装Keras的方法为:
pip install keras
以下代码展示了LeNet-5模型的实现:
import kerasfrom keras.datasets import mnistfrom keras.models import Sequentialfrom keras.layers import Dense, Flatten, Conv2D, MaxPooling2Dimport keras.backend as Knum_classes = 10img_rows, img_cols = 28, 28(trainX, trainY), (testX, testY) = mnist.load_data()# 确定图像通道格式if K.image_data_format() == 'channels_first': trainX = trainX.reshape(trainX.shape[0], 1, img_rows, img_cols) testX = testX.reshape(testX.shape[0], 1, img_rows, img_cols) input_shape = (1, img_rows, img_cols)else: trainX = trainX.reshape(trainX.shape[0], img_rows, img_cols, 1) testX = testX.reshape(testX.shape[0], img_rows, img_cols, 1) input_shape = (img_rows, img_cols, 1)# 转换为浮点类型并归一化trainX = trainX.astype('float32')testX = testX.astype('float32')trainX /= 255.0testX /= 255.0# 类别转换trainY = keras.utils.to_categorical(trainY, num_classes)testY = keras.utils.to_categorical(testY, num_classes)# 构建模型model = Sequential()model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Conv2D(64, (5,5), activation='relu'))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Flatten())model.add(Dense(500, activation='relu'))model.add(Dense(num_classes, activation='softmax'))# 编译模型model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.SGD(), metrics=['accuracy'])# 训练模型model.fit(trainX, trainY, batch_size=128, epochs=20, validation_data=(testX, testY))score = model.evaluate(testX, testY)print('Test loss:', score[0])print('Test accuracy:', score[1]) 以下代码展示了如何使用循环神经网络进行情感分析:
from keras.preprocessing import sequencefrom keras.models import Sequentialfrom keras.layers import Dense, Embedding, LSTMfrom keras.datasets import imdbmax_features = 20000maxlen = 80batch_size = 32(trainX, trainY), (testX, testY) = imdb.load_data(num_words=max_features)# Uniform sequence paddingtrainX = sequence.pad_sequences(trainX, maxlen=maxlen)testX = sequence.pad_sequences(testX, maxlen=maxlen)# 模型构建model = Sequential()model.add.Embedding(max_features, 128))model.add(LSTM(128, dropout=0.2))model.add(Dense(1, activation='sigmoid'))# 编译与训练model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])model.fit(trainX, trainY, batch_size=batch_size, epochs=15, validation_data=(testX, testY))# 评估score = model.evaluate(testX, testY, batch_size=batch_size)print('Test loss:', score[0])print('Test accuracy:', score[1]) 与传统的Sequential模型不同,Keras支持返回值方式定义模型:
from keras.datasets import mnistfrom keras.layers import Input, Densefrom keras.models import Model# 定义输入inputs = Input(shape=(784,))# 传统Sequential方式x = Dense(500, activation='relu')(inputs)predictions = Dense(10, activation='softmax')(x)model = Model(inputs=inputs, outputs=predictions)# 高级方式x = Dense(500, activation='relu')(Input(shape=(784,))) # 返回向量output = Dense(10, activation='softmax')(x)model = Model(inputs=Input(shape=(784,)), outputs=output)
以下代码展示了如何实现Inception结构:
from keras.layers import Conv2D, MaxPooling2D, Inputfrom keras.models import Modelinput_shape = (256, 256, 3)# 定义三个分支tower_1 = Conv2D(64, (1,1), padding='same', activation='relu')(input_shape)tower_1 = Conv2D(64, (3,3), padding='same', activation='relu')(tower_1)tower_2 = Conv2D(64, (1,1), padding='same', activation='relu')(input_shape)tower_2 = Conv2D(64, (5,5), padding='same', activation='relu')(tower_2)tower_3 = MaxPooling2D((3,3), strides=(1,1), padding='same')(input_shape)tower_3 = Conv2D(64, (1,1), padding='same', activation='relu')(tower_3)# 拼接输出outputs = keras.layers.Concatenate(axis=1)([tower_1, tower_2, tower_3])model = Model(inputs=Input(shape=input_shape), outputs=outputs)
以下代码展示了如何定义带多输入多输出的模型:
from keras.layers import Input, Densefrom keras.models import Model# 定义两个输入和两个输出input1 = Input(shape=(784,), name="input1")input2 = Input(shape=(10,), name="input2")x = Dense(1, activation='relu')(input1)output1 = Dense(10, activation='softmax', name="output1")(x)concat_input = keras.layers.Concatenate([x, input2])output2 = Dense(10, activation='softmax', name="output2")(concat_input)model = Model(inputs=[input1, input2], outputs=[output1, output2])
以下代码展示了如何结合TensorFlow API实现分布式训练:
import tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data mnist_data = input_data.read_data_sets('/path/to/MNIST_data', one_hot=True)# 定义输入x = tf.placeholder(tf.float32, shape=(None, 784))y_ = tf.placeholder(tf.float32, shape=(None, 10))# 定义网络结构net = tf.keras.layers.Dense(500, activation='relu')(x)y = tf.keras.layers.Dense(10, activation='softmax')(net)# 定义损失函数与优化器loss = tf.reduce_mean(tf.keras.losses.categorical_crossentropy(y_, y))train_step = tf.train.GradientDescentOptimizer(0.5).minimize(loss)# 定义准确率指标acc_value = tf.reduce_mean(tf.keras.metrics.categorical_accuracy(y_, y))with tf.Session() as sess: tf.global_variables_initializer().run() for i in range(10000): xs, ys = mnist_data.train.next_batch(100) _, loss_value = sess.run([train_step, loss], feed_dict={x: xs, y_: ys}) if i % 1000 == 0: print("After %d training steps, loss on training batch is %g." % (i, loss_value)) print('Test accuracy:', acc_value.eval(feed_dict={x: mnist_data.test.images, y_: mnist_data.test.labels})) 通过以上内容,可以看出Keras不仅在模型构建上非常灵活,还在性能优化、扩展性以及与TensorFlow的集成方面表现出色,为深度学习提供了强大的工具。通过合理使用Keras的高级功能,可以实现复杂的网络架构和高效的训练策略,从而充分发挥深度学习的潜力。
转载地址:http://lgmhz.baihongyu.com/