#encoding=utf-8
import numpy as np
from keras.models import Sequential
from keras.layers import Dense,Activation#激活函数可以通过设置单独的激活层实现,也可以在构造层对象时通过传递activation参数实现。
from  keras.optimizers import SGD#随机梯度下降法,支持动量参数,支持学习衰减率,支持Nesterov动量。

'''
快速开始序贯(Sequential)模型

序贯模型是多个网络层的线性堆叠,也就是“一条路走到黑”。

可以通过向Sequential模型传递一个layer的list来构造该模型:

from keras.models import Sequential
from keras.layers import Dense, Activation

model = Sequential([
Dense(32, units=784),
Activation('relu'),
Dense(10),
Activation('softmax'),
])

也可以通过.add()方法一个个的将layer加入模型中:

model = Sequential()
model.add(Dense(32, input_shape=(784,)))
model.add(Activation('relu'))

指定输入数据的shape

模型需要知道输入数据的shape,因此,Sequential的第一层需要接受一个关于输入数据shape的参数,
后面的各个层则可以自动的推导出中间数据的shape,因此不需要为每个层都指定这个参数。有几种方法来为第一层指定输入数据的shape
传递一个input_shape的关键字参数给第一层,input_shape是一个tuple类型的数据,其中也可以填入None,
如果填入None则表示此位置可能是任何正整数。数据的batch大小不应包含在其中。
有些2D层,如Dense,支持通过指定其输入维度input_dim来隐含的指定输入数据shape。
一些3D的时域层支持通过参数input_dim和input_length来指定输入shape。
如果你需要为输入指定一个固定大小的batch_size(常用于stateful RNN网络),
可以传递batch_size参数到一个层中,例如你想指定输入张量的batch大小是32,数据shape是(6,8),
则你需要传递batch_size=32和input_shape=(6,8)。

model = Sequential()
model.add(Dense(32, input_dim=784))

model = Sequential()
model.add(Dense(32, input_shape=784))


编译

在训练模型之前,我们需要通过compile来对学习过程进行配置。compile接收三个参数:

    优化器optimizer:该参数可指定为已预定义的优化器名,如rmsprop、adagrad,或一个Optimizer类的对象.

    损失函数loss:该参数为模型试图最小化的目标函数,它可为预定义的损失函数名,如categorical_crossentropy、mse,也可以为一个损失函数。详情见losses

    指标列表metrics:对分类问题,我们一般将该列表设置为metrics=['accuracy']。
    指标可以是一个预定义指标的名字,也可以是一个用户定制的函数.指标函数应该返回单个张量,
    或一个完成metric_name - > metric_value映射的字典


'''
def main():
    from sklearn.datasets import  load_iris
    iris = load_iris()
    print(iris["target"])
    from sklearn.preprocessing import LabelBinarizer
    print LabelBinarizer().fit_transform(iris["target"])

    from sklearn.model_selection import train_test_split
    train_data, test_data, train_traget, test_target = train_test_split(iris.data, iris.target, test_size=0.2,random_state=1)
    labels_train = LabelBinarizer().fit_transform(train_traget)
    labels_test = LabelBinarizer().fit_transform(test_target)

    model= Sequential([
        Dense(5,input_dim=4),
        Activation("relu"),#激活函数
        Dense(3),
        Activation("sigmoid"),#激活函数自己看去。

    ])

    sgd  = SGD(lr=0.01,decay=1e-6,momentum=0.9,nesterov=True)
    model.compile(optimizer=sgd,loss="categorical_crossentropy")
    model.fit(train_data,labels_train,nb_epoch=200,batch_size=40)
    print(model.predict_classes(test_data))
    model.save_weights("./python_source/w")
    model.load_weights("./python_source/w")
    #使用这个是会出现错误提示缺少h5py,直接pip install h5py 就可以了。
if __name__ == '__main__':
    main()