loss函数如何接受输入值
keras封装的比较厉害,官网给的例子写的云里雾里,
在stackoverflow找到了答案
You can wrap the loss function as a inner function and pass your input tensor to it (as commonly done when passing additional arguments to the loss function).
1
2
3
4
|
def custom_loss_wrapper(input_tensor): def custom_loss(y_true, y_pred): return K.binary_crossentropy(y_true, y_pred) + K.mean(input_tensor) return custom_loss |
1
2
3
4
5
|
input_tensor = Input (shape = ( 10 ,)) hidden = Dense( 100 , activation = 'relu' )(input_tensor) out = Dense( 1 , activation = 'sigmoid' )(hidden) model = Model(input_tensor, out) model. compile (loss = custom_loss_wrapper(input_tensor), optimizer = 'adam' ) |
You can verify that input_tensor and the loss value will change as different X is passed to the model.
1
2
3
4
5
6
|
X = np.random.rand( 1000 , 10 ) y = np.random.randint( 2 , size = 1000 ) model.test_on_batch(X, y) # => 1.1974642 X * = 1000 model.test_on_batch(X, y) # => 511.15466 |
fit_generator
fit_generator ultimately calls train_on_batch which allows for x to be a dictionary.
Also, it could be a list, in which casex is expected to map 1:1 to the inputs defined in Model(input=[in1, …], …)
1
2
3
4
|
### generator yield [inputX_1,inputX_2],y ### model model = Model(inputs = [inputX_1,inputX_2],outputs = ...) |
补充知识:学习keras时对loss函数不同的选择,则model.fit里的outputs可以是one_hot向量,也可以是整形标签
我就废话不多说了,大家还是直接看代码吧~
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
from __future__ import absolute_import, division, print_function, unicode_literals import tensorflow as tf from tensorflow import keras import numpy as np import matplotlib.pyplot as plt print (tf.__version__) fashion_mnist = keras.datasets.fashion_mnist (train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data() class_names = [ 'T-shirt/top' , 'Trouser' , 'Pullover' , 'Dress' , 'Coat' , 'Sandal' , 'Shirt' , 'Sneaker' , 'Bag' , 'Ankle boot' ] # plt.figure() # plt.imshow(train_images[0]) # plt.colorbar() # plt.grid(False) # plt.show() train_images = train_images / 255.0 test_images = test_images / 255.0 # plt.figure(figsize=(10,10)) # for i in range(25): # plt.subplot(5,5,i+1) # plt.xticks([]) # plt.yticks([]) # plt.grid(False) # plt.imshow(train_images[i], cmap=plt.cm.binary) # plt.xlabel(class_names[train_labels[i]]) # plt.show() model = keras.Sequential([ keras.layers.Flatten(input_shape = ( 28 , 28 )), keras.layers.Dense( 128 , activation = 'relu' ), keras.layers.Dense( 10 , activation = 'softmax' ) ]) model. compile (optimizer = 'adam' , loss = 'categorical_crossentropy' , #loss = 'sparse_categorical_crossentropy' 则之后的label不需要变成one_hot向量,直接使用整形标签即可 metrics = [ 'accuracy' ]) one_hot_train_labels = keras.utils.to_categorical(train_labels, num_classes = 10 ) model.fit(train_images, one_hot_train_labels, epochs = 10 ) one_hot_test_labels = keras.utils.to_categorical(test_labels, num_classes = 10 ) test_loss, test_acc = model.evaluate(test_images, one_hot_test_labels) print ( '\nTest accuracy:' , test_acc) # predictions = model.predict(test_images) # predictions[0] # np.argmax(predictions[0]) # test_labels[0] |
loss若为loss=‘categorical_crossentropy', 则fit中的第二个输出必须是一个one_hot类型,
而若loss为loss = ‘sparse_categorical_crossentropy' 则之后的label不需要变成one_hot向量,直接使用整形标签即可
以上这篇浅谈keras中loss与val_loss的关系就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/u013608336/article/details/82559469