如何指定相关系数作为keras中的损失函数(How to specify the correlation coefficient as the loss function in keras)
我第一次使用keras + tensorflow。 我想指定相关系数作为损失函数。 这是有道理的,以便它是一个介于0和1之间的数字,其中0是不好的,1是好的。
我的基本代码目前看起来像:
def baseline_model(): model = Sequential() model.add(Dense(4000, input_dim=n**2, kernel_initializer='normal', activation='relu')) model.add(Dense(1, kernel_initializer='normal')) # Compile model model.compile(loss='mean_squared_error', optimizer='adam') return model estimators = [] estimators.append(('standardize', StandardScaler())) estimators.append(('mlp', KerasRegressor(build_fn=baseline_model, epochs=100, batch_size=32, verbose=2))) pipeline = Pipeline(estimators) kfold = KFold(n_splits=10, random_state=0) results = cross_val_score(pipeline, X, Y, cv=kfold) print("Standardized: %.2f (%.2f) MSE" % (results.mean(), results.std()))
我该如何改变这一点,以便优化以最小化平方相关系数?
我尝试了以下内容:
def correlation_coefficient(y_true, y_pred): pearson_r, _ = tf.contrib.metrics.streaming_pearson_correlation(y_pred, y_true) return 1-pearson_r**2 def baseline_model(): # create model model = Sequential() model.add(Dense(4000, input_dim=n**2, kernel_initializer='normal', activation='relu')) # model.add(Dense(2000, kernel_initializer='normal', activation='relu')) model.add(Dense(1, kernel_initializer='normal')) # Compile model model.compile(loss=correlation_coefficient, optimizer='adam') return model
但这崩溃了:
Traceback (most recent call last): File "deeplearning-det.py", line 67, in <module> results = cross_val_score(pipeline, X, Y, cv=kfold) File "/home/user/.local/lib/python3.5/site-packages/sklearn/model_selection/_validation.py", line 321, in cross_val_score pre_dispatch=pre_dispatch) File "/home/user/.local/lib/python3.5/site-packages/sklearn/model_selection/_validation.py", line 195, in cross_validate for train, test in cv.split(X, y, groups)) File "/home/user/.local/lib/python3.5/site-packages/sklearn/externals/joblib/parallel.py", line 779, in __call__ while self.dispatch_one_batch(iterator): File "/home/user/.local/lib/python3.5/site-packages/sklearn/externals/joblib/parallel.py", line 625, in dispatch_one_batch self._dispatch(tasks) File "/home/user/.local/lib/python3.5/site-packages/sklearn/externals/joblib/parallel.py", line 588, in _dispatch job = self._backend.apply_async(batch, callback=cb) File "/home/user/.local/lib/python3.5/site-packages/sklearn/externals/joblib/_parallel_backends.py", line 111, in apply_async result = ImmediateResult(func) File "/home/user/.local/lib/python3.5/site-packages/sklearn/externals/joblib/_parallel_backends.py", line 332, in __init__ self.results = batch() File "/home/user/.local/lib/python3.5/site-packages/sklearn/externals/joblib/parallel.py", line 131, in __call__ return [func(*args, **kwargs) for func, args, kwargs in self.items] File "/home/user/.local/lib/python3.5/site-packages/sklearn/externals/joblib/parallel.py", line 131, in <listcomp> return [func(*args, **kwargs) for func, args, kwargs in self.items] File "/home/user/.local/lib/python3.5/site-packages/sklearn/model_selection/_validation.py", line 437, in _fit_and_score estimator.fit(X_train, y_train, **fit_params) File "/home/user/.local/lib/python3.5/site-packages/sklearn/pipeline.py", line 259, in fit self._final_estimator.fit(Xt, y, **fit_params) File "/home/user/.local/lib/python3.5/site-packages/keras/wrappers/scikit_learn.py", line 147, in fit history = self.model.fit(x, y, **fit_args) File "/home/user/.local/lib/python3.5/site-packages/keras/models.py", line 867, in fit initial_epoch=initial_epoch) File "/home/user/.local/lib/python3.5/site-packages/keras/engine/training.py", line 1575, in fit self._make_train_function() File "/home/user/.local/lib/python3.5/site-packages/keras/engine/training.py", line 960, in _make_train_function loss=self.total_loss) File "/home/user/.local/lib/python3.5/site-packages/keras/legacy/interfaces.py", line 87, in wrapper return func(*args, **kwargs) File "/home/user/.local/lib/python3.5/site-packages/keras/optimizers.py", line 432, in get_updates m_t = (self.beta_1 * m) + (1. - self.beta_1) * g File "/home/user/.local/lib/python3.5/site-packages/tensorflow/python/ops/math_ops.py", line 856, in binary_op_wrapper y = ops.convert_to_tensor(y, dtype=x.dtype.base_dtype, name="y") File "/home/user/.local/lib/python3.5/site-packages/tensorflow/python/framework/ops.py", line 611, in convert_to_tensor as_ref=False) File "/home/user/.local/lib/python3.5/site-packages/tensorflow/python/framework/ops.py", line 676, in internal_convert_to_tensor ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref) File "/home/user/.local/lib/python3.5/site-packages/tensorflow/python/framework/constant_op.py", line 121, in _constant_tensor_conversion_function return constant(v, dtype=dtype, name=name) File "/home/user/.local/lib/python3.5/site-packages/tensorflow/python/framework/constant_op.py", line 102, in constant tensor_util.make_tensor_proto(value, dtype=dtype, shape=shape, verify_shape=verify_shape)) File "/home/user/.local/lib/python3.5/site-packages/tensorflow/python/framework/tensor_util.py", line 364, in make_tensor_proto raise ValueError("None values not supported.") ValueError: None values not supported.
更新1
根据下面的答案,代码现在运行。 不幸的是,
correlation_coefficient
和correlation_coefficient_loss
函数给出了彼此不同的值,我不确定它们中的任何一个是否与1- scipy.stats.pearsonr ()[0] ** 2相同。为什么损失函数给出了错误的输出?它们如何被修正以给出与
1 - scipy.stats.pearsonr()[0]**2
相同的值1 - scipy.stats.pearsonr()[0]**2
会给出什么?这是完全独立的代码,应该运行:
import numpy as np import sys import math from scipy.stats import ortho_group from scipy.stats import pearsonr import matplotlib.pyplot as plt from keras.models import Sequential from keras.layers import Dense from keras.wrappers.scikit_learn import KerasRegressor from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.pipeline import Pipeline import tensorflow as tf from keras import backend as K def permanent(M): n = M.shape[0] d = np.ones(n) j = 0 s = 1 f = np.arange(n) v = M.sum(axis=0) p = np.prod(v) while (j < n-1): v -= 2*d[j]*M[j] d[j] = -d[j] s = -s prod = np.prod(v) p += s*prod f[0] = 0 f[j] = f[j+1] f[j+1] = j+1 j = f[0] return p/2**(n-1) def correlation_coefficient_loss(y_true, y_pred): x = y_true y = y_pred mx = K.mean(x) my = K.mean(y) xm, ym = x-mx, y-my r_num = K.sum(xm * ym) r_den = K.sum(K.sum(K.square(xm)) * K.sum(K.square(ym))) r = r_num / r_den return 1 - r**2 def correlation_coefficient(y_true, y_pred): pearson_r, update_op = tf.contrib.metrics.streaming_pearson_correlation(y_pred, y_true) # find all variables created for this metric metric_vars = [i for i in tf.local_variables() if 'correlation_coefficient' in i.name.split('/')[1]] # Add metric variables to GLOBAL_VARIABLES collection. # They will be initialized for new session. for v in metric_vars: tf.add_to_collection(tf.GraphKeys.GLOBAL_VARIABLES, v) # force to update metric values with tf.control_dependencies([update_op]): pearson_r = tf.identity(pearson_r) return 1-pearson_r**2 def baseline_model(): # create model model = Sequential() model.add(Dense(4000, input_dim=no_rows**2, kernel_initializer='normal', activation='relu')) # model.add(Dense(2000, kernel_initializer='normal', activation='relu')) model.add(Dense(1, kernel_initializer='normal')) # Compile model model.compile(loss=correlation_coefficient_loss, optimizer='adam', metrics=[correlation_coefficient]) return model no_rows = 8 print("Making the input data using seed 7", file=sys.stderr) np.random.seed(7) U = ortho_group.rvs(no_rows**2) U = U[:, :no_rows] # U is a random orthogonal matrix X = [] Y = [] print(U) for i in range(40000): I = np.random.choice(no_rows**2, size = no_rows) A = U[I][np.lexsort(np.rot90(U[I]))] X.append(A.ravel()) Y.append(-math.log(permanent(A)**2, 2)) X = np.array(X) Y = np.array(Y) estimators = [] estimators.append(('standardize', StandardScaler())) estimators.append(('mlp', KerasRegressor(build_fn=baseline_model, epochs=100, batch_size=32, verbose=2))) pipeline = Pipeline(estimators) X_train, X_test, y_train, y_test = train_test_split(X, Y, train_size=0.75, test_size=0.25) pipeline.fit(X_train, y_train)
更新2
我放弃了
correlation_coefficient
函数,现在只是使用下面的JulioDanielReyes给出的correlation_coefficient_loss函数。 但是,这仍然是错误的,或者keras显着过度拟合。 即使我有:def baseline_model(): model = Sequential() model.add(Dense(40, input_dim=no_rows**2, kernel_initializer='normal', activation='relu')) model.add(Dense(1, kernel_initializer='normal')) model.compile(loss=correlation_coefficient_loss, optimizer='adam', metrics=[correlation_coefficient_loss]) return model
例如,在100个时期后我损失了0.6653,但是当我测试训练好的模型时损失了0.857。
它如何过度拟合隐藏层中的这么少数量的节点?
I am using keras+tensorflow for the first time. I would like to specify the correlation coefficient as the loss function. It makes sense to square it so that it is a number between 0 and 1 where 0 is bad and 1 is good.
My basic code currently looks like:
def baseline_model(): model = Sequential() model.add(Dense(4000, input_dim=n**2, kernel_initializer='normal', activation='relu')) model.add(Dense(1, kernel_initializer='normal')) # Compile model model.compile(loss='mean_squared_error', optimizer='adam') return model estimators = [] estimators.append(('standardize', StandardScaler())) estimators.append(('mlp', KerasRegressor(build_fn=baseline_model, epochs=100, batch_size=32, verbose=2))) pipeline = Pipeline(estimators) kfold = KFold(n_splits=10, random_state=0) results = cross_val_score(pipeline, X, Y, cv=kfold) print("Standardized: %.2f (%.2f) MSE" % (results.mean(), results.std()))
How can I change this so that it optimizes to minimize the squared correlation coefficient instead?
I tried the following:
def correlation_coefficient(y_true, y_pred): pearson_r, _ = tf.contrib.metrics.streaming_pearson_correlation(y_pred, y_true) return 1-pearson_r**2 def baseline_model(): # create model model = Sequential() model.add(Dense(4000, input_dim=n**2, kernel_initializer='normal', activation='relu')) # model.add(Dense(2000, kernel_initializer='normal', activation='relu')) model.add(Dense(1, kernel_initializer='normal')) # Compile model model.compile(loss=correlation_coefficient, optimizer='adam') return model
but this crashes with:
Traceback (most recent call last): File "deeplearning-det.py", line 67, in <module> results = cross_val_score(pipeline, X, Y, cv=kfold) File "/home/user/.local/lib/python3.5/site-packages/sklearn/model_selection/_validation.py", line 321, in cross_val_score pre_dispatch=pre_dispatch) File "/home/user/.local/lib/python3.5/site-packages/sklearn/model_selection/_validation.py", line 195, in cross_validate for train, test in cv.split(X, y, groups)) File "/home/user/.local/lib/python3.5/site-packages/sklearn/externals/joblib/parallel.py", line 779, in __call__ while self.dispatch_one_batch(iterator): File "/home/user/.local/lib/python3.5/site-packages/sklearn/externals/joblib/parallel.py", line 625, in dispatch_one_batch self._dispatch(tasks) File "/home/user/.local/lib/python3.5/site-packages/sklearn/externals/joblib/parallel.py", line 588, in _dispatch job = self._backend.apply_async(batch, callback=cb) File "/home/user/.local/lib/python3.5/site-packages/sklearn/externals/joblib/_parallel_backends.py", line 111, in apply_async result = ImmediateResult(func) File "/home/user/.local/lib/python3.5/site-packages/sklearn/externals/joblib/_parallel_backends.py", line 332, in __init__ self.results = batch() File "/home/user/.local/lib/python3.5/site-packages/sklearn/externals/joblib/parallel.py", line 131, in __call__ return [func(*args, **kwargs) for func, args, kwargs in self.items] File "/home/user/.local/lib/python3.5/site-packages/sklearn/externals/joblib/parallel.py", line 131, in <listcomp> return [func(*args, **kwargs) for func, args, kwargs in self.items] File "/home/user/.local/lib/python3.5/site-packages/sklearn/model_selection/_validation.py", line 437, in _fit_and_score estimator.fit(X_train, y_train, **fit_params) File "/home/user/.local/lib/python3.5/site-packages/sklearn/pipeline.py", line 259, in fit self._final_estimator.fit(Xt, y, **fit_params) File "/home/user/.local/lib/python3.5/site-packages/keras/wrappers/scikit_learn.py", line 147, in fit history = self.model.fit(x, y, **fit_args) File "/home/user/.local/lib/python3.5/site-packages/keras/models.py", line 867, in fit initial_epoch=initial_epoch) File "/home/user/.local/lib/python3.5/site-packages/keras/engine/training.py", line 1575, in fit self._make_train_function() File "/home/user/.local/lib/python3.5/site-packages/keras/engine/training.py", line 960, in _make_train_function loss=self.total_loss) File "/home/user/.local/lib/python3.5/site-packages/keras/legacy/interfaces.py", line 87, in wrapper return func(*args, **kwargs) File "/home/user/.local/lib/python3.5/site-packages/keras/optimizers.py", line 432, in get_updates m_t = (self.beta_1 * m) + (1. - self.beta_1) * g File "/home/user/.local/lib/python3.5/site-packages/tensorflow/python/ops/math_ops.py", line 856, in binary_op_wrapper y = ops.convert_to_tensor(y, dtype=x.dtype.base_dtype, name="y") File "/home/user/.local/lib/python3.5/site-packages/tensorflow/python/framework/ops.py", line 611, in convert_to_tensor as_ref=False) File "/home/user/.local/lib/python3.5/site-packages/tensorflow/python/framework/ops.py", line 676, in internal_convert_to_tensor ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref) File "/home/user/.local/lib/python3.5/site-packages/tensorflow/python/framework/constant_op.py", line 121, in _constant_tensor_conversion_function return constant(v, dtype=dtype, name=name) File "/home/user/.local/lib/python3.5/site-packages/tensorflow/python/framework/constant_op.py", line 102, in constant tensor_util.make_tensor_proto(value, dtype=dtype, shape=shape, verify_shape=verify_shape)) File "/home/user/.local/lib/python3.5/site-packages/tensorflow/python/framework/tensor_util.py", line 364, in make_tensor_proto raise ValueError("None values not supported.") ValueError: None values not supported.
Update 1
Following the answer below the code now runs. Unfortunately, the
correlation_coefficient
andcorrelation_coefficient_loss
functions give different values from each other and I am not sure either of them is the same as you would get from 1- scipy.stats.pearsonr()[0]**2.Why are loss functions giving the wrong outputs and how can they be corrected to give the same values as
1 - scipy.stats.pearsonr()[0]**2
would give?Here is the completely self contained code that should just run:
import numpy as np import sys import math from scipy.stats import ortho_group from scipy.stats import pearsonr import matplotlib.pyplot as plt from keras.models import Sequential from keras.layers import Dense from keras.wrappers.scikit_learn import KerasRegressor from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.pipeline import Pipeline import tensorflow as tf from keras import backend as K def permanent(M): n = M.shape[0] d = np.ones(n) j = 0 s = 1 f = np.arange(n) v = M.sum(axis=0) p = np.prod(v) while (j < n-1): v -= 2*d[j]*M[j] d[j] = -d[j] s = -s prod = np.prod(v) p += s*prod f[0] = 0 f[j] = f[j+1] f[j+1] = j+1 j = f[0] return p/2**(n-1) def correlation_coefficient_loss(y_true, y_pred): x = y_true y = y_pred mx = K.mean(x) my = K.mean(y) xm, ym = x-mx, y-my r_num = K.sum(xm * ym) r_den = K.sum(K.sum(K.square(xm)) * K.sum(K.square(ym))) r = r_num / r_den return 1 - r**2 def correlation_coefficient(y_true, y_pred): pearson_r, update_op = tf.contrib.metrics.streaming_pearson_correlation(y_pred, y_true) # find all variables created for this metric metric_vars = [i for i in tf.local_variables() if 'correlation_coefficient' in i.name.split('/')[1]] # Add metric variables to GLOBAL_VARIABLES collection. # They will be initialized for new session. for v in metric_vars: tf.add_to_collection(tf.GraphKeys.GLOBAL_VARIABLES, v) # force to update metric values with tf.control_dependencies([update_op]): pearson_r = tf.identity(pearson_r) return 1-pearson_r**2 def baseline_model(): # create model model = Sequential() model.add(Dense(4000, input_dim=no_rows**2, kernel_initializer='normal', activation='relu')) # model.add(Dense(2000, kernel_initializer='normal', activation='relu')) model.add(Dense(1, kernel_initializer='normal')) # Compile model model.compile(loss=correlation_coefficient_loss, optimizer='adam', metrics=[correlation_coefficient]) return model no_rows = 8 print("Making the input data using seed 7", file=sys.stderr) np.random.seed(7) U = ortho_group.rvs(no_rows**2) U = U[:, :no_rows] # U is a random orthogonal matrix X = [] Y = [] print(U) for i in range(40000): I = np.random.choice(no_rows**2, size = no_rows) A = U[I][np.lexsort(np.rot90(U[I]))] X.append(A.ravel()) Y.append(-math.log(permanent(A)**2, 2)) X = np.array(X) Y = np.array(Y) estimators = [] estimators.append(('standardize', StandardScaler())) estimators.append(('mlp', KerasRegressor(build_fn=baseline_model, epochs=100, batch_size=32, verbose=2))) pipeline = Pipeline(estimators) X_train, X_test, y_train, y_test = train_test_split(X, Y, train_size=0.75, test_size=0.25) pipeline.fit(X_train, y_train)
Update 2
I have given up on the
correlation_coefficient
function and am now just using thecorrelation_coefficient_loss
one as given by JulioDanielReyes below. However, either this is still wrong or keras is dramatically overfitting. Even when I have:def baseline_model(): model = Sequential() model.add(Dense(40, input_dim=no_rows**2, kernel_initializer='normal', activation='relu')) model.add(Dense(1, kernel_initializer='normal')) model.compile(loss=correlation_coefficient_loss, optimizer='adam', metrics=[correlation_coefficient_loss]) return model
I get a loss of, for example, 0.6653 after 100 epochs but 0.857 when I test the trained model.
How can it be overfitting which such a tiny number of nodes in the hidden layer?
原文:https://stackoverflow.com/questions/46619869
最满意答案
您需要检查复选框的默认值和规则。 其中可能有破碎的。
You need to check the checkboxes's default values and rules. There may be broken ones among them.
相关问答
更多-
在重新提交之前,现有表单将不会添加添加的字段。 因为我通过代码访问节点,所以检查了元素在更新时是否可用,如果节点不在那里,我已经按代码创建了节点。 这对我有用。 Existing forms won't have the added field until they resubmitted. Since I was accessing the nodes through the code what I have done was checked the element is available when t ...
-
规则中的InfoPath公式(InfoPath Formula in Rules)[2022-01-30]
发现这似乎可以解释它,以防其他人有同样的问题...... http://blogs.msdn.com/b/infopath/archive/2006/11/27/conditional-default-values.aspx Found this which seems to explain it, in case anyone else has the same issue... http://blogs.msdn.com/b/infopath/archive/2006/11/27/conditional ... -
我发现了一些有关此更改的文档: http : //msdn.microsoft.com/en-us/library/microsoft.office.interop.infopath.infopathcontrol2.refreshstate%28v=office.14%29.aspx - 它很漂亮藏起来。 因此,InfoPath 2007控件实现了Microsoft.Office.Interop.InfoPath.InfoPathControl接口,而InfoPath 2010控件实现了InfoPathC ...
-
通过XPath在SonarQube中添加自己的Java规则不起作用(Adding own rules for Java in SonarQube through XPath not working)[2023-01-01]
自SonarQube 4.4起,自定义规则不通过“质量配置文件”页面进行管理,而是通过“规则”页面进行管理。 请参阅自定义规则菜单似乎不存在 Since SonarQube 4.4, custom rules are not managed through the Quality Profiles page, but rather through the Rules page. See Custom rules menu doesn't seem to be present -
带有层次匹配的XPath(XPath with hiearchical matching)[2022-09-13]
另一个使用ancestor::轴的选项...... //rule[not(@portId = ancestor::container//port/@id)] Another option using the ancestor:: axis... //rule[not(@portId = ancestor::container//port/@id)] -
你正在考虑正确的思路,但如果你的原始XPath适用于静态数字,那么只需用你在第二个XPath中尝试的内容替换@id=''部分,如下所示: //*[contains(@id,'location_in_')] 如果id是一个属性,那么你正在使用第一个XPath正确引用它,这就是你得到回报的原因。 在第二次调用中,您将引用它,就像它是包含您正在查找的文本的节点一样。 换句话说, //id[contains(text(), 'location_in_')]可以用于类似的东西
location ... -
有很多方法可以达到您所需的结果。 一种好方法是使用Directory.GetFiles方法 ,该方法将返回string文件路径的集合: string [] filePaths = Directory.GetFiles(targetDirectory); 然后,您可以使用方法随机化集合的顺序。 从DotNETPerls上的C#Shuffle Array页面: public string[] RandomizeStrings(string[] arr) { List您需要检查复选框的默认值和规则。 其中可能有破碎的。 You need to check the checkboxes's default values and rules. There may be broken ones among them.
jQuery Validation Plugin适用于某些规则但忽略其他规则(jQuery Validation Plugin works for some rules but ignores others)[2022-01-25]
问题是,您要添加默认值所有输入元素而不是使用占位符。 由于输入元素中有值,因此所需的验证将通过,因此没有验证错误。