我有一个在Keras中训练的基础神经网络。我正在尝试调整学习率和动量项的影响,并希望绘制一个漂亮的3D图表来可视化学习率和动量对准确率的影响。
我已经成功地使用示例代码绘制了一个三角曲面图,但当我使用自己的数据时,总是遇到错误。示例似乎使用了大约1000个值的numpy数组,而我只有大约6个不同的学习率和动量值,因此我的numpy数组大小为6、6和36。当我尝试使用这些值绘制图表时,我得到了以下错误:
RuntimeError: Error in qhull Delaunay triangulation calculation: singular input data (exitcode=2)
我不理解这个错误消息,为什么它在示例数据上有效,但在我的数据上无效。有没有建议?
我的代码如下:
momentum_terms = np.array([0.00001,0.0001,0.001,0.01, 0.1, 1])learning_rates = np.array([0.00001,0.0001,0.001,0.01, 0.1, 1])train_accuracies = np.empty([36])test_accuracies = np.empty([36])for learning_rate in learning_rates: for momentum in momentum_terms: model = Sequential() model.add(Dense(18, activation='relu', input_shape = (2,))) model.add(Dense(18, activation='relu')) model.add(Dense(1, activation='sigmoid')) model.summary() model.compile(loss='binary_crossentropy', optimizer=SGD(lr = learning_rate, momentum = momentum), metrics=[binary_accuracy]) history = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_test, y_test)) score = model.evaluate(x_test, y_test, verbose=0) np.append(train_accuracies, history.history['binary_accuracy'][-1] * 100) np.append(test_accuracies, history.history['val_binary_accuracy'][-1] * 100)x = momentum_termsy = learning_ratesz = test_accuraciesax = plt.axes(projection='3d')ax.plot_trisurf(x, y, z, cmap='viridis', edgecolor='none');plt.show()
回答:
您提供的数据不足以生成3D图表(参见这个相关的Stack Overflow问题)。您需要传递36、36和36,而不是6、6和36。重新编写您的代码,以便在循环中存储每个动量项和学习率项的组合及其准确率。
因此,您应该有:
x = [0.00001, 0.00001, 0.00001, 0.00001, 0.00001, 0.00001, 0.0001, 0.0001, …. ] 总共36个值来自学习率选择
y = [0.00001,0.0001,0.001,0.01, 0.1, 1, 0.00001, 0.0001,0.001,0.01, 0.1, 1, …. ] 总共36个值来自动量选择
z = 36个准确率的数组,每个上述组合对应一个