Получение низкой точности при компиляции нескольких моделей одна за другой в одной программе

Я пытался выполнять эти модели по отдельности, помещая другие разделы в комментарии, но как только я начинаю раскомментировать строки и запускать весь код вместе, он перестает давать хорошие результаты.

Примечание: я получаю только результаты с низкой точностью в моделях, использующих CNN. Я не знаю почему. Я подозреваю, что, возможно, мне нужно импортировать данные каждый раз, но это не имеет никакого смысла.

Примечание. Когда я запускаю тот же код в Google Colab, я получаю хорошие результаты. Платформа, на которой я не получаю хороших результатов, - это PuTTy, с помощью которой я должен отправить этот код.

Интересно, что у меня проблемы только со второй моделью (свертка до регуляризации l2). Я сделал что-то не так при определении этой модели?

IMG_SIZE=28
import tensorflow
from tensorflow import keras
import numpy
from tensorflow.contrib.learn.python.learn.datasets.mnist import extract_images, extract_labels
import matplotlib.pyplot as plt


def convert(x):
    y=numpy.zeros([len(x),10])
    z=numpy.eye(10)
    for i in range(len(x)):
        y[i]=(z[(x[i])])
    return y


with open('train-images-idx3-ubyte.gz', 'rb') as f:
    train_images = extract_images(f)
with open('train-labels-idx1-ubyte.gz', 'rb') as f:
    train_labels = extract_labels(f)

with open('t10k-images-idx3-ubyte.gz', 'rb') as f:
    test_images = extract_images(f)
with open('t10k-labels-idx1-ubyte.gz', 'rb') as f:
    test_labels = extract_labels(f)


train_images = train_images / 255.0
test_images = test_images / 255.0

#"""
print("


############# USING REGULARIZATIONS #############")

model = keras.Sequential([keras.layers.Flatten(input_shape=train_images[0].shape),
            keras.layers.Dense(500, activation='relu',kernel_regularizer=keras.regularizers.l2(0.001), bias_regularizer=keras.regularizers.l2(0.001)),
            keras.layers.Dense(500,activation='relu',kernel_regularizer=keras.regularizers.l2(0.001), bias_regularizer=keras.regularizers.l2(0.001)),
            keras.layers.Dense(10,activation='softmax')])
model.compile(optimizer='sgd',loss=tensorflow.keras.losses.sparse_categorical_crossentropy,metrics=['accuracy'])
l2_history=model.fit(train_images, train_labels, epochs=3,validation_split=0.13)
loss,accuracy = model.evaluate(test_images,test_labels, verbose=2)
print('


Test accuracy with l2 regularization:',accuracy)
#"""
#"""
print("


############# USING CONVOLUTION BEFORE REGULARIZATIONS #############")
model = keras.Sequential([keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28,28,1)),
            keras.layers.MaxPooling2D((2, 2)),
            keras.layers.Conv2D(64, (3, 3), activation='relu'),
            keras.layers.MaxPooling2D((2, 2)),
            keras.layers.Conv2D(64, (3, 3), activation='relu'),
            keras.layers.MaxPooling2D((2, 2)),
            keras.layers.Flatten(),
            keras.layers.Dense(500,activation='relu',kernel_regularizer=keras.regularizers.l2(0.001), bias_regularizer=keras.regularizers.l2(0.001)),
            keras.layers.Dense(500,activation='relu',kernel_regularizer=keras.regularizers.l2(0.001), bias_regularizer=keras.regularizers.l2(0.001)),
            keras.layers.Dense(10,activation='softmax')])
model.compile(optimizer='sgd',loss=tensorflow.keras.losses.sparse_categorical_crossentropy,metrics=['accuracy'])
train_images_new = train_images.reshape(-1,28, 28, 1)
test_images_new = test_images.reshape(-1,28, 28, 1)
l2_conv_history=model.fit(train_images_new, train_labels, epochs=3,validation_split=0.13)
loss,accuracy = model.evaluate(test_images_new,test_labels, verbose=2)
print('


Test accuracy with convolution before l2 regularization:',accuracy)
#"""
#"""
print("


############# USING DROPOUT #############")

model = keras.Sequential([keras.layers.Flatten(input_shape=train_images[0].shape),
            keras.layers.Dropout(0.2),
            keras.layers.Dense(500, activation='relu'),
            keras.layers.Dropout(0.5),
            keras.layers.Dense(500,activation='relu'),
            keras.layers.Dropout(0.5),
            keras.layers.Dense(10,activation='softmax')])
model.compile(optimizer='sgd',loss=tensorflow.keras.losses.sparse_categorical_crossentropy,metrics=['accuracy'])
dropout_history=model.fit(train_images, train_labels, epochs=3,validation_split=0.13)
loss,accuracy = model.evaluate(test_images,test_labels, verbose=2)
print('


Test accuracy with l2 regularization:',accuracy)
#"""
#"""
print("


############# USING CONVOLUTION BEFORE DROPOUT #############")

model = keras.Sequential([keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28,28,1)),
            keras.layers.MaxPooling2D((2, 2)),
            keras.layers.Dropout(0.1),
            keras.layers.Conv2D(64, (3, 3), activation='relu'),
            keras.layers.MaxPooling2D((2, 2)),
            keras.layers.Dropout(0.2),
            keras.layers.Conv2D(64, (3, 3), activation='relu'),
            keras.layers.MaxPooling2D((2, 2)),
            keras.layers.Dropout(0.2),
            keras.layers.Flatten(),
            keras.layers.Dense(500, activation='relu'),
            keras.layers.Dropout(0.5),
            keras.layers.Dense(500,activation='relu'),
            keras.layers.Dropout(0.5),
            keras.layers.Dense(10,activation='softmax')])
model.compile(optimizer='sgd',loss=tensorflow.keras.losses.sparse_categorical_crossentropy,metrics=['accuracy'])
train_images_new = train_images.reshape(-1,28, 28, 1)
test_images_new = test_images.reshape(-1,28, 28, 1)
dropout_conv_history=model.fit(train_images_new, train_labels, epochs=3,validation_split=0.13)
loss,accuracy = model.evaluate(test_images_new,test_labels, verbose=2)
print('


Test accuracy with convolution before dropout:',accuracy)
#"""
#"""
plt.figure(figsize=(50,20))
plt.subplot(2,4,1)
plt.plot(l2_history.history['acc'])
plt.plot(l2_history.history['val_acc'])
plt.title('accuracy vs epoch (with l2 regularization)')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'validation'], loc='upper left')
plt.subplot(2,4,2)
plt.plot(dropout_history.history['acc'])
plt.plot(dropout_history.history['val_acc'])
plt.title('accuracy vs epoch (with dropout)')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'validation'], loc='upper left')
plt.subplot(2,4,3)
plt.plot(l2_history.history['loss'])
plt.plot(l2_history.history['val_loss'])
plt.title('classification error vs epoch (with l2 regularization)')
plt.ylabel('classification error')
plt.xlabel('epoch')
plt.legend(['train', 'validation'], loc='upper left')
plt.subplot(2,4,4)
plt.plot(dropout_history.history['loss'])
plt.plot(dropout_history.history['val_loss'])
plt.title('classification error vs epoch (with dropout)')
plt.ylabel('classification error')
plt.xlabel('epoch')
plt.legend(['train', 'validation'], loc='upper left')
plt.subplot(2,4,5)
plt.plot(l2_conv_history.history['acc'])
plt.plot(l2_conv_history.history['val_acc'])
plt.title('accuracy vs epoch (with convolution before l2 regularization)')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'validation'], loc='upper left')
plt.subplot(2,4,6)
plt.plot(dropout_conv_history.history['acc'])
plt.plot(dropout_conv_history.history['val_acc'])
plt.title('accuracy vs epoch (with convolution before dropout)')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'validation'], loc='upper left')
plt.subplot(2,4,7)
plt.plot(l2_conv_history.history['loss'])
plt.plot(l2_conv_history.history['val_loss'])
plt.title('classification error vs epoch (with convolution before l2 regularization)')
plt.ylabel('classification error')
plt.xlabel('epoch')
plt.legend(['train', 'validation'], loc='upper left')
plt.subplot(2,4,8)
plt.plot(dropout_conv_history.history['loss'])
plt.plot(dropout_conv_history.history['val_loss'])
plt.title('classification error vs epoch (with convolution before dropout)')
plt.ylabel('classification error')
plt.xlabel('epoch')
plt.legend(['train', 'validation'], loc='upper left')
plt.show()
#plt.savefig("A04mpm514Q2.png")
plt.clf()
#"""

