Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow为VGG模型返回10%的验证精度(与历次数无关)?_Tensorflow_Neural Network_Keras_Conv Neural Network_Vgg Net - Fatal编程技术网

Tensorflow为VGG模型返回10%的验证精度(与历次数无关)?

Tensorflow为VGG模型返回10%的验证精度(与历次数无关)?,tensorflow,neural-network,keras,conv-neural-network,vgg-net,Tensorflow,Neural Network,Keras,Conv Neural Network,Vgg Net,我正在尝试使用tensorflow中的keras软件包在CIFAR-10上训练神经网络。考虑的神经网络是VGG-16,我直接借用了官方的keras模型。 定义是: def cnn_model(nb_classes=10): # VGG-16 official keras model img_input= Input(shape=(32,32,3)) vgg_layer= Conv2D(64, (3, 3), activation='relu', padding='same', name='blo

我正在尝试使用tensorflow中的keras软件包在CIFAR-10上训练神经网络。考虑的神经网络是VGG-16,我直接借用了官方的keras模型。 定义是:

def cnn_model(nb_classes=10):
# VGG-16 official keras model
img_input= Input(shape=(32,32,3))
vgg_layer= Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv1')(img_input)
vgg_layer= Conv2D(64, (3, 3), activation='relu', padding='same', name='block1_conv2')(vgg_layer)
vgg_layer= MaxPooling2D((2, 2), strides=(2, 2), name='block1_pool')(vgg_layer)

# Block 2
vgg_layer= Conv2D(64, (3, 3), activation='relu', padding='same', name='block2_conv1')(vgg_layer)
vgg_layer= Conv2D(64, (3, 3), activation='relu', padding='same', name='block2_conv2')(vgg_layer)
vgg_layer= MaxPooling2D((2, 2), strides=(2, 2), name='block2_pool')(vgg_layer)

# Block 3
vgg_layer= Conv2D(128, (3, 3), activation='relu', padding='same', name='block3_conv1')(vgg_layer)
vgg_layer= Conv2D(128, (3, 3), activation='relu', padding='same', name='block3_conv2')(vgg_layer)
vgg_layer= Conv2D(128, (3, 3), activation='relu', padding='same', name='block3_conv3')(vgg_layer)
vgg_layer= MaxPooling2D((2, 2), strides=(2, 2), name='block3_pool')(vgg_layer)

# Block 4
vgg_layer= Conv2D(256, (3, 3), activation='relu', padding='same', name='block4_conv1')(vgg_layer)
vgg_layer= Conv2D(256, (3, 3), activation='relu', padding='same', name='block4_conv2')(vgg_layer)
vgg_layer= Conv2D(256, (3, 3), activation='relu', padding='same', name='block4_conv3')(vgg_layer)
vgg_layer= MaxPooling2D((2, 2), strides=(2, 2), name='block4_pool')(vgg_layer)

# Classification block
vgg_layer= Flatten(name='flatten')(vgg_layer)
vgg_layer= Dense(1024, activation='relu', name='fc1')(vgg_layer)
vgg_layer= Dense(1024, activation='relu', name='fc2')(vgg_layer)
vgg_layer= Dense(nb_classes, activation='softmax', name='predictions')(vgg_layer)

return Model(inputs=img_input, outputs=vgg_layer)
然而,在培训期间,我总是得到培训和验证准确率为0.1,即10%

validation accuracy for adv. training of model for epoch 1=  0.1
validation accuracy for adv. training of model for epoch 2=  0.1
validation accuracy for adv. training of model for epoch 3=  0.1
validation accuracy for adv. training of model for epoch 4=  0.1
validation accuracy for adv. training of model for epoch 5=  0.1
作为调试的一步,每当我用任何其他模型(例如,任何简单的CNN模型)替换它时,它都工作得非常好。这表明脚本的其余部分运行良好

例如,下面的CNN模型工作得非常好,在30个时代后达到75%的准确率

def cnn_model(nb_classes=10, num_hidden=1024, weight_decay= 0.0001, cap_factor=4):
model=Sequential()
input_shape = (32,32,3)
model.add(Conv2D(32*cap_factor, kernel_size=(3,3), strides=(1,1), kernel_regularizer=keras.regularizers.l2(weight_decay), kernel_initializer="he_normal", activation='relu', padding='same', input_shape=input_shape))
model.add(Conv2D(32*cap_factor, kernel_size=(3,3), strides=(1,1), kernel_regularizer=keras.regularizers.l2(weight_decay), kernel_initializer="he_normal", activation="relu", padding="same"))
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))
model.add(BatchNormalization())
model.add(Dropout(0.25))

model.add(Conv2D(64*cap_factor, kernel_size=(3,3), strides=(1,1), kernel_regularizer=keras.regularizers.l2(weight_decay), kernel_initializer="he_normal", activation="relu", padding="same"))
model.add(Conv2D(64*cap_factor, kernel_size=(3,3), strides=(1,1), kernel_regularizer=keras.regularizers.l2(weight_decay), kernel_initializer="he_normal", activation="relu", padding="same"))
model.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))
model.add(BatchNormalization())
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(num_hidden, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(nb_classes, activation='softmax'))
return model
在我看来,这两个模型的定义都是正确的。然而,一个工作完美,而另一个根本不学习。我还尝试将VGG模型编写为一个顺序结构,即与第二个类似,但它仍然给了我10%的准确性

即使模型不更新任何权重,“he_normal”初始值设定项也很容易获得比纯偶然性更好的精度。似乎tensorflow通过计算模型的输出逻辑得出了精确性,这纯粹是偶然的


如果有人能指出我的错误,我会很有帮助的

你的10%与等级数=10相当。这让我觉得,无论是哪种培训,你的答案在所有类别中都是“1”,在10门课程中,你的准确率始终为10%

  • 检查未经训练的模型的输出(如果始终为1)
  • 如果是这样,检查模型的初始权重,可能是初始化错误,梯度为零,无法收敛

  • 你的10%与等级数=10相当。这让我觉得,无论是哪种培训,你的答案在所有类别中都是“1”,在10门课程中,你的准确率始终为10%

  • 检查未经训练的模型的输出(如果始终为1)
  • 如果是这样,检查模型的初始权重,可能是初始化错误,梯度为零,无法收敛

  • 在最后一次卷积运算结束时,我们将使用1x1,这当然不是vgg的用途。它是为更大的imagenet输入而设计的。在vgg模型中,nb_类的用途是什么?它不是函数的一个参数。@CodesInChaos我同意,但即使我删除了最后一个或两个池层,它也显示了同样的10%的精度。到最后一个卷积运算结束时,您将下降到1x1,这肯定不是vgg的用途。它是为更大的imagenet输入而设计的。在vgg模型中,nb_类的用途是什么?它不是函数的一个参数。@CodesInChaos我同意,但即使我删除了最后一个或两个池层,它也显示了同样的10%精度。