简体   繁体   English

我将如何 go 关于更改 Alex 网络的 input_shape(使用 tf-keras)?

[英]How would I go about changing the input_shape for Alex net (with tf-keras)?

Here is the code:这是代码:

def AlexNet(log_path, save_path, input_shape):
# code source => 'engmrk.com/alexnet-implementation-using-keras'
# model definition
model = models.Sequential()

# 1st Convolutional Layer
model.add(layers.Conv2D(filters=96, input_shape=(INPUT_SHAPE), kernel_size=(11,11), strides=(4,4), padding='valid'))
model.add(layers.Activation('relu'))
# Max Pooling
model.add(layers.MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='valid'))

# 2nd Convolutional Layer
model.add(layers.Conv2D(filters=256, kernel_size=(11,11), strides=(1,1), padding='valid'))
model.add(layers.Activation('relu'))
# Max Pooling
model.add(layers.MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='valid'))

# 3rd Convolutional Layer
model.add(layers.Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), padding='valid'))
model.add(layers.Activation('relu'))

# 4th Convolutional Layer
model.add(layers.Conv2D(filters=384, kernel_size=(3,3), strides=(1,1), padding='valid'))
model.add(layers.Activation('relu'))

# 5th Convolutional Layer
model.add(layers.Conv2D(filters=256, kernel_size=(3,3), strides=(1,1), padding='valid'))
model.add(layers.Activation('relu'))
# Max Pooling
model.add(layers.MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='valid'))

# Passing it to a Fully Connected layer
model.add(layers.Flatten())
# 1st Fully Connected Layer
model.add(layers.Dense(4096, input_shape=(input_shape[0] * input_shape[1] * input_shape[2],))
model.add(layers.Activation('relu'))
# Add Dropout to prevent overfitting
model.add(layers.Dropout(0.4))

# 2nd Fully Connected Layer
model.add(layers.Dense(4096))
model.add(layers.Activation('relu'))
# Add Dropout
model.add(layers.Dropout(0.4))

# 3rd Fully Connected Layer
model.add(layers.Dense(1000))
model.add(layers.Activation('relu'))
# Add Dropout
model.add(layers.Dropout(0.4))

# Output Layer
model.add(layers.Dense(17))
model.add(layers.Activation('softmax'))

model.summary()

When I tried, just changing the input shape to (91, 74, 3), I got this error:当我尝试将输入形状更改为 (91, 74, 3) 时,我收到此错误:

ValueError: Negative dimension size caused by subtracting 11 from 10 for '{{node conv2d_1/Conv2D}} = Conv2D[T=DT_FLOAT, data_format="NHWC", dilations=[1, 1, 1, 1], explicit_paddings=[], padding="VALID", strides=[1, 1, 1, 1], use_cudnn_on_gpu=true](max_pooling2d/Identity, conv2d_1/Conv2D/ReadVariableOp)' with input shapes: [?,19,10,96], [11,11,96,256].

Now how would I go about changing, for example, the strides and or kernel_size if I wanted to do AlexNet with a dataset of RGB (91 * 74) images which have the input shape --> (91, 74, 3).现在,如果我想用具有输入形状的 RGB (91 * 74) 图像数据集做 AlexNet,我将如何更改步幅和或 kernel_size --> (91, 74, 3)。

Is this even possible, if so how?这甚至可能吗,如果可以的话怎么办?

Thank you....谢谢....

Convolutional layers and average pooling or max pooling layers reduce the size of the image w, h as you go deeper into the network, if you start with a small image it might end up having negative dimensions which doesn't make any sense.卷积层和平均池化或最大池化层会减小图像w, h的大小,因为您 go 深入网络,如果您从小图像开始,它可能最终具有没有任何意义的负尺寸。 if you want to start with small images try removing some of the max_pool layers or use padding="same" on the conv layers or just reduce the depth of the network's architecture.如果您想从小图像开始尝试删除一些 max_pool 层或在 conv 层上使用padding="same"或只是减少网络架构的深度。

example: after the first layer the shape is gonna be (21, 16, 96) .示例:在第一层之后,形状将是(21, 16, 96)
How to calculate the output: for valid padding it is ((W - F) / S) +1 for same padding the output shape is the same as the input shape except the number of channels如何计算 output:对于valid填充,它是((W - F) / S) +1对于same的填充 output 形状与输入形状相同,但通道数除外

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM