深度学习图像分类器架构配置

时间:2019-12-03 07:15:54

标签: python machine-learning deep-learning

hiya是机器学习的新手,只了解一些基础知识以及事物应该如何工作。所以我在看有关使用Python,TensorFlow和Keras进行深度学习的教程,并获得了这些代码

import tensorflow as tf
from keras.datasets import cifar10
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Conv2D, MaxPooling2D
import numpy as np
import matplotlib.pyplot as plt
import os
import cv2

DATADIR = "C:/Users/Acer/imagerec/MRI"

CATEGORIES = ["yes", "no"]

for category in CATEGORIES:
    path = os.path.join(DATADIR,category)
    for img in os.listdir(path):
        img_array = cv2.imread(os.path.join(path,img) ,cv2.IMREAD_GRAYSCALE)
        plt.imshow(img_array, cmap='gray')


        break
    break
print(img_array)
print(img_array.shape)

IMG_SIZE = 224

new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE))
plt.imshow(new_array, cmap='gray')


training_data = []

def create_training_data():
    for category in CATEGORIES:
        path = os.path.join(DATADIR, category)
        class_num = CATEGORIES.index(category)
        for img in os.listdir(path):
            try:
                img_array = cv2.imread(os.path.join(path, img), cv2.IMREAD_GRAYSCALE)
                new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE))
                training_data.append([new_array, class_num])
            except Exception as e:
                pass


create_training_data()

print(len(training_data))

import random

random.shuffle(training_data)
for sample in training_data[:10]:
    print(sample[1])

X = []
y = []
for features, label in training_data:
    X.append(features)
    y.append(label)

X = np.array(X).reshape(-1, IMG_SIZE, IMG_SIZE, 1)

import pickle

pickle_in = open("X.pickle","rb")
X = pickle.load(pickle_in)



pickle_in = open("y.pickle","rb")
y = pickle.load(pickle_in)

X = X/255.0

model = Sequential()

model.add(Conv2D(256, (3, 3), input_shape=X.shape[1:]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

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

model.add(Flatten())

model.add(Dense(64))
model.add(Activation('relu'))

model.add(Dense(1))
model.add(Activation('sigmoid'))

model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
model.fit(X, y, batch_size=15, epochs=20, validation_split=0.1)

from sklearn.metrics import confusion_matrix
pred = model.predict(X)
pred = np.round(pred)

conf = confusion_matrix(y, pred)

import seaborn as sns
sns.heatmap(conf, annot=True)

plt.show()

所以运行这些代码给我带来了76.9%的验证准确度,并且我得到了很好的结果,我需要做的就是将该代码的模型更改为VGG16,VGG19和mobilenet,但是我不知道如何导入预先训练的模型,所以我决定制作自己的模型并进行训练,因此我研究了VGG16和VGG19的体系结构,并研究了多少conv和maxpooling并提出了这段代码

import tensorflow as tf
from keras.datasets import cifar10
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Conv2D, MaxPooling2D
import numpy as np
import matplotlib.pyplot as plt
import os
import cv2

DATADIR = "C:/Users/Acer/imagerec/EDA"

CATEGORIES = ["yes", "no"]

for category in CATEGORIES:
    path = os.path.join(DATADIR,category)
    for img in os.listdir(path):
        img_array = cv2.imread(os.path.join(path,img) ,cv2.IMREAD_GRAYSCALE)
        plt.imshow(img_array, cmap='gray')
        plt.show()

        break
    break
print(img_array)
print(img_array.shape)

IMG_SIZE = 224

new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE))
plt.imshow(new_array, cmap='gray')
plt.show()

training_data = []

def create_training_data():
    for category in CATEGORIES:
        path = os.path.join(DATADIR, category)
        class_num = CATEGORIES.index(category)
        for img in os.listdir(path):
            try:
                img_array = cv2.imread(os.path.join(path, img), cv2.IMREAD_GRAYSCALE)
                new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE))
                training_data.append([new_array, class_num])
            except Exception as e:
                pass


create_training_data()

print(len(training_data))

import random

random.shuffle(training_data)
for sample in training_data[:10]:
    print(sample[1])

X = []
y = []
for features, label in training_data:
    X.append(features)
    y.append(label)

X = np.array(X).reshape(-1, IMG_SIZE, IMG_SIZE, 1)

import pickle

pickle_in = open("X.pickle","rb")
X = pickle.load(pickle_in)



pickle_in = open("y.pickle","rb")
y = pickle.load(pickle_in)

X = X/255.0

model = Sequential()

model.add(Conv2D(64, (3, 3), input_shape=X.shape[1:]))
model.add(Activation('relu'))
padding='same'
model.add(Conv2D(64, (3, 3), input_shape=X.shape[1:]))
model.add(Activation('relu'))
padding='same'
model.add(MaxPooling2D(pool_size=(1, 1)))

