我想使用cifar数据集和keras框架来训练单层神经网络。由于数据集的每个图像是32乘3乘3,我不太确定如何使用没有卷积的单层网络处理图像。我认为将每个图像展平成具有N by 32*32*3
形状的数据集是正确的选择。因此,我做了以下内容:如何用Cifar在Keras中训练单层神经网络?
#Flatten
X_train = X_train.reshape((X_train.shape[0],32*32*3))
X_test = X_test.reshape((X_test.shape[0],32*32*3))
然后我就做匹配的输入尺寸的单层网:
model.add(Dense(units_single_layer, input_shape=(32*32*3,)))
model.add(Activation('relu'))
model.add(Dense(nb_classes))
model.add(Activation('softmax'))
代码看起来编译很好,一切。因此,这是在没有卷积的图像数据集上训练单层神经网络的正确方法吗?我猜想让我失望的主要原因是图像是一个3D张量,但是一个单层网络将它视为一维矢量而不管其形状如何。对?
此外,由于Keras提供了一个flatten()
函数,因此似乎不清楚这是否是因效率或其他原因而使用的首选方法。但是,我无法完成这一项工作。
此外,这不言而喻,但softmax层并不真正算作另一层。对?我想想要它是单层。
整个代码:
from __future__ import print_function
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 Convolution2D, MaxPooling2D
from keras.utils import np_utils
batch_size = 32
nb_classes = 10
units_single_layer = 100
nb_epoch = 200
data_augmentation = False
# input image dimensions
img_rows, img_cols = 32, 32
# The CIFAR10 images are RGB.
img_channels = 3
# The data, shuffled and split between train and test sets:
(X_train, y_train), (X_test, y_test) = cifar10.load_data()
#Flatten
X_train = X_train.reshape((X_train.shape[0],32*32*3))
X_test = X_test.reshape((X_test.shape[0],32*32*3))
# Convert class vectors to binary class matrices.
Y_train = np_utils.to_categorical(y_train, nb_classes)
Y_test = np_utils.to_categorical(y_test, nb_classes)
model = Sequential()
#model.add(Flatten(input_shape=32*32*3))
#model.add(Flatten())
#model.add(Flatten(100, input_shape=(32*32*3,)))
model.add(Dense(units_single_layer, input_shape=(32*32*3,)))
model.add(Activation('relu'))
model.add(Dense(nb_classes))
model.add(Activation('softmax'))
# Let's train the model using RMSprop
model.compile(loss='categorical_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255
print('Not using data augmentation.')
model.fit(X_train, Y_train,
batch_size=batch_size,
nb_epoch=nb_epoch,
validation_data=(X_test, Y_test),
shuffle=True)
你有2层,输入和输出。只需指定一个像密集(nb_classes,input_dim =(32 * 32 * 3))。我不认为你需要指定形状,因为它是一维矢量。 – Atirag
你会仍然upvote答案,告诉我如何使用keras平坦。 – Pinocchio