apple / tensorflow_macos

TensorFlow for macOS 11.0+ accelerated using Apple's ML Compute framework.
Other
3.66k stars 308 forks source link

a bug about model.predict() & model.evaluate(). #203

Open tengwang0318 opened 3 years ago

tengwang0318 commented 3 years ago

My machine is MacBook Pro 2020 13-inch, TensorFlow version is 2.4. When I use model.predict() and model.evaluate(), no matter which function is used first, the output result of the other function will be seriously different from expected. I mean that if I use model.predict(test_x), and then I use model.evaluate(test_x,test_y), the result about accuracy is very lower than my expectation. If I don't use model.predict(test_x) before using model.evaluate(test_x,test_y), I will get a perfect accuracy. Code show as below

import tensorflow as tf
import matplotlib.pyplot as plt
import pylab
import numpy as np

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train = x_train.reshape((60000, 28, 28, 1))
x_test = x_test.reshape((10000, 28, 28, 1))
x_train = 2 * x_train / 255.0 - 1
x_test = 2 * x_test / 255.0 - 1

plt.imshow(x_train[0, :, :, ])
print()
pylab.show()

def build_model():
    return tf.keras.Sequential([
        tf.keras.layers.Conv2D(32, (3, 3), padding='same', activation=tf.nn.relu,
                               input_shape=(28, 28, 1)),
        tf.keras.layers.Conv2D(64, (3, 3), activation=tf.nn.relu),
        tf.keras.layers.MaxPooling2D((2, 2)),
        tf.keras.layers.Conv2D(64, (3, 3), activation=tf.nn.relu),
        tf.keras.layers.MaxPooling2D((2, 2)),
        tf.keras.layers.Flatten(),
        tf.keras.layers.Dense(49, activation=tf.nn.relu),
        tf.keras.layers.Dense(10, activation=tf.nn.softmax)
    ])

def train(x, y):
    model = build_model()
    model.summary()
    model.compile(optimizer=tf.optimizers.Adam(), loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])
    model.fit(x, y, epochs=2)
    # model.evaluate(x_test, y_test)

    # predict
    print(model.predict(x_test)[0])
    print(y_test[0])
    model.evaluate(x_test,y_test)
    # print(model.predict(x_test)[0])

    return model

model = train(x_train, y_train)