model.add(Conv2D(128, (3, 3), input_shape=X.shape[1:]))
model.add(Activation('relu'))
padding='same'
model.add(Conv2D(128, (3, 3), input_shape=X.shape[1:]))
model.add(Activation('relu'))
padding='same'
model.add(MaxPooling2D(pool_size=(1, 1)))

model.add(Conv2D(256, (3, 3), input_shape=X.shape[1:]))
model.add(Activation('relu'))
padding='same'
model.add(Conv2D(256, (3, 3), input_shape=X.shape[1:]))
model.add(Activation('relu'))
padding='same'
model.add(Conv2D(256, (3, 3), input_shape=X.shape[1:]))
model.add(Activation('relu'))
padding='same'
model.add(MaxPooling2D(pool_size=(1, 1)))

model.add(Conv2D(512, (3, 3), input_shape=X.shape[1:]))
model.add(Activation('relu'))
padding='same'
model.add(Conv2D(512, (3, 3), input_shape=X.shape[1:]))
model.add(Activation('relu'))
padding='same'
model.add(Conv2D(512, (3, 3), input_shape=X.shape[1:]))
model.add(Activation('relu'))
padding='same'
model.add(MaxPooling2D(pool_size=(1, 1)))

model.add(Conv2D(512, (3, 3), input_shape=X.shape[1:]))
model.add(Activation('relu'))
padding='same'
model.add(Conv2D(512, (3, 3), input_shape=X.shape[1:]))
model.add(Activation('relu'))
padding='same'
model.add(Conv2D(512, (3, 3), input_shape=X.shape[1:]))
model.add(Activation('relu'))
padding='same'
model.add(MaxPooling2D(pool_size=(1, 1)))

model.add(Flatten())

model.add(Dense(64))
model.add(Activation('relu'))

model.add(Dense(1))
model.add(Activation('sigmoid'))
model.add(Dense(1))
model.add(Activation('sigmoid'))
model.add(Dense(1))
model.add(Activation('sigmoid'))

model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
model.fit(X, y, batch_size=15, epochs=1, validation_split=0.1)

from sklearn.metrics import confusion_matrix
pred = model.predict(X)
pred = np.round(pred)

conf = confusion_matrix(y, pred)

import seaborn as sns
sns.heatmap(conf, annot=True)

plt.show()

但是运行此命令始终可使我的val准确度达到57.69%,这是我做错了什么吗?还是我做错了一切?

编辑 所以我现在使用了预训练的模型

import tensorflow as tf
from keras.datasets import cifar10
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Conv2D, MaxPooling2D
import numpy as np
import matplotlib.pyplot as plt
import os
import cv2

DATADIR = "C:/Users/Acer/imagerec/MRI"

CATEGORIES = ["yes", "no"]

for category in CATEGORIES:
    path = os.path.join(DATADIR,category)
    for img in os.listdir(path):
        img_array = cv2.imread(os.path.join(path,img) ,cv2.IMREAD_GRAYSCALE)
        plt.imshow(img_array, cmap='gray')


        break
    break
print(img_array)
print(img_array.shape)

IMG_SIZE = 224

new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE))
plt.imshow(new_array, cmap='gray')


training_data = []

def create_training_data():
    for category in CATEGORIES:
        path = os.path.join(DATADIR, category)
        class_num = CATEGORIES.index(category)
        for img in os.listdir(path):
            try:
                img_array = cv2.imread(os.path.join(path, img), cv2.IMREAD_GRAYSCALE)
                new_array = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE))
                training_data.append([new_array, class_num])
            except Exception as e:
                pass


create_training_data()

print(len(training_data))

import random

random.shuffle(training_data)
for sample in training_data[:10]:
    print(sample[1])

X = []
y = []
for features, label in training_data:
    X.append(features)
    y.append(label)

X = np.array(X).reshape(-1, IMG_SIZE, IMG_SIZE, 1)

import pickle

pickle_in = open("X.pickle","rb")
X = pickle.load(pickle_in)



pickle_in = open("y.pickle","rb")
y = pickle.load(pickle_in)

X = X/255.0


def input_shape(args):
    pass


from keras.applications.vgg16 import VGG16
from keras.models import Model
from keras.layers import Dense

vgg = VGG16(include_top=False, weights='imagenet', input_shape=(), pooling='avg')
x = vgg.output
x = Dense(1, activation='sigmoid')(x)
model = Model(vgg.input, x)
model.summary()

from sklearn.metrics import confusion_matrix
pred = model.predict(X)
pred = np.round(pred)

