java泛型+深度学习
jvav泛型
package java_learning;
import java_basic.Boy;
import java.util.ArrayList;
import java.util.Arrays;
public class generics {
public static void main(String[] args) {
ArrayList<Integer> arr1 =new ArrayList<Integer>(); //ArrayList是泛型的一种,什么是泛型?可以理解成cpp的“模板”,就是在<>中传入一种类型得到一种适配定义
//注意ArrayList使用Object数组实现存储的,因此必须是!!类!!而不能是基本数据类型(整数得用Integer而不是int)
arr1.add(2); //自动包装类转化
arr1.add(Integer.valueOf(2));
arr1.add(5);
for (int i:arr1){
System.out.println(i);
}
String[] s1=new String[]{"z","hel,","world!"};
Arrays.sort(s1); //Arrays工具类中有sort方法,对实现了 comparable<T>接口泛型的类可以自动排序
System.out.println(Arrays.toString(s1)); //Arrays的toString方法可以 !对每个元素!自动!调用toString()方法
Boy[] b1=new Boy[]{new Boy("大水桶",21),new Boy("小水桶",12),new Boy("老水桶",30)};
Arrays.sort(b1);
System.out.println(Arrays.toString(b1)); //我将Boy类实现了Comparable<Boy>接口,即在内部定义compareTo方法,并把年龄作为比较的关键,成功得到排序后结
generics g1=new generics();
//!!!类必须依附于实例,而类中类则必须依附于实例的实例,否则会报错xxx变量是非静态的!不能用于静态上下文
generics.pair<String,Integer> boy_pair=g1.new pair<String, Integer>("水桶王",21);
boy_pair.shout();
//pair<String,Integer> boy_pair=new pair<String, Integer>("水桶王",21);
}
public class pair<T,K>{
public T p_t;
public K p_k;
public pair(T p_t, K p_k) {
this.p_t = p_t;
this.p_k = p_k;
}
public T getP_t() {
System.out.println(p_t);
return p_t;
}
public K getP_k() {
System.out.println(p_k);
return p_k;
}
//public static<T,K> pair<T,K> shout(){} 默认是不能将模板类型用于static变量的(因为一般需要在外部实例化模板),但是你可以在static后面加一个<T,K>来强制使用
public void shout(){
System.out.println("%s,%d".formatted(this.p_t,this.p_k)); //格式化字符串必须用规定的 %s 占位符,不能用自定义的!泛型编程虽然编译器暂时无法识别泛型类型,但可以只用能够被格式化输出的类型
}
}
}
深度学习好久没看了,今天重新回顾了下ResNet
这回终于是看懂了,主要就是两点:1、通过1*1的卷积核来进行降维、升维操作,主要用在通道数很大的图像中,可以有效降低参数量 2、通过前向传递并与之前的矩阵进行相加,来有效避免梯度爆炸和消失的问题,极大的提高模型的深度
还学到了Batch Normalization批量正则化,通过对一批数据的同一通道进行标准化,使得每一层的数据都被标准化,有效降低数据大小、减少训练时间…
但是要注意3个问题
还有迁移学习:即预训练模型,预训练模型要注意数据的预处理方式应与预训练模型相一致