【问题标题】:How to save images properly classified with CNN?如何保存用 CNN 正确分类的图像?
【发布时间】:2019-11-08 06:46:25
【问题描述】:

CNN 的手写识别问题。有一个要求:从 10000 张测试图片中,保存 1000 张图片(.png 或 .jpg),准确分类每个文件夹的 100 张图片(0 -> 9)。我该怎么办?我需要有关代码的说明。谢谢!代码:

    import keras
    from keras.datasets import mnist 
    from keras.layers import Dense, Activation, Flatten, Conv2D, 
    MaxPooling2D
    from keras.models import Sequential
    from keras.utils import to_categorical
    import numpy as np
    import matplotlib.pyplot as plt

    (train_X,train_Y), (test_X,test_Y) = mnist.load_data()

    train_X = train_X.reshape(-1, 28,28, 1)
    test_X = test_X.reshape(-1, 28,28, 1)

    train_X = train_X.astype('float32')
    test_X = test_X.astype('float32')
    test_X = test_X / 255
    train_Y_one_hot = to_categorical(train_Y)
    test_Y_one_hot = to_categorical(test_Y)

    model = Sequential()

    model.add(Conv2D(64, (3,3), input_shape=(28, 28, 1)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2,2)))

    model.add(Conv2D(64, (3,3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2,2)))

    model.add(Flatten())
    model.add(Dense(64))

    model.add(Dense(10))
    model.add(Activation('softmax'))

    model.compile(loss=keras.losses.categorical_crossentropy, 
    optimizer=keras.optimizers.Adam(),metrics=['accuracy'])

    model.fit(train_X, train_Y_one_hot, batch_size=64, epochs=1)

    test_loss, test_acc = model.evaluate(test_X, test_Y_one_hot)
    print('Test loss', test_loss)
    print('Test accuracy', test_acc)
    model.save('123.model')
    predictions = model.predict(test_X)
    print(np.argmax(np.round(predictions[235])))

    plt.imshow(test_X[235].reshape(28, 28), cmap = 'Greys_r')
    plt.show()

【问题讨论】:

    标签: python tensorflow conv-neural-network mnist save-image


    【解决方案1】:

    将正确分类的测试图像保存在其标签的相应文件夹中的完整代码
    (0到9),每个文件夹100张图片如下:

    import keras
    from keras.datasets import mnist 
    from keras.layers import Dense, Activation, Flatten, Conv2D, MaxPooling2D
    from keras.models import Sequential
    from keras.utils import to_categorical
    import numpy as np
    import matplotlib.pyplot as plt
    
    (train_X,train_Y), (test_X,test_Y) = mnist.load_data()
    
    train_X = train_X.reshape(-1, 28,28, 1)
    test_X = test_X.reshape(-1, 28,28, 1)
    
    train_X = train_X.astype('float32')
    train_X = train_X/255
    test_X = test_X.astype('float32')
    test_X = test_X / 255
    #train_Y_one_hot = to_categorical(train_Y)
    #test_Y_one_hot = to_categorical(test_Y)
    
    model = Sequential()
    
    model.add(Conv2D(64, (3,3), input_shape=(28, 28, 1)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2,2)))
    
    model.add(Conv2D(64, (3,3)))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=(2,2)))
    
    model.add(Flatten())
    model.add(Dense(64))
    
    model.add(Dense(10))
    model.add(Activation('softmax'))
    
    model.compile(loss=keras.losses.sparse_categorical_crossentropy, 
    optimizer=keras.optimizers.Adam(),metrics=['accuracy'])
    
    #model.fit(train_X, train_Y_one_hot, batch_size=64, epochs=1)
    model.fit(train_X, train_Y, batch_size=64, epochs=1)
    
    #test_loss, test_acc = model.evaluate(test_X, test_Y_one_hot)
    test_loss, test_acc = model.evaluate(test_X, test_Y)
    print('Test loss', test_loss)
    print('Test accuracy', test_acc)
    
    predictions = model.predict(test_X)
    
    #****Actual Code which you need is mentioned below
    
    import matplotlib
    import matplotlib.pyplot as plt
    import os
    
    def save_fig(fig_id, Label):
        path = os.path.join('MNIST_Images', Label, fig_id + "." + "png")    
        plt.tight_layout()
        plt.savefig(path, format="png", dpi=300)
        plt.close()
    
    %matplotlib agg 
    %matplotlib agg #These 2 lines are required to prohibit Graph being displayed in Jupyter Notebook. You can comment these if you are using other IDE
    
    No_Of_Rows = predictions.shape[0]
    
    Count_Dict = {}
    for i in range(10):
        key = 'Count_' + str(i)
        Count_Dict[key] = 0
    
    for Each_Row in range(No_Of_Rows):
        if np.argmax(predictions[Each_Row]) == test_Y[Each_Row]:
            Label = str(test_Y[Each_Row])
            Count_Dict['Count_' + Label] = Count_Dict['Count_' + Label] + 1
            Count_Of_Label = Count_Dict['Count_' + Label]
            if Count_Of_Label <= 100:
                plt.imshow(test_X[Each_Row].reshape(28, 28), cmap = 'Greys_r')
                plt.show()
                save_fig(str(Count_Of_Label), Label)
    

    我已经注释了下面不需要的代码行,因为标签已经是数字格式。

    train_Y_one_hot = to_categorical(train_Y)
    test_Y_one_hot = to_categorical(test_Y)
    

    另外,我在model.compile 中将categorical_crossentropy 替换为sparse_categorical_crossentropy,因为我们没有对变量进行编码。

    【讨论】:

    • 请不要将文字信息以图片的形式发布,尤其是在易于输入的情况下,并且没有任何特殊需要以图片的形式发布。
    • 删除了图片。感谢您的反馈。
    猜你喜欢
    • 2020-03-14
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    相关资源
    最近更新 更多