TensorFlow
和 Keras
是两个广泛使用的深度学习框架,它们提供了强大的工具来构建、训练和评估神经网络模型。
Keras
作为 TensorFlow
的高级 API,使得构建复杂的深度学习模型变得更加简单和直观。
首先,你需要安装 TensorFlow
包。可以通过 pip 来安装:
bashpip install tensorflow
如果你只需要 Keras
而不依赖于 TensorFlow
的底层功能,也可以单独安装 keras
:
bashpip install keras
不过,通常推荐直接使用 TensorFlow
,因为它已经集成了 Keras
并提供了更多的功能和优化。
TensorFlow
中的基本数据结构。以下是一些具体的示例,展示了如何使用 TensorFlow
和 Keras
构建和训练神经网络模型。
pythonimport tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
# 创建一个顺序模型
model = Sequential()
# 添加层
model.add(Dense(32, activation='relu', input_shape=(784,)))
model.add(Dense(10, activation='softmax'))
# 编译模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 打印模型概要
model.summary()
python# 加载 MNIST 数据集
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 归一化数据
x_train, x_test = x_train / 255.0, x_test / 255.0
# 将输入数据展平
x_train = x_train.reshape(-1, 784)
x_test = x_test.reshape(-1, 784)
# 训练模型
model.fit(x_train, y_train, epochs=5)
# 评估模型
test_loss, test_acc = model.evaluate(x_test, y_test)
print(f'测试集准确率: {test_acc:.2f}')
pythonfrom tensorflow.keras.layers import Input, Dense
from tensorflow.keras.models import Model
# 定义输入
input1 = Input(shape=(784,))
input2 = Input(shape=(784,))
# 定义共享层
shared_dense = Dense(64, activation='relu')
# 连接输入到共享层
output1 = shared_dense(input1)
output2 = shared_dense(input2)
# 定义输出层
output1 = Dense(10, activation='softmax')(output1)
output2 = Dense(10, activation='softmax')(output2)
# 创建模型
model = Model(inputs=[input1, input2], outputs=[output1, output2])
# 编译模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 打印模型概要
model.summary()
pythonfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten
# 创建一个顺序模型
model = Sequential()
# 添加卷积层和池化层
model.add(Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, kernel_size=(3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
# 展平层
model.add(Flatten())
# 全连接层
model.add(Dense(128, activation='relu'))
# 输出层
model.add(Dense(10, activation='softmax'))
# 编译模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 打印模型概要
model.summary()
# 准备数据
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(-1, 28, 28, 1).astype('float32') / 255.0
x_test = x_test.reshape(-1, 28, 28, 1).astype('float32') / 255.0
# 训练模型
model.fit(x_train, y_train, epochs=5)
# 评估模型
test_loss, test_acc = model.evaluate(x_test, y_test)
print(f'测试集准确率: {test_acc:.2f}')
pythonfrom tensorflow.keras.layers import LSTM, Embedding
# 创建一个顺序模型
model = Sequential()
# 添加嵌入层和 LSTM 层
model.add(Embedding(input_dim=10000, output_dim=64))
model.add(LSTM(64))
# 输出层
model.add(Dense(1, activation='sigmoid'))
# 编译模型
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
# 打印模型概要
model.summary()
# 加载 IMDB 数据集
imdb = tf.keras.datasets.imdb
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=10000)
# 准备数据
from tensorflow.keras.preprocessing.sequence import pad_sequences
x_train = pad_sequences(x_train, maxlen=100)
x_test = pad_sequences(x_test, maxlen=100)
# 训练模型
model.fit(x_train, y_train, epochs=5)
# 评估模型
test_loss, test_acc = model.evaluate(x_test, y_test)
print(f'测试集准确率: {test_acc:.2f}')
你可以通过自定义损失函数和评估指标来满足特定需求。
pythonimport tensorflow.keras.backend as K
def custom_loss(y_true, y_pred):
return K.mean(K.square(y_true - y_pred))
# 编译模型时使用自定义损失函数
model.compile(optimizer='adam', loss=custom_loss, metrics=['accuracy'])
pythonfrom tensorflow.keras.metrics import Metric
class CustomAccuracy(Metric):
def __init__(self, name='custom_accuracy', **kwargs):
super(CustomAccuracy, self).__init__(name=name, **kwargs)
self.correct_count = self.add_weight(name='correct_count', initializer='zeros')
self.total_count = self.add_weight(name='total_count', initializer='zeros')
def update_state(self, y_true, y_pred, sample_weight=None):
y_true = tf.cast(y_true, tf.int32)
y_pred = tf.cast(tf.argmax(y_pred, axis=-1), tf.int32)
values = tf.equal(y_true, y_pred)
values = tf.cast(values, self.dtype)
if sample_weight is not None:
sample_weight = tf.cast(sample_weight, self.dtype)
values = tf.multiply(values, sample_weight)
self.correct_count.assign_add(tf.reduce_sum(values))
self.total_count.assign_add(tf.cast(tf.size(y_true), self.dtype))
def result(self):
return self.correct_count / self.total_count
# 编译模型时使用自定义评估指标
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=[CustomAccuracy()])
python# 保存整个模型
model.save('my_model.h5')
# 仅保存权重
model.save_weights('my_model_weights.h5')
python# 加载整个模型
loaded_model = tf.keras.models.load_model('my_model.h5')
# 加载权重
loaded_model.load_weights('my_model_weights.h5')
TensorFlow
支持分布式训练,可以在多个 GPU 或多个机器上并行训练模型。
python# 创建策略
strategy = tf.distribute.MirroredStrategy()
with strategy.scope():
# 在策略范围内创建模型
model = Sequential([
Dense(32, activation='relu', input_shape=(784,)),
Dense(10, activation='softmax')
])
# 编译模型
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
# 训练模型
model.fit(x_train, y_train, epochs=5)