我需要帮助理解深度学习模型的准确性和数据集输出格式。
我根据此网站进行了一些深度学习培训:tweepy
我做了皮马 - 印度 - 糖尿病数据集和虹膜花数据集的例子。我使用以下脚本训练我的计算机用于皮肤印第安人 - 糖尿病数据集:https://machinelearningmastery.com/deep-learning-with-python2/
然后我使用下面的脚本训练我的计算机获取虹膜花数据集。
# import package
import numpy
from pandas import read_csv
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasClassifier
from keras.utils import np_utils
from sklearn.model_selection import cross_val_score, KFold
from sklearn.preprocessing import LabelEncoder
from sklearn.pipeline import Pipeline
from keras.callbacks import ModelCheckpoint
# fix random seed for reproductibility
seed = 7
numpy.random.seed(seed)
# load dataset
dataframe = read_csv("iris_2.csv", header=None)
dataset = dataframe.values
X = dataset[:,0:4].astype(float)
Y = dataset[:,4]
# encode class value as integers
encoder = LabelEncoder()
encoder.fit(Y)
encoded_Y = encoder.transform(Y)
### one-hot encoder ###
dummy_y = np_utils.to_categorical(encoded_Y)
# define base model
def baseline_model():
# create model
model = Sequential()
model.add(Dense(4, input_dim=4, init='normal', activation='relu'))
model.add(Dense(3, init='normal', activation='sigmoid'))
# Compile model
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model_json = model.to_json()
with open("iris.json", "w") as json_file:
json_file.write(model_json)
model.save_weights('iris.h5')
return model
estimator = KerasClassifier(build_fn=baseline_model, nb_epoch=1000, batch_size=6, verbose=0)
kfold = KFold(n_splits=10, shuffle=True, random_state=seed)
results = cross_val_score(estimator, X, dummy_y, cv=kfold)
print("Accuracy: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))
在我决定尝试使用此链接中的其他数据集之前,一切正常:http://machinelearningmastery.com/tutorial-first-neural-network-python-keras/
首先,我使用pime-indian-diabetess数据集脚本示例训练这个新数据集,并将X和Y变量的值更改为
dataset = numpy.loadtxt("glass.csv", delimiter=",")
X = dataset[:,0:10]
Y = dataset[:,10]
以及神经元层到此
的值model = Sequential()
model.add(Dense(10, input_dim=10, init='uniform', activation='relu'))
model.add(Dense(10, init='uniform', activation='relu'))
model.add(Dense(1, init='uniform', activation='sigmoid'))
结果产生准确度= 32.71%
然后我将此数据集的输出列(最初为整数(1~7))更改为字符串(a~g),并通过对虹膜花数据集进行一些修改来使用示例的脚本
import numpy
from pandas import read_csv
from keras.models import Sequential
from keras.layers import Dense
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import StratifiedKFold
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
seed = 7
numpy.random.seed(seed)
dataframe = read_csv("glass.csv", header=None)
dataset = dataframe.values
X = dataset[:,0:10].astype(float)
Y = dataset[:,10]
encoder = LabelEncoder()
encoder.fit(Y)
encoded_Y = encoder.transform(Y)
def create_baseline():
model = Sequential()
model.add(Dense(10, input_dim=10, init='normal', activation='relu'))
model.add(Dense(1, init='normal', activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model_json = model.to_json()
with open("glass.json", "w") as json_file:
json_file.write(model_json)
model.save_weights('glass.h5')
return model
estimator = KerasClassifier(build_fn=create_baseline, nb_epoch=1000, batch_size=10, verbose=0)
kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=seed)
results = cross_val_score(estimator, X, encoded_Y, cv=kfold)
print("Baseline: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))
我没有使用' dummy_y'变量参考本教程:https://archive.ics.uci.edu/ml/datasets/Glass+Identification
我检查数据集是否使用字母作为输出,并认为我可以重复使用该脚本来训练我修改的新玻璃数据集。
这次结果变得像这样
基线:68.42%(3.03%)
从文章中,68%和3%表示模型准确度的均值和标准差。
我的第一个问题是我何时使用整数或字母作为输出列?当我们使用数据集进行调整时,例如将输出从整数更改为字符串/字母表,这种精确度结果是否常见?
我的第二个问题是我怎么知道每层需要放多少神经元?它与我在编译模型时使用的后端(Tensorflow或Theano)有关吗?
提前谢谢。
答案 0 :(得分:0)
第一个问题
没关系,正如你在这里看到的那样:
Y = range(10)
encoder = LabelEncoder()
encoder.fit(Y)
encoded_Y = encoder.transform(Y)
print encoded_Y
Y = ['a', 'b', 'c', 'd', 'e', 'f','g','h','i','j']
encoder = LabelEncoder()
encoder.fit(Y)
encoded_Y = encoder.transform(Y)
print encoded_Y
结果:
[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
这意味着您的分类器会看到完全相同的标签。
第二个问题
这个问题没有绝对正确的答案,但肯定不依赖于你的后端。
您应该尝试尝试不同数量的神经元,层数,层类型和所有其他网络参数,以便了解问题的最佳架构。 根据经验,您将获得良好的直觉,以及哪种参数更适合哪种类型的问题以及实验的良好方法。
最好的经验法则(假设您拥有维持此类策略所需的数据集)我已经听说过#34;让您的网络尽可能大,直到它过度适应,添加正规化直到它没有过度 - 重复"。
答案 1 :(得分:0)
每部分。首先,如果您的输出包含[0,5]的值,则为 使用S形激活不可能获得这一点。 S形函数的范围为[0,1]。您可以使用 激活=线性(不激活)。但是我认为这是一种不好的方法,因为您的问题不是估计连续值。
第二,您应该问自己的问题不是类型 您正在使用的数据(就如何存储 信息)。是字符串吗?是int吗?是浮标吗?确实 没关系,但是您必须问自己正在尝试哪种问题 解决。
在这种情况下,不应将问题视为回归 (估计一个连续值)。由于您的输出是分类的, 数字,但绝对。您确实要在以下两个方面进行分类: 玻璃类型:(类属性)。
进行分类问题时,以下配置为 “通常”使用:
该类通过一键编码进行编码。它不过是一个0的向量和对应类中的一个。
例如:3类(0个计数)并有6个类-> [0,0,0,1,0,0](与您所拥有的类一样多的零)。
正如您现在看到的,我们没有单个输出,您的模型必须与Y(6个类)一样作为输出。这样最后一层应该
具有与类一样多的神经元。 Dense (classes, ...).
您还对以下事实感兴趣:输出是属于每个类别的概率,即:p(y = class_0), ... p(y_class_n)。为此,使用了 softmax激活层, 这是为了确保所有概率的总和为1。
您必须更改 categorical_crossentropy 的损耗,以便它可以与softmax一起使用。并使用指标categorical_accuracy。
seed = 7
numpy.random.seed(seed)
dataframe = read_csv("glass.csv", header=None)
dataset = dataframe.values
X = dataset[:,0:10].astype(float)
Y = dataset[:,10]
encoder = LabelEncoder()
encoder.fit(Y)
from keras.utils import to_categorical
encoded_Y = to_categorical(encoder.transform(Y))
def create_baseline():
model = Sequential()
model.add(Dense(10, input_dim=10, init='normal', activation='relu'))
model.add(Dense(encoded_Y.shape[1], init='normal', activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['categorical_accuracy'])
model_json = model.to_json()
with open("glass.json", "w") as json_file:
json_file.write(model_json)
model.save_weights('glass.h5')
return model
model = create_baseline()
model.fit(X, encoded_Y, epochs=1000, batch_size=100)
神经元的数量不取决于您使用的后端。 但是,如果确实如此,您将永远不会获得相同的结果。那是 因为网络中有足够的随机过程: 初始化,退出(如果使用),批处理订单等。
已知的是,增加每个致密神经元的数量 使模型更加复杂,因此具有更大的潜力 代表您的问题,但更难学且更多 时间和计算上都很昂贵。这样你总是有 寻找平衡。
目前尚无明显证据表明它更好:
有些模型使用一种架构,而另一种使用另一种架构。
使用此架构,您将得到以下结果:
Epoch 1000/1000
214/214 [==============================] - 0s 17us/step - loss: 0.0777 - categorical_accuracy: 0.9953
Using this architecture you get the following result: