老式 Keras 命令的现代语法 "Convolution2D"?

Modern syntax for old-fashioned Keras command "Convolution2D"?

我正在研究不同的 CNN 架构来预测 CIFAR10 数据集,我发现这个有趣的 Github 存储库:

https://gist.github.com/wielandbrendel/ccf1ff6f8f92139439be

我尝试 运行 模型,但它是 6 年前创建的,以下 Keras 命令不再有效:

model.add(Convolution2D(32, 3, 3, 3, border_mode='full'))

如何将此命令翻译成 Conv2D 的现代 Keras 语法?

当我尝试在 Convolution2D(32, 3, 3, 3, ...) 中输入整数序列时,我在 Keras 中遇到错误? 我猜 32 是通道数,然后我们指定一个 3x3 内核大小,但我不确定最后提到的 3 的含义(第4位)。

PS。将border_mode改成padding = 'valid''same'returns出现如下错误:

    model.add(Convolution2D(32, 3, 3, 3, padding='valid'))
TypeError: __init__() got multiple values for argument 'padding'

Convolutional2D 现在被命名为 Conv2D,但是 Convolutional2D 仍然有一个别名,所以这不是问题。

border_mode 参数不再可用,等同于 padding,选项为 validsame

尝试两者,看看是否有任何符合输出的形状并允许代码工作。

您关注的 gist 已过时,并且存在一些问题。你现在不需要遵循这个。这是它的更新版本。试试这个。

导入和数据集

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import (Dense, Dropout, Activation, 
                                    Flatten, Conv2D, MaxPooling2D)
from tensorflow.keras.optimizers import SGD, Adadelta, Adagrad
import tensorflow as tf 

# parameters
batch_size = 32
nb_classes = 10
nb_epoch = 5

# the data, shuffled and split between tran and test sets
(X_train, y_train), (X_test, y_test) = tf.keras.datasets.cifar10.load_data()

# convert class vectors to binary class matrices
Y_train = tf.keras.utils.to_categorical(y_train, nb_classes) 
Y_test = tf.keras.utils.to_categorical(y_test, nb_classes)

# train model
X_train = X_train.astype("float32") / 255
X_test = X_test.astype("float32") / 255

X_train.shape, y_train.shape, X_test.shape, y_test.shape
((50000, 32, 32, 3), (50000, 1), (10000, 32, 32, 3), (10000, 1))

建模

model = Sequential()

model.add(Conv2D(filters=32, kernel_size=(3, 3), 
                 strides=(1, 1), activation='relu', padding="same"))
model.add(Activation('relu'))
model.add(Conv2D(filters=32, kernel_size=(3, 3), 
                strides=(1, 1), activation='relu', padding="same"))
model.add(Activation('relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(filters=32, kernel_size=(3, 3), 
                 strides=(1, 1), activation='relu', padding="same"))
model.add(Activation('relu'))
model.add(Conv2D(filters=32, kernel_size=(3, 3), 
                 strides=(1, 1), activation='relu', padding="same"))
model.add(Activation('relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))

model.add(Dense(nb_classes))
model.add(Activation('softmax'))

# let's train the model using SGD + momentum (how original).
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])

编译并运行

model.fit(X_train, Y_train, batch_size=batch_size, epochs=nb_epoch)

# test score & top 1 performance
score = model.evaluate(X_test, Y_test, batch_size=batch_size)
y_hat = model.predict(X_test)
yhat = np.argmax(y_hat, 1)
top1 = np.mean(yhat == np.squeeze(y_test))

print('Test score/Top1', score, top1)