机器学习实战第二版---第五节:神经网络

环境搭建

使用anaconda搭建tensorflow2.0的环境,创建第一个模型,使用keras学习库中的序贯模型
1.了解keras


3.shape机器学习实战第二版---第五节:神经网络_第1张图片构建如下网络:机器学习实战第二版---第五节:神经网络_第2张图片

几个注意点:
1.在做输出层的选择上:创建模型后必须compile()方法来指定损失函数和要使用的优化器 交叉熵
MLP.compile(loss=‘sparse_categorical_crossentropy’,optimizer=‘SGD’,metrics=[‘accuracy’])
‘’’
用"sparse_categorical_crossentropy"损失,因为我们具有稀疏标签
(即对于每个实例,只有一个目标类索引,在这种情况下为0到9),并
且这些类是互斥的。相反,如果每个实例的每个类都有一个目标概率
(例如独热向量,[0.,0.,0.,1.,0.,0.,0.,0.,0.,0]代表类
3),则我们需要使用"categorical_crossentropy"损失。如果我们正
在执行二进制分类(带有一个或多个二进制标签),则在输出层中使
用"sigmoid"(即逻辑)激活函数,而不是"softmax"激活函数,并且使
用"binary_crossentropy"损失。

如果要将稀疏标签(即类索引)转换为独热向量标签,使用
keras.utils.to_categorical()函数。反之则使用np.argmax()函
数和axis=1

2.在模型训练上:
1.validation_split设置为希望Keras用于验证的训练
集的比率,而不是使用validation_data参数传递验证集。例如,
validation_split=0.1告诉Keras使用数据的最后10%(在乱序之前)
进行验证
2.在进行验证的时候可以不使用validation_data参数传递验证集。例如,
validation_split=0.1告诉Keras使用数据的最后10%(在乱序之前)
进行验证。
3.训练集非常不平衡,其中某些类的代表过多,而其他类的代表
不足,那么在调用fit()方法时设置class_weight参数会很有用,这
给代表性不足的类更大的权重,给代表过多的类更小的权重。

**最后结果:**可以明显看出整个曲线都在逐渐的趋于拟合,训练集和验证集的损失逐步减小,对于后续的调参后面专门出一期
机器学习实战第二版---第五节:神经网络_第3张图片

全部代码
如下:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Flatten
import pandas as pd
import matplotlib.pyplot as plt



fashion_mnist = keras.datasets.fashion_mnist
(X_train_full, y_train_full), (X_test, y_test) = fashion_mnist.load_data()
print(X_train_full.shape,X_test.dtype)
'''
创建验证集,将像素强度降低到0-1范围
'''
X_valid, X_train = X_train_full[:5000] / 255.0, X_train_full[5000:] / 255.0
y_valid, y_train = y_train_full[:5000], y_train_full[5000:]

class_names = ["T-shirt/top", "Trouser", "Pullover", "Dress", "Coat",
               "Sandal", "Shirt", "Sneaker", "Bag", "Ankle boot"]
print(class_names[y_train[100]])

'''
创建两个隐藏层地分类MLP
'''
MLP = keras.models.Sequential()#创建一个序贯模型,往里面加层数
MLP.add(Flatten(input_shape=[28,28]))#Flatten压平:多维度输入一维化,常用在从卷积层到全连接层的过渡
MLP.add(Dense(300,activation='relu'))#有300个神经元的Dense隐藏层。自己的权重矩阵,其中包含神经元及其输入之间的所有连接权重
MLP.add(Dense(100,activation='relu'))
MLP.add(Dense(10,activation="softmax"))
'''
或者以一个列表的形式添加
model = keras.models.Sequential([ 
    keras.layers.Flatten(input_shape=[28, 28]), 
    keras.layers.Dense(300, activation="relu"), 
    keras.layers.Dense(100, activation="relu"), 
    keras.layers.Dense(10, activation="softmax") 
]) 
'''
#查看模型的结构
MLP.summary()
#查看每一层
print(MLP.layers)
hidden1=MLP.layers[1]
print(hidden1.name)
#访问层的所有参数get_weights()和set_weights()
weights,bais=hidden1.get_weights()
print(weights,weights.shape)
print(bais)
'''
权重矩阵的形状取决于输入的个数。这就是在Sequential模型
中创建第一层时建议指定input_shape的原因。但是,如果你不指定输
入形状,那也是可以的:Keras会等到知道输入形状后才真正构建模
型。当你向其提供实际数据时(例如,在训练期间),或者在调用其
build()方法时,就会发生这种情况。

'''
#创建模型后必须compile()方法来指定损失函数和要使用的优化器 交叉熵
MLP.compile(loss='sparse_categorical_crossentropy',optimizer='SGD',metrics=['accuracy'])
'''
用"sparse_categorical_crossentropy"损失,因为我们具有稀疏标签
(即对于每个实例,只有一个目标类索引,在这种情况下为0到9),并
且这些类是互斥的。相反,如果每个实例的每个类都有一个目标概率
(例如独热向量,[0.,0.,0.,1.,0.,0.,0.,0.,0.,0]代表类
3),则我们需要使用"categorical_crossentropy"损失。如果我们正
在执行二进制分类(带有一个或多个二进制标签),则在输出层中使
用"sigmoid"(即逻辑)激活函数,而不是"softmax"激活函数,并且使
用"binary_crossentropy"损失。

如果要将稀疏标签(即类索引)转换为独热向量标签,使用
keras.utils.to_categorical()函数。反之则使用np.argmax()函
数和axis=1
'''
history =MLP.fit(X_train, y_train, epochs=30, validation_data=(X_valid,y_valid))
'''
1.validation_split设置为希望Keras用于验证的训练
集的比率,而不是使用validation_data参数传递验证集。例如,
validation_split=0.1告诉Keras使用数据的最后10%(在乱序之前)
进行验证
2.在进行验证的时候可以不使用validation_data参数传递验证集。例如,
validation_split=0.1告诉Keras使用数据的最后10%(在乱序之前)
进行验证。
3.训练集非常不平衡,其中某些类的代表过多,而其他类的代表
不足,那么在调用fit()方法时设置class_weight参数会很有用,这
给代表性不足的类更大的权重,给代表过多的类更小的权重。
'''
pd.DataFrame(history.history).plot(figsize=(8,5))
plt.grid(True)
plt.gca().set_ylim(0, 1) # set the vertical r
plt.show()
'''
可以使用evaluate()方法调节参数轻松
'''
``

你可能感兴趣的:(python,机器学习,神经网络,深度学习,pytorch)