歡迎您光臨本站 註冊首頁

淺談keras中loss與val

←手機掃碼閱讀     zmcjlove @ 2020-06-23 , reply:0

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).

  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

 

  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.

  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, …], …)

  ### generator  yield [inputX_1,inputX_2],y  ### model  model = Model(inputs=[inputX_1,inputX_2],outputs=...)

 

補充知識:學習keras時對loss函數不同的選擇,則model.fit裡的outputs可以是one_hot向量,也可以是整形標籤

我就廢話不多說了,大家還是直接看代碼吧~

  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(' Test 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向量,直接使用整形標籤即可

 

   


[zmcjlove ] 淺談keras中loss與val已經有250次圍觀

http://coctec.com/docs/python/shhow-post-239464.html