首页 > 解决方案 > tf.keras model.predict 每次提供不同的值

问题描述

每次我跑:

y_true = np.argmax(tf.concat([y for x, y in train_ds], axis=0), axis=1)
y_pred = np.argmax(model.predict(train_ds), axis=1)

confusion_matrix(y_true, y_pred)

每次结果都与我的理解不同: y_pred = np.argmax(model.predict(train_ds), axis=1)每次都不同。

澄清:我运行单元 1(训练)一次。和单元格 2(推理)几次。

为什么?

代码: 单元格 1(jupyter)

import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import Input, Conv2D, experimental
from tensorflow.keras.layers import MaxPool2D, Flatten, Dense 
from tensorflow.keras import Model
from tensorflow.keras.losses import categorical_crossentropy
from sklearn.metrics import accuracy_score


image_size = (100, 100)
batch_size = 32

train_ds = tf.keras.preprocessing.image_dataset_from_directory(
    directory,
    label_mode='categorical',
    validation_split=0.2,
    subset="training",
    seed=1337,
    color_mode="grayscale",
    image_size=image_size,
    batch_size=batch_size,
)


inputs = Input(shape =(100,100,1))
x = experimental.preprocessing.Rescaling(1./255)(inputs)
x = Conv2D (filters =4, kernel_size =3, padding ='same', activation='relu')(x)
x = Conv2D (filters =4, kernel_size =3, padding ='same', activation='relu')(x)
x = MaxPool2D(pool_size =2, strides =2, padding ='same')(x)

x = Conv2D (filters =8, kernel_size =3, padding ='same', activation='relu')(x)
x = Conv2D (filters =8, kernel_size =3, padding ='same', activation='relu')(x)
x = MaxPool2D(pool_size =2, strides =2, padding ='same')(x)

x = Flatten()(x)
x = Dense(units = 4, activation ='relu')(x)
x = Dense(units = 4, activation ='relu')(x)
output = Dense(units = 5, activation ='softmax')(x)

model = Model (inputs=inputs, outputs =output)

model.compile(
    optimizer=tf.keras.optimizers.Adam(1e-3),
    loss=categorical_crossentropy,
    metrics=["accuracy"])

model.fit(train_ds, epochs=5)

单元格 2

print (Accuracy:)
y_pred = np.argmax(model.predict(train_ds), axis=1)
print (accuracy_score(y_true, y_pred))

y_pred = np.argmax(model.predict(train_ds), axis=1)
print (accuracy_score(y_true, y_pred))

输出

118/118 [==============================] - 7s 57ms/步 - 损失:0.1888 - 准确度:0.9398

准确性:

0.593

0.586

标签: tensorflowkerastf.keras

解决方案


您确定每次运行代码时都不会再次训练模型吗?如果模型的参数相同,则相同输入的预测结果每次都应该相同。


推荐阅读