python - 如何使用 cifar 在 Keras 中训练单层神经网络?

标签 python tensorflow neural-network keras keras-layer

我想使用 cifar 数据集和 keras 框架训练单层神经网络。由于数据集的每个图像都是 32 x 32 x 3,所以我不太确定如何使用没有卷积的单层网络来处理图像。我认为将每个图像展平为形状为 N x 32*32*3 的数据集是正确的做法。因此我做了以下事情:

#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 张量,但单层网络只会将其视为 1D 矢量,而不管其形状如何。对吧?

此外,由于 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)

最佳答案

你做的一切都是对的,如果你只想要一个致密层,这就是方法。它仅接受一维张量,因此您可以很好地 reshape 。

softmax 不被视为一个层,因为它没有任何权重或参数可供训练。

出于好奇,为什么要对输入使用 relu?它们不是应该在 0 和 1 之间吗?

关于python - 如何使用 cifar 在 Keras 中训练单层神经网络?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42430132/

相关文章:

python - 使用 SWIG 和 Python/C API 包装返回 std::map 的函数

python - 使用继承的 python optparse 选项生成进程

tensorflow - 安装 tensorflow 1.3 后是否需要单独安装 keras 2.0?

python - 在pytorch中,如何训练具有两个或多个输出的模型?

python - 神经网络在 Keras 上的前几个 epoch 中不进行学习

python - Python : How does the scipy. signal.find_peaks_cwt 函数中的峰值检测有效吗?

python - 使用箭袋绘制矢量场

tensorflow - TensorRT GA 和 RC 有什么区别?

python - 使用 anaconda 5.2 在 pycharm 上安装tensorflow

neural-network - 尝试使用 Region CNN (R-CNN) 训练 ImageNet 模型