我刚刚开始用Python 3.7.7学习Tensorflow(2.1.0)和Keras(2.3.7)
我有这个网络:
def vgg16(input_size = (224,224,3)):
inputs = Input(input_size, name='input')
conv1 = Conv2D(64, (3, 3), activation = 'relu', padding = 'same', name ='conv1_1')(inputs)
conv1 = Conv2D(64, (3, 3), activation = 'relu', padding = 'same', name ='conv1_2')(conv1)
pool1 = MaxPooling2D(pool_size = (2,2), strides = (2,2), name = 'pool_1')(conv1)
conv2 = Conv2D(128, (3, 3), activation = 'relu', padding = 'same', name ='conv2_1')(pool1)
conv2 = Conv2D(128, (3, 3), activation = 'relu', padding = 'same', name ='conv2_2')(conv2)
pool2 = MaxPooling2D(pool_size = (2,2), strides = (2,2), name = 'pool_2')(conv2)
conv3 = Conv2D(256, (3, 3), activation = 'relu', padding = 'same', name ='conv3_1')(pool2)
conv3 = Conv2D(256, (3, 3), activation = 'relu', padding = 'same', name ='conv3_2')(conv3)
conv3 = Conv2D(256, (3, 3), activation = 'relu', padding = 'same', name ='conv3_3')(conv3)
pool3 = MaxPooling2D(pool_size = (2,2), strides = (2,2), name = 'pool_3')(conv3)
conv4 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv4_1')(pool3)
conv4 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv4_2')(conv4)
conv4 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv4_3')(conv4)
conv5 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv5_1')(pool4)
conv5 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv5_2')(conv5)
conv5 = Conv2D(512, (3, 3), activation = 'relu', padding = 'same', name ='conv5_3')(conv5)
pool5 = MaxPooling2D(pool_size = (2,2), strides = (2,2), name = 'pool_5')(conv5)
flatten = Flatten(name = 'flatten')(pool5)
dense1 = Dense(units = 4096,activation = "relu", name = 'dense_1')(flatten)
dense2 = Dense(units = 4096,activation = "relu", name = 'dense_2')(dense1)
dense3 = Dense(units = 2, activation = "softmax", name = 'dense_3')(dense2)
opt = Adam(lr=0.001)
model = Model(inputs = inputs, outputs = dense3, name ='vgg-16')
model.compile(optimizer=opt, loss=keras.losses.categorical_crossentropy, metrics=['accuracy'])
return model
这是使用它的代码:
model = vgg16(input_size=(200, 200, 1))
for episode in range(num_episodes):
selected = np.random.permutation(no_of_samples)[:num_shot + num_query]
# Create our Support Set.
support_set = np.array(D[selected[:num_shot]])
# Create our Query Set.
query_set = np.array(D[selected[num_query:]])
X_train = support_set[:,0,:]
y_train = support_set[:,1,:]
X_valid = query_set[:,0,:]
y_valid = query_set[:,1,:]
results = model.fit(X_train, y_train, epochs=20, batch_size=5,
validation_data=(X_valid, y_valid))
X_train
、y_train
、X_valid
和y_valid
有一个这样的形状:(5, 200, 200, 1)
但我得到了这个错误:
Error when checking target: expected dense_3 to have 2 dimensions, but got array with shape (5, 200, 200, 1)
我不明白为什么。我已更改了fit
调用以删除batch_size
:
results = model.fit(X_train, y_train, epochs=20, validation_data=(X_valid, y_valid))
但我得到了同样的错误:
如何修复此错误
也许,问题是我使用的是one频道图像
模型摘要:
Model: "vgg-16"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input (InputLayer) (None, 200, 200, 1) 0
_________________________________________________________________
conv1_1 (Conv2D) (None, 200, 200, 64) 640
_________________________________________________________________
conv1_2 (Conv2D) (None, 200, 200, 64) 36928
_________________________________________________________________
pool_1 (MaxPooling2D) (None, 100, 100, 64) 0
_________________________________________________________________
conv2_1 (Conv2D) (None, 100, 100, 128) 73856
_________________________________________________________________
conv2_2 (Conv2D) (None, 100, 100, 128) 147584
_________________________________________________________________
pool_2 (MaxPooling2D) (None, 50, 50, 128) 0
_________________________________________________________________
conv3_1 (Conv2D) (None, 50, 50, 256) 295168
_________________________________________________________________
conv3_2 (Conv2D) (None, 50, 50, 256) 590080
_________________________________________________________________
conv3_3 (Conv2D) (None, 50, 50, 256) 590080
_________________________________________________________________
pool_3 (MaxPooling2D) (None, 25, 25, 256) 0
_________________________________________________________________
conv4_1 (Conv2D) (None, 25, 25, 512) 1180160
_________________________________________________________________
conv4_2 (Conv2D) (None, 25, 25, 512) 2359808
_________________________________________________________________
conv4_3 (Conv2D) (None, 25, 25, 512) 2359808
_________________________________________________________________
pool_4 (MaxPooling2D) (None, 12, 12, 512) 0
_________________________________________________________________
conv5_1 (Conv2D) (None, 12, 12, 512) 2359808
_________________________________________________________________
conv5_2 (Conv2D) (None, 12, 12, 512) 2359808
_________________________________________________________________
conv5_3 (Conv2D) (None, 12, 12, 512) 2359808
_________________________________________________________________
pool_5 (MaxPooling2D) (None, 6, 6, 512) 0
_________________________________________________________________
flatten (Flatten) (None, 18432) 0
_________________________________________________________________
dense_1 (Dense) (None, 4096) 75501568
_________________________________________________________________
dense_2 (Dense) (None, 4096) 16781312
_________________________________________________________________
dense_3 (Dense) (None, 2) 8194
=================================================================
Total params: 107,004,610
Trainable params: 107,004,610
Non-trainable params: 0
_________________________________________________________________
您的训练数据有
5
、(200,200,1)
个图像,这是正确的,但是目标数据(y
)应该是5
对应的标签,带有(2,)
形状。所以y_train
的形状应该是(5,2)
。现在它们的形状不对根据您的网络摘要
您的
X_train
和X_valid
需要具有(224,224,3)
的形状 您的
y_train
和y_valid
需要有总计2 classes
,并且由于keras.losses.categorical_crossentropy
的原因,需要是一个热编码的编辑:
当输出为N类的数组时:
Dense(N,"softmax")
keras.losses.sparse_categorical_crossentropy
当输出为一个热编码N类时:
keras.utils.to_categorical(array, N)
Dense(N,"softmax")
keras.losses.categorical_crossentropy
当目的不是分类时:
autoencoder
概念,查看如何生成与输入形状相同的输出相关问题 更多 >
编程相关推荐