conf = confusion_matrix(y, pred)

import seaborn as sns
sns.heatmap(conf, annot=True)

plt.show()

model.save('64x2-CNN.model')

并收到此错误 型号:“ model_1”


图层(类型)输出形状参数#

input_1(InputLayer)(无,无,无,3)0


block1_conv1(Conv2D)(无,无,无,64)1792


block1_conv2(Conv2D)(无,无,无,64)36928


block1_pool(MaxPooling2D)(无,无,无,64)0


block2_conv1(Conv2D)(无,无,无,128)73856


block2_conv2(Conv2D)(无,无,无,128)147584


block2_pool(MaxPooling2D)(无,无,无,128)0


block3_conv1(Conv2D)(无,无,无,256)295168


block3_conv2(Conv2D)(无,无,无,256)590080


block3_conv3(Conv2D)(无,无,无,256)590080


block3_pool(MaxPooling2D)(无,无,无,256)0


block4_conv1(Conv2D)(无,无,无,512)1180160


block4_conv2(Conv2D)(无,无,无,512)2359808


block4_conv3(Conv2D)(无,无,无,512)2359808


block4_pool(MaxPooling2D)(无,无,无,512)0


block5_conv1(Conv2D)(无,无,无,512)2359808


block5_conv2(Conv2D)(无,无,无,512)2359808


block5_conv3(Conv2D)(无,无,无,512)2359808


block5_pool(MaxPooling2D)(无,无,无,512)0


global_average_pooling2d_1((无,512)0


dense_1(密集)(无,1)513

总参数:14,715,201 可训练的参数:14,715,201 不可训练的参数:0


回溯(最近通话最近):   文件“ C:/Users/Acer/PycharmProjects/condas/UwU.py”,第95行,在     pred = model.predict(X)   在预测文件“ C:\ Users \ Acer \ Anaconda3 \ envs \ condas \ lib \ site-packages \ keras \ engine \ training.py”中,行1441     x,_,_ = self._standardize_user_data(x)   _standardize_user_data中第579行的文件“ C:\ Users \ Acer \ Anaconda3 \ envs \ condas \ lib \ site-packages \ keras \ engine \ training.py”     exception_prefix ='输入')   文件“ C:\ Users \ Acer \ Anaconda3 \ envs \ condas \ lib \ site-packages \ keras \ engine \ training_utils.py”,第145行,位于standardize_input_data中     str(数据形状)) ValueError:检查输入时出错:预期input_1具有形状(无,无,3)但具有形状(50、50、1)的数组

以退出代码1完成的过程

1 个答案:

答案 0 :(得分:1)

在keras顺序模型中,只有第一层需要知道它应该期望的library(lubridate) library(dplyr) # randomly generate some dates, starting from September 2012 d1 <- dmy("1/09/2012") df <- tibble(date = d1 + runif(100, 0, 1500)) # add the 'year' column df %>% # Not needed in this example, as column already formatted as date # mutate(date = dmy(date)) %>% mutate(year = case_when( date < dmy("1/9/2013") ~ 1, date >= dmy("1/9/2013") & date <= dmy("31/8/2014") ~ 2, date >= dmy("1/9/2014") & date <= dmy("31/8/2015") ~ 3, date >= dmy("1/9/2015") & date <= dmy("31/8/2016") ~ 4, date >= dmy("1/9/2016") & date <= dmy("31/8/2017") ~ 5 )) ,在您的情况下,它是input_shape层。另外,没有必要通过S型激活添加多个Conv2D层。

请参阅

Dense

或者,您可以使用来自keras应用程序的预训练VGG模型。

model = Sequential([
Conv2D(64, (3, 3), input_shape=input_shape, padding='same', activation='relu'),
Conv2D(64, (3, 3), activation='relu', padding='same'),
MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
Conv2D(128, (3, 3), activation='relu', padding='same'),
Conv2D(128, (3, 3), activation='relu', padding='same',),
MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
Conv2D(256, (3, 3), activation='relu', padding='same',),
Conv2D(256, (3, 3), activation='relu', padding='same',),
Conv2D(256, (3, 3), activation='relu', padding='same',),
MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
Conv2D(512, (3, 3), activation='relu', padding='same',),
Conv2D(512, (3, 3), activation='relu', padding='same',),
Conv2D(512, (3, 3), activation='relu', padding='same',),
MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
Conv2D(512, (3, 3), activation='relu', padding='same',),
Conv2D(512, (3, 3), activation='relu', padding='same',),
Conv2D(512, (3, 3), activation='relu', padding='same',),
MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
Flatten(),
Dense(4096, activation='relu'),
Dense(4096, activation='relu'),
Dense(1, activation='sigmoid')
])