Вот соответствующий вывод

############# USING CONVOLUTION BEFORE REGULARIZATIONS #############
Train on 52200 samples, validate on 7800 samples
Epoch 1/3
52200/52200 [==============================]52200/52200 [==============================] - 272s 5ms/step - loss: 9.2077 - acc: 0.2311 - val_loss: 15.0802 - val_acc: 0.1004

Epoch 2/3
52200/52200 [==============================]52200/52200 [==============================] - 273s 5ms/step - loss: 15.1176 - acc: 0.0969 - val_loss: 15.0435 - val_acc: 0.1004

Epoch 3/3
52200/52200 [==============================]52200/52200 [==============================] - 269s 5ms/step - loss: 15.0821 - acc: 0.0969 - val_loss: 15.0092 - val_acc: 0.1004

Test accuracy with convolution before l2 regularization: 0.0982

И вот результат, когда тот же код запускается в Google Colab

############# USING CONVOLUTION BEFORE REGULARIZATIONS #############
Train on 52200 samples, validate on 7800 samples
Epoch 1/3
52200/52200 [==============================] - 6s 111us/sample - loss: 1.9528 - acc: 0.5949 - val_loss: 1.2696 - val_acc: 0.7654
Epoch 2/3
52200/52200 [==============================] - 6s 113us/sample - loss: 0.8080 - acc: 0.9250 - val_loss: 0.7072 - val_acc: 0.9515
Epoch 3/3
52200/52200 [==============================] - 6s 110us/sample - loss: 0.6900 - acc: 0.9518 - val_loss: 0.6427 - val_acc: 0.9621
10000/10000 - 1s - loss: 0.6343 - acc: 0.9631



Test accuracy with convolution before l2 regularization: 0.9631 

Всего 2 ответа


Вы не очищаете сеанс между запусками, поэтому в ядре будет присутствовать мусор, который приведет к плохим результатам. Между каждой моделью вы должны сбрасывать Keras :

<some model code>
model.fit()

tf.keras.backend.clear_session()

<more model code>
model.fit()

К сожалению, я не мог понять точную причину. Тем не менее, я попытался изменить порядок, в котором обучались модели (я поставил модели с использованием CNN перед двумя другими), и это сработало для меня. Пожалуйста, прокомментируйте, если кто-нибудь выяснит проблему. Спасибо.


Есть идеи?

10000