Keras.Metrics
compile & fit
以前
now
network.fit里面validation是为了提前停止;network.evaluate 验证模型最终准确率。
自定义层/网络
keras.Sequential
注意,netwok = Sequential() 这一步并没有创建w、b,在network.build() 指定输入维度,或者直接 network(x) 之后才生成w、b。
network.summary() 可查看网络结构。
自定义层
必须继承自keras.layers.Layer
自定义网络
必须继承自keras.Model
模型保存与加载
实战
import tensorflow as tf
import numpy as np
a = np.ones([10, 1])
print(type(a)) # <class 'numpy.ndarray'>
a = tf.squeeze(a)
print(type(a)) # <class 'tensorflow.python.framework.ops.EagerTensor'>
print(a.shape) # (10,)
a = np.ones([10, 1])
a = tf.expand_dims(a, -1)
print(type(a)) # <class 'tensorflow.python.framework.ops.EagerTensor'>
print(a.shape) # (10, 1, 1)
print(a.dtype) # <dtype: 'float64'>
貌似对tensor的操作也可用于numpy类型
实战代码:
import tensorflow as tf
from tensorflow import keras
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
def preprocessing(x, y):
"""
x is a single image, not a batch of images
x、y已经是tensor类型
"""
x = tf.cast(x, dtype=tf.float32) / 255. #
y = tf.cast(y, dtype=tf.int32)
return x, y
# 自定义层(类) ,需要继承自keras.layers.Layer
class MyDense(keras.layers.Layer):
def __init__(self, inp_shape, outp_shape):
super(MyDense, self).__init__()
self.kernel = self.add_variable('w', [inp_shape, outp_shape])
self.bias = self.add_variable('b', [outp_shape])
def call(self, inputs, training=None):
x = inputs @ self.kernel + self.bias
return x
# 自定义网络需要继承自keras.Model
class MyNetwork(keras.Model):
def __init__(self):
super(MyNetwork, self).__init__()
self.fc1 = MyDense(32*32*3, 256)
self.fc2 = MyDense(256, 128)
self.fc3 = MyDense(128, 64)
self.fc4 = MyDense(64, 32)
self.fc5 = MyDense(32, 10)
def __call__(self, inputs, training=None):
# inputs:[b, 32, 32, 3]
x = tf.reshape(inputs, [-1, 32*32*3])
x = self.fc1(x)
x = tf.nn.relu(x)
x = self.fc2(x)
x = tf.nn.relu(x)
x = self.fc3(x)
x = tf.nn.relu(x)
x = self.fc4(x)
x = tf.nn.relu(x)
x = self.fc5(x)
return x
def main():
# 数据加载和预处理
(x_train, y_train), (x_test, y_test) = keras.datasets.cifar10.load_data()
# print(y_train.shape) (50000, 1)
# print(tf.is_tensor(x_train)) False
y_train = tf.squeeze(y_train) # 对numpy操作,返回tensor类型
y_train = tf.one_hot(y_train, depth=10)
y_test = tf.squeeze(y_test)
y_test = tf.one_hot(y_test, depth=10)
print(y_test.shape)
train_db = tf.data.Dataset.from_tensor_slices((x_train, y_train)) # 此时x、y已经由numpy类型转换成tensor类型
train_db = train_db.map(preprocessing).shuffle(10000).batch(256) # .map 括号里 只需写函数名
test_db = tf.data.Dataset.from_tensor_slices((x_test, y_test))
test_db = test_db.map(preprocessing).batch(256)
network = MyNetwork()
network.compile(optimizer=keras.optimizers.Adam(lr=1e-3),
loss=tf.losses.CategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
network.fit(train_db, epochs=15, validation_data=test_db, validation_freq=1)
network.evaluate(test_db)
# 模型保存与加载
network.save_weights('./weights.ckpt')
del network
print("saved")
network = MyNetwork()
network.compile(optimizer=keras.optimizers.Adam(lr=1e-3),
loss=tf.losses.CategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
network.load_weights('./weights.ckpt')
print('loaded')
if __name__ == '__main__':
main()
拜师教育学员文章:作者:1191-杨同学,
转载或复制请以 超链接形式 并注明出处 拜师资源博客。
原文地址:《tensorflow2.0—笔记4 自定义网络、模型保存与加载 原创》 发布于2020-09-18
评论 抢沙发