测试如下:
import tensorflow as tf
import numpy as np
print(tf.__version__)
class MyLinearLayer(tf.keras.layers.Layer):
def __init__(self, units , use_relu6 = False):
super().__init__()
self.units = units
self.use_relu6 = use_relu6
if(self.use_relu6):
self.relu6 = tf.keras.layers.ReLU(max_value=6)
def build(self, input_shape): # input_shape 是一个 TensorShape 类型对象,提供输入的形状
# 在第一次使用该层的时候调用该部分代码,在这里创建变量可以使得变量的形状自适应输入的形状
# 而不需要使用者额外指定变量形状。
# 如果已经可以完全确定变量的形状,也可以在__init__部分创建变量
self.w = self.add_weight(name='w',
shape=[input_shape[-1], self.units], initializer=tf.random_uniform_initializer())
#TODO
self.b = self.add_variable(name='b',
shape=[self.units], initializer=tf.zeros_initializer())
def call(self, inputs):
y_pred = tf.matmul(inputs, self.w) + self.b
y_pred = y_pred * 10
y_pred = self.relu6(y_pred)
return y_pred
#用类的方式建立模型
class TestModel_1(tf.keras.Model):
def __init__(self):
super().__init__()
# 此处添加初始化代码(包含 call 方法中会用到的层
self.layer1 = MyLinearLayer(units=10,use_relu6=True)
def call(self, input):
# 此处添加模型调用的代码(处理输入并返回输出
output = self.layer1(input)
return output
#函数式编程建立模型
def TestModel_2():
inputs = tf.keras.Input(shape=(2,2) )
x = tf.keras.layers.Dense(10)(inputs)
outputs = MyLinearLayer(units=10,use_relu6=True)(x)
model = tf.keras.Model(inputs, outputs)
return model
#自定义损失函数,不过这样似乎不太方便传参
class MyLossFn_1(tf.keras.losses.Loss):
def call(self, y_true, y_pred):
return tf.reduce_mean(tf.square(y_pred - y_true))
# 这样更方便传参
# 下面 model.compile(loss = MyLossFn_2(my_noise)) 即可
def MyLossFn_2(noise):
def loss(y_true, y_pred):
return K.mean(K.square(y_pred - y_true) - K.square(y_true - noise), axis=-1)
return loss
if __name__ == "__main__":
input_tensor = tf.constant([ [11.,12.],[33. , 34.] ])
my_model_1 = TestModel_1()
my_model_2 = TestModel_2()
result_1 = my_model_1(input_tensor)
result_2 = my_model_2(input_tensor)
print('result_1',result_1)
print("result_2",result_2)
my_model_1.summary()
my_model_2.summary()
后面就是常规操作了