深度学习代码
模型代码
保存与加载npz文件
数组形式
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']
np.savez('plot_npz/flower',acc=acc,val_acc=val_acc,loss=loss,val_loss=val_loss)
data = np.load('plot_npz/flower.npz')
# print(data.files)
# print(data['acc'])
acc = data['acc']
val_acc = data['val_acc']
loss = data['loss']
val_loss = data['val_loss']
plot绘制一行两列子图精度和损失
plt.figure(figsize=(16, 8))
plt.subplot(1, 2, 1)
plt.plot(epochs_range, acc, label='Training Accuracy')
plt.plot(epochs_range, val_acc, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')
plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, label='Training Loss')
plt.plot(epochs_range, val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()
函数式模型
if mode == 'functional':
inputs = tf.keras.Input(shape=(28, 28, 1))
x = tf.keras.layers.Flatten()(inputs)
x = tf.keras.layers.Dense(units=100, activation=tf.nn.relu)(x)
x = tf.keras.layers.Dense(units=10)(x)
outputs = tf.keras.layers.Softmax()(x)
model = tf.keras.Model(inputs=inputs, outputs=outputs)
序列式模型
model = Sequential([
data_augmentation,
layers.experimental.preprocessing.Rescaling(1. / 255),
layers.Conv2D(16, 3, padding='same', activation='relu'),
layers.MaxPooling2D(),
layers.Conv2D(32, 3, padding='same', activation='relu'),
layers.MaxPooling2D(),
layers.Conv2D(64, 3, padding='same', activation='relu'),
layers.MaxPooling2D(),
layers.Dropout(0.2),
layers.Flatten(),
layers.Dense(128, activation='relu'),
layers.Dense(num_classes)
])
data_augmentation = keras.Sequential(
[
layers.experimental.preprocessing.RandomFlip("horizontal",
input_shape=(img_height,
img_width,
3)),
layers.experimental.preprocessing.RandomRotation(0.1),
layers.experimental.preprocessing.RandomZoom(0.1),
]
)
绘制数据增强图片
plt.figure(figsize=(10, 10))
for images, _ in train_ds.take(1):
for i in range(9):
augmented_images = data_augmentation(images)
ax = plt.subplot(3, 3, i + 1)
plt.imshow(augmented_images[2].numpy().astype("uint8"))
plt.axis("off")
plt.show()
调用预处理层放缩图片到(0-255)->(0-1)
# 第一种方法单独使用layer进行缩放,也可以放到模型里。我们采用第二种方法
normalization_layer = layers.experimental.preprocessing.Rescaling(1./255)
normalized_ds = train_ds.map(lambda x, y: (normalization_layer(x), y))
image_batch, labels_batch = next(iter(normalized_ds))
first_image = image_batch[0]
# Notice the pixels values are now in `[0,1]`.
# 经过标准缩放后 像素变为(0,1)之间
print(np.min(first_image), np.max(first_image))
# 第二种方法
函数式模型keras
def flower_model():
inputs = tf.keras.Input(shape=(img_height, img_width, 3))
x = layers.experimental.preprocessing.RandomFlip("horizontal")(inputs)
x = layers.experimental.preprocessing.RandomRotation(0.1)(x)
x = layers.experimental.preprocessing.RandomZoom(0.1)(x)
x = layers.experimental.preprocessing.Rescaling(1. / 255)(x)
x = layers.Conv2D(16, 3, padding='same', activation='relu')(x)
x = layers.MaxPooling2D()(x)
x = layers.Conv2D(32, 3, padding='same', activation='relu')(x)
x = layers.MaxPooling2D()(x)
x = layers.Conv2D(64, 3, padding='same', activation='relu')(x)
x = layers.MaxPooling2D()(x)
x = layers.Dropout(0.2)(x)
x = layers.Flatten()(x)
x = layers.Dense(128, activation='relu')(x)
outputs = layers.Dense(num_classes)(x)
model = tf.keras.Model(inputs=inputs, outputs=outputs)
return model
加载测试数据集
test_ds = tf.keras.preprocessing.image_dataset_from_directory(
test_data_dir,
validation_split=None,
subset=None,
seed=123,
image_size=(img_height, img_width),
batch_size=batch_size)
验证测试集evaluate
注意需要compile
而且可以加载checkpoint
def evaluate():
global test_ds
AUTOTUNE = tf.data.experimental.AUTOTUNE
test_ds = test_ds.cache().prefetch(buffer_size=AUTOTUNE)
model = flower_model()
model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
checkpoint = tf.train.Checkpoint(myAwesomeModel=model)
checkpoint.restore(tf.train.latest_checkpoint(checkpoint_path))
loss, accuracy = model.evaluate(test_ds)
print('Test accuracy :', accuracy)