我有一个具有 5 个标签的多标签图像数据集。每个图像可以同时具有多个标签。我正在使用卷积神经网络来提取特征,并且我将这些提取的特征提供给RepeatVector层以创建提取特征的 5 个副本,并且在RepeatVector层之后我将TimeDistributed层与TimeDistributed(Dense(2)).
y_train是一个 3D 数组,它的形状是 (1600, 5, 2),x_train是一个图像数组。
例如:
>>> x_train.shape
(1600, 3, 100, 100)
>>> y_train.shape
(1600,5,2)
>>> y_train[0] =
array([[0, 1], # [0,1] = 1 label present and [1,0] = 0 label abset
[1, 0],
[1, 0],
[1, 0],
[1, 0]])
代码:
def get_label(y):
tmp = []
d = {0:[1,0],1:[0,1]} # 0 absent 1 present
for i,value in enumerate(y):
tmp.append( d[value] )
return tmp
X,Y= get_data()
Y = Y.tolist()
y = []
for value in Y:
y.append(get_label(value))
Y = np.array(y,dtype=int)
x_train, x_test, y_train, y_test = train_test_split(X,Y,test_size =0.2,random_state=100)
img_channels = 3
img_rows = 100
img_cols = 100
nb_classes = 5
model = Sequential()
model.add(Convolution2D(32, 3, 3, border_mode='same',input_shape=(img_channels, img_rows, img_cols)))
model.add(Activation('relu'))
model.add(Convolution2D(32, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Convolution2D(64, 3, 3, border_mode='same'))
model.add(Activation('relu'))
model.add(Convolution2D(64, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(RepeatVector(nb_classes))
model.add(TimeDistributed(Dense(2)))
model.add(Activation('softmax'))
# let's train the model using SGD + momentum (how original).
# opt = RMSprop(lr=0.001, rho=0.9, epsilon=1e-06)
opt = SGD(lr=0.01, momentum=0.0, decay=1e-6, nesterov=False)
model.compile(loss='categorical_crossentropy', optimizer=opt,metrics=['accuracy'])
model.fit(x_train,y_train,nb_epoch=10,batch_size=32,validation_data=(x_test,y_test),shuffle=True)
out = model.predict_classes(x_test)
但是在训练之后,我得到了测试集的全零。这种方法是错误的吗?