【问题标题】:How does one train a single layered Neural Net in Keras with cifar?如何使用 cifar 在 Keras 中训练单层神经网络?
【发布时间】:2017-07-14 18:48:01
【问题描述】:

我想使用 cifar 数据集和 keras 框架来训练单层神经网络。由于数据集的每个图像都是 32 x 32 x 3,我不太确定如何使用没有卷积的单层网络来处理图像。我认为将每个图像展平以具有形状为N by 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)

【问题讨论】:

  • 你有 2 层,输入和输出。只需指定一个,如 Dense(nb_classes,input_dim=(32*32*3))。我认为您不需要指定形状,因为它是一维向量。
  • 你仍然会支持告诉我如何使用 keras flatten 的答案。

标签: python tensorflow neural-network keras keras-layer


【解决方案1】:

你做的一切都是正确的,如果你只想要一个密集层,这就是方法。它只接受一维张量,所以你在重塑方面做得很好。

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

只是出于好奇,你为什么在输入上使用 relu?他们不是已经应该在0到1之间了吗?

【讨论】:

  • 我放了relu是因为我想要一些非线性层,否则看起来网络只能计算微不足道的线性事物。我本可以使用 sigmoid 等,但似乎 relu 具有更好的训练特性,使用(随机)梯度下降之类的方法。
  • relu 根本没有混合你的变量,它也没有训练。它不是一个智能层,因为它是非线性的,它只会通过将负值替换为 0 来修改您的输入,并且将保持所有其他不变。如果您想要更复杂的关系,则必须简单地添加更多层。
  • 我想比较单层 ReLu 网络和 2 层 ReLu 网络。为了进行这种比较,根据定义,我需要至少一层非线性。具有非线性层使其成为非通用逼近器,因此它仍然能够表达任何函数。
  • 不确定你最后的陈述......但很抱歉我没有正确阅读你的代码,relu 在密集层之后,我以为你在密集层之前也有一个。我的错。
  • 啊,我明白你的意思了。是的,那会很奇怪。抱歉,我只是想说一个几乎任何非线性的单层网络都具有逼近任何事物的表达能力。我确实有一个错字,非通用是无意义的,不知道我为什么这么说。
猜你喜欢
  • 2018-03-16
  • 1970-01-01
  • 2017-02-25
  • 1970-01-01
  • 2017-12-05
  • 2019-12-17
  • 2017-11-27
  • 2017-02-20
  • 2011-04-07
相关资源
最近更新 更多