我想使用Keras创建一个图像分类器,并用一些示例图像进行训练。之后,我将使用预训练模型并在末尾添加几层,但首先,我想了解Keras和CNNs。
我的控制台打印出以下错误:
ValueError: 检查目标时出错:期望dense_2的形状为(None, 2),但得到的数组形状为(321, 3)
这是我的代码:
from __future__ import absolute_importfrom __future__ import divisionfrom __future__ import print_functionimport argparseimport sysimport timeimport numpy as npimport cv2import timefrom PIL import Imageimport kerasimport globfrom keras.models import Sequentialfrom keras.models import load_modelfrom keras.layers import Dense, Dropout, Flattenfrom keras.layers import Conv2D, MaxPooling2Dfrom keras.optimizers import SGDfrom sklearn.preprocessing import LabelBinarizerlabels = ['buena', 'mala', 'otro']def to_one_hot(labels, ys): result = np.zeros((len(ys),len(labels))) for i in range(result.shape[0]): for j in range(result.shape[1]): result[i,j] = int(ys[i] == labels[j]) return resultdef build_dataset(labels): num_classes = len(labels) x = [] y = [] for label in labels: for filename in (glob.glob('./tf_files/papas_fotos/'+label+'/*.jpg')): img = cv2.imread(filename) img = np.resize(img,(100,100, 3)) x.append(img) y.append(label) y = to_one_hot(labels, y) # y = keras.utils.to_categorical(y, num_classes=3) x = np.array(x) x_train = x[20:] y_train = y[20:] x_test = x[:19] y_test = y[:19] print (x.shape, y.shape) return x_train, y_train, x_test, y_testmodel = Sequential()# input: 100x100 images with 3 channels -> (100, 100, 3) tensors.# this applies 32 convolution filters of size 3x3 each.model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(100, 100, 3)))model.add(Conv2D(32, (3, 3), activation='relu'))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Dropout(0.25))model.add(Conv2D(64, (3, 3), activation='relu'))model.add(Conv2D(64, (3, 3), activation='relu'))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Dropout(0.25))model.add(Flatten())model.add(Dense(256, activation='relu'))model.add(Dropout(0.5))model.add(Dense(3, activation='softmax'))sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)model.compile(loss='categorical_crossentropy', optimizer=sgd)x_train, y_train, x_test, y_test = build_dataset(labels)model = load_model('thebestmodel.h5')print (model)model.fit(x_train, y_train, batch_size=32, epochs=20)score = model.evaluate(x_test, y_test, batch_size=32)model.save('thebestmodel.h5')print (score)
我犯了什么错误?我认为可能是我的独热编码标签的大小问题,但我无法解决这个问题。
谢谢!
回答:
虽然你的代码已经修复了这个特定的错误,但你正在加载一个保存的模型:model = load_model('thebestmodel.h5')
这会撤销之前的所有操作。