一、定义网络
keras.sequential :层的容器
keras.layers.Layer 所有的层都要继承这个类
keras.Model:继承了Model的类都有compile/fit/evaluate这几个功能
model = Sequential([
layers.Dense(256,activation=tf.nn.relu) #[b,784] => [b,256],输入维度会默认有
,layers.Dense(128,activation=tf.nn.relu) #[b,256] => [b,128]
,layers.Dense(64,activation=tf.nn.relu) #[b,128] => [b,64]
,layers.Dense(32,activation=tf.nn.relu) #[b,64] => [b,32]
,layers.Dense(10) #[b,32] => [b,10]
])
model.build(input_shape=[None,28*28])
print(model.summary()) #查看定义的网格
model.trainable_variables——查看网格的所有参数
model.call()——model(x)会自动调用model.call()方法;model.call()方法又会自动调用model.call()方法
自定义层
class MyDense(layers.Layer):
def __init__(self, inp_dim,outp_dim):
super(MyDense, self).__init__()
self.kernel = self.add_variable('w',[inp_dim,outp_dim]) #此处可以修改
self.bias = self.add_variable('b',[outp_dim])#此处可以修改
def call(self, inputs, training=None):
out = inputs @ self.kernel + self.bias
return out
自定义网络
##自定义网络
class MyModel(keras.Model):
def __init__(self):
super(MyModel,self.__init__())
self.fc1 = MyDense(28*28, 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):
x = self.fc1(inputs)
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
二、实例化网络
network.compile(optimizer = optimizers.Adam(lr = 0.001) #设置优化器
,loss = tf.losses.CategoricalCrossentropy(from_logits = True) #设置loss
,metrics = ['accuracy'] #设置评估器
)
三、训练网格
network.fit(db, epochs = 10)
四、测试网格
1、在训练的过程中测试
network.compile(optimizer = optimezeers.Adam(lr = 0.001) #设置优化器
,loss = tf.losses.CategoricalCrossentropy(from_logits = True) #设置loss
,metrics = ['accuracy'] #设置评估器
network.fit(db, epochs = 10
, validation_data = ds_val #这个参数输入测试的数据
, validation_steps = 2 #这个参数表示每训练两次结果测试一下结果
)
2、在训练完后进行测试
network.compile(optimizer = optimezeers.Adam(lr = 0.001) #设置优化器
,loss = tf.losses.CategoricalCrossentropy(from_logits = True) #设置loss
,metrics = ['accuracy'] #设置评估器
network.fit(db, epochs = 10)
network.evaluate(ds_val)
五、预测结果——没有封装
sample = next(iter(ds_val))
x = sample[0]
y = sample[1] #one-hot
pred = network.predict(x) #[b,10]
#convert back to number
y = tf.argmax(y, axis=1)
pred = tf.argmax(pred,axis =1)
print(pred)
print(y)
六、模型保存
save/load weights —— 只保存参数
#保存参数
model.save_weights('地址')
#加载参数,加载前必须创建和保存参数前一模一样的网络
model = create_model()
model.load_weights('地址')
loss,acc = model.evaluate(test_data,test_labels)
save/load entire model —— 所有都保存
#保存模型的所有信息
model.save('地址')
#加载模型,不需要再进行network = Sequentia()这个步骤
network = tf.keras.models.load_model('地址')
loss,acc = model.evaluate(test_data,test_labels)
saved_model —— 保存标准的模型格式,其它语言都可以解析
saved_model就是一种标准的保存格式
tf.saved_model.save(m,'地址')
imported = tf.saved_model.load(path)
f = imported.signatures['serving_default']