这里的evaluate和上面的validation_freq是一样的,区别在于什么呢?区别在在于validation_freq是在traing中间进行的,为什么中间进行呢?因为在training的时候,我也不知道traing什么时候是个头,有可能traing10天,有可能是3个月,有可能更久,那么什么时候停止呢?我这个时候,就会隔一段时间做一次validation_freq或者隔一段时间做一次test,比如根据(我再中间写一段代码if test_accuracy>0.99,我就把当前的状态save住,我就把这个循环跳出来break;这个就是中间做一个validation的好处,我们可以随时的停止,所以这一部分可以提前终止不一定完成10个epoch,这10epoch一般是我们指定的最大的epoch,达到我们的需求可以提前的终止,当跳完这句话话后就是evaluate还要做一次测试,来验证,只需要给一个数据集;其实就相当于一次valuation_freq;当然这个测试的数据集也可以不用这个ds_val数据集,我们可以找另外一个,这样更加公平,公正!
代码示例:
# keras使用示例
# 全连接层:每一个结点都与上一层的所有结点相连,用来把前边提取到的特征结合起来。由于其全相连的特性,一般全连接层的参数也是最多的。
# F:Function函数 C:Class类 V:Variable变量 f:Field属性 p:Parameter 参数 / python内置函数
def testKeras():
# 加载鸢尾花数据集
train_x = sklearn.datasets.load_iris().data # (150, 4)
train_y = sklearn.datasets.load_iris().target # (150, )
# onehot_y = tf.keras.utils.to_categorical(train_y) # (150, 3) 转换为独热编码
# 打乱数据集
np.random.seed(116)
np.random.shuffle((train_x))
np.random.seed(116)
np.random.shuffle(train_y)
# 搭建模型/神经网络架构 kernel表示权重参数W
model = tf.keras.models.Sequential([tf.keras.layers.Dense(5, activation="relu", input_dim=4),
tf.keras.layers.Dense(3, activation="softmax", kernel_regularizer=tf.keras.regularizers.l2(0.0001))])
# model = tf.keras.models.Sequential()
# model.add(tf.keras.layers.Dense(5, activation="relu", input_dim=4))
# model.add(tf.keras.layers.Dense(3, activation="softmax", kernel_regularizer=tf.keras.regularizers.l2(0.0001)))
# 编译模型
model.compile(optimizer=tf.keras.optimizers.Adam(lr=0.01, beta_1=0.9, beta_2=0.999, epsilon=1e-7),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=["sparse_categorical_accuracy"])
# 运行模型
model.fit(train_x, train_y, batch_size=32, epochs=500, validation_split=0.2, validation_freq=50)
# 打印信息
model.summary()
# 验证模型
loss_and_metrics = model.evaluate(train_x, train_y, batch_size=64) # list类型 [loss, metric]
# 预测模型
prediction = model.predict(train_x, batch_size=128) # (150, 3)
class IrisModel(tf.keras.Model):
# 定义所需网络结构快
def __init__(self):
super(IrisModel, self).__init__()
# 定义网络结构快
self.d_1 = tf.keras.layers.Dense(5, activation="relu", input_dim=4)
self.d_2 = tf.keras.layers.Dense(3, activation="softmax", kernel_regularizer=tf.keras.regularizers.l2(0.0001))
# 写出前向传播
def call(self, X):
# 调用网络结构快,实现前向传播
A1 = self.d_1(X)
y =self.d_2(A1)
return y
def testKeras2():
# 加载鸢尾花数据集
train_x = sklearn.datasets.load_iris().data # (150, 4)
train_y = sklearn.datasets.load_iris().target # (150, )
# 打乱数据集
np.random.seed(116)
np.random.shuffle((train_x))
np.random.seed(116)
np.random.shuffle(train_y)
# 定义模型
model = IrisModel()
# 编译模型
model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.1), loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=["sparse_categorical_accuracy"])
# 启动模型
model.fit(train_x, train_y, batch_size=32, epochs=500, validation_split=0.2, validation_freq=50)
#打印信息
model.summary()
categorical_accuracy:检查最大真实值的index是否等于最大预测值的index。
sparse_categorical_accuracy:检查最大真实值是否等于最大预测值的index。
# 自定义层
class MyLayer(tf.keras.layers.Layer):
def __init__(self, output_dim, **kwargs):
super(MyLayer, self).__init__(**kwargs) # 初始化layers.Layer变量
self.output_dim = output_dim # 输出个数的定义
def build(self, input_shape): # 添加权重矩阵
# Create a trainable weight variable for this layer.
self.kernel = self.add_weight(name='kernel', shape=(input_shape[1], self.output_dim), initializer='uniform',
trainable=True)
def call(self, inputs): # 定义前向过程
return tf.matmul(inputs, self.kernel)
def get_config(self):
base_config = super(MyLayer, self).get_config()
base_config['output_dim'] = self.output_dim
return base_config
@classmethod
def from_config(cls, config):
return cls(**config)