tensorflow2自定義損失函數
一、總結
一句話總結:
直接定義函數,然后在compile時傳給loss即可
def customized_mse(y_true, y_pred): return tf.reduce_mean(tf.square(y_pred - y_true)) model = keras.models.Sequential([ keras.layers.Dense(30, activation='relu', input_shape=x_train.shape[1:]), keras.layers.Dense(1), ]) model.summary() model.compile(loss=customized_mse, optimizer="sgd", metrics=["mean_squared_error"])
二、tensorflow2自定義損失函數
轉自或參考:tensorflow2.x學習筆記十七:自定義網絡層、模型以及損失函數
https://blog.csdn.net/qq_39507748/article/details/105256541
一、自定義網絡層layer
- 繼承
tf.keras.layers.Layer
類 - 使用
tf.keras.layers.Lambda
類
下面這個例子就包含了以上兩種形式:
from tensorflow import keras
class CustomizedDenseLayer(keras.layers.Layer):
def __init__(self, units, activation=None, **kwargs):
self.units = units
self.activation = keras.layers.Activation(activation)
super(CustomizedDenseLayer, self).__init__(**kwargs)
def build(self, input_shape):
"""構建所需要的參數"""
# x * w + b. input_shape:[None, a] w:[a,b]output_shape: [None, b]
self.kernel = self.add_weight(name = 'kernel',
shape = (input_shape[1],
self.units),
initializer = 'uniform',
trainable = True)
self.bias = self.add_weight(name = 'bias',
shape = (self.units, ),
initializer = 'zeros',
trainable = True)
super(CustomizedDenseLayer, self).build(input_shape)
def call(self, x):
"""完成正向計算"""
return self.activation(x @ self.kernel + self.bias)
customized_softplus = keras.layers.Lambda(lambda x : tf.nn.softplus(x))
model = keras.models.Sequential([
CustomizedDenseLayer(30, activation='relu',
input_shape=x_train.shape[1:]),
CustomizedDenseLayer(1),
customized_softplus,
])
二、自定義模型model
- 繼承
tf.keras.Model
類
import tensorflow as tf
class MyModel(tf.keras.Model):
def __init__(self):
super(MyModel, self).__init__()
self.dense1 = tf.keras.layers.Dense(4, activation=tf.nn.relu)
self.dense2 = tf.keras.layers.Dense(5, activation=tf.nn.softmax)
self.dropout = tf.keras.layers.Dropout(0.5)
def call(self, inputs, training=False):
x = self.dense1(inputs)
if training:
x = self.dropout(x, training=training)
return self.dense2(x)
model = MyModel()
三、自定義損失函數loss
直接定義函數,然后在compile時傳給loss參數即可
def customized_mse(y_true, y_pred):
return tf.reduce_mean(tf.square(y_pred - y_true))
model = keras.models.Sequential([
keras.layers.Dense(30, activation='relu',
input_shape=x_train.shape[1:]),
keras.layers.Dense(1),
])
model.summary()
model.compile(loss=customized_mse, optimizer="sgd",
metrics=["mean_squared_